#
摘要: 题目要求:银行业务调度系统模拟实现银行业务调度系统逻辑,具体需求如下:*银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。*有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。*异步随机生成各种类型的客户,生成各类型用户的概率比例为:VIP客户 :普通客户 :快速客户 = 1 :6 :3。*...
阅读全文
tomcat采用默认安装,要想tamcat直接绑定多个域名,这里我们需要修改配置文件:C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\server.xml
server.xml 的修改方式如下:
(一)多域名绑定
1.如果你要绑定网站,首先是要把tomcat的默认访问端口8080,修改成80
原始:
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />
修改后:
<Connector port="80" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />
其实这里就是把port:8080,修改成port:80就可以了,其他的参数不变
2.接下来就是重点了哈哈...
原始:
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" />
</Engine>
当然这里我把注释代码统统删除掉了,省的碍眼
修改后:
<Engine name="Catalina" defaultHost=www.abc.com>
<Host name="www.abc.com" appBase=="abcapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"
<Host name=www.cba.com appBase=="D:\cba" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" />
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" />
</Engine>
这里解释一下上面的配置
Engine 的 dafaultHost :表示访问该tomcat默认进入的主机,注意一定不能是localhost,不然别人通过你的ip访问,就会默认进入tomcat的管理界面.
Host 的 name:表示该主机绑定的域名,如果绑定localhost则可以通过在浏览器中输入localhost访问该Host.
Host的 appBase:表示该主机绑定的文件存放路径,可以使用相对路径或绝对路径.
按照上面的配置:
1.如果我在浏览器中输入http://localhost 则访问 C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\ROOT 下的网站
2.如果输入http://www.abc.com 则访问 C:\Program Files\Apache Software Foundation\Tomcat 5.5\abcapps\ROOT 下的网站
3.如果输入http://www.cba.com 则访问 D:\cba\ROOT 下的网站.
注意这里有一个ROOT目录需要创建,我们只要把网站放到相应的ROOT目录向下面,即可通过相应域名访问了.
这里面的参数还有很多,我也不是很清楚,不过这样做确实可以实现多域名绑定哈哈.而且网站页面修改了只要直接覆盖就可以了,tomcat可以自动更新类和页面,当然如果修改了web.xml或lib,则需要重启tomcat才可以.
(二)虚拟目录
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/cqq" docBase="f:\java\cqqapp" debug="0" reloadable="true" crossContext="true">
</Host>
其中,Host标记是用来配置虚拟主机的,就是可以多个域名指向一个tomcat,格式只要参考默认的就
可以了。
<context>是Host标记的子元素吧,表示一个虚拟目录,它主要有两个属性,path就相当于虚拟目录名字,
而 docbase则是具体的文件位置。在这里我的虚拟路径名称为cqq,实际上我的程序也就是html、jsp、
servlet都 放在了f:\java\cqqapp这个目录下了。
这样我就可以通过 http://127.0.0.1/cqq/ 访问我的这个虚拟目录了。
另外一种方法是:
配置两个站点
<Host name="www.xyz.com" debug="0" appBase="D:\Tomcat5.5\portal" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="D:/Tomcat5.5/portal" debug="0" reloadable="true"/>
</Host>
<Host name="www.abc.com" appBase="D:\Tomcat5.5\hxw"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="D:\Tomcat5.5\abc" debug="0" reloadable="true"/>
</Host>
这样设置以后,输入域名可以分别到两个站点
但由于没有指定默认站点,所以直接输入IP的时候,无法访问。
于是增加 D:\Tomcat5.5\conf\Catalina\localhost\ROOT.xml
内容如
<Context path="/" docBase="${catalina.home}/portal" debug="5" reloadable="true" crossContext="true">
</Context>
这样可以实现输入域名分别到个站点,输入IP就默认到D:/Tomcat5.5/portal这个站点
可是,可是,问题出现了
这两个站点启动相当消耗内存,TOMCAT内存设置我已经设到1400M了(再高TOMCAT5无法启动),所以不能同时启动三个应用。
数据库
.
.
test.html
..
<html>
<head><title>php_ajax联动下拉菜单</title>
<meta http-equiv="content-type" content="text/html;charset=gb2312">
<script language="javascript" src="ajax.js"></script>
<script language="javascript">
function query(){
var pid = document.getElementByIdx("bigClassName").value;
if(pid!=""){
createRequest('query.php?pid='+pid);
}
}
</script>
</head>
<body>
<form action="<?=$PHP_SELF?>?" name="class" method="get" >
<select name="bigClassName" id="bigClassName" onchange="query()">
<option value="">--选择大类--</option>
<?php
$link=mysql_connect("localhost","root","root");
mysql_select_db("sortclass") or die("没有此数据库!");
$sql="select cid,cname from class where pid=0";
mysql_query("set names gb2312");
$res=mysql_query($sql,$link);
while($result=mysql_fetch_assoc($res)){
echo "<option value='".$result["cid"]."'>".$result["cname"]."</option>";
}
?>
</select>
<select name="smallClassName" id="smallClassName">
<option value="">--选择小类--</option>
</select>
<input type="submit" value="提交" />
</form>
</body>
</html>
.
ajax.js
.
var http_request =
false;
function createRequest(url) {
//初始化对象并发出XMLHttpRequest请求
http_request =
false;
if (window.XMLHttpRequest) {
//Mozilla等其他浏览器
http_request =
new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType("text/xml");
}
}
else if (window.ActiveXObject) {
//IE浏览器
try {
http_request =
new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
http_request =
new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}
if (!http_request) {
alert("不能创建XMLHTTP实例!");
return false;
}
http_request.onreadystatechange = alertContents;
//指定响应方法
http_request.open("GET", url,
true);
//发出HTTP请求
http_request.send(
null);
}
function alertContents() {
//处理服务器返回的信息
if (http_request.readyState == 4) {
if (http_request.status == 200) {
var smallClassName=document.getElementByIdx("smallClassName");
var dataArray=[];
//alert(http_request.responseText);
myVariable=http_request.responseText;
//形如: 1,新闻中心;2,学习园地;
var stringArray = myVariable.split(";");
//以;分隔字符串
stringArray.pop();
//移除数组最后一个元素,stringArray[0]==1,新闻中心 stringArray[1]==2,学习园地
var len=stringArray.length;
for(var i=0;i<len;i++){
dataArray[i]= stringArray[i].split(",");
// 循环数据条数按,分割字符串
}
//alert(dataArray[1][0]);//返回 新闻中心
//初始化smallClassName的数据
smallClassName.length=0;
var alertOption=document.createElement_x("OPTION");
alertOption.value="";
alertOption.text="--选择小类--";
smallClassName.add(alertOption);
for(var j=0;j<len;j++){
//添加数据
var objOption=document.createElement_x("OPTION");
objOption.value = dataArray[j][0];
objOption.text = dataArray[j][1];
smallClassName.add(objOption);
}
}
else {
alert('您请求的页面发现错误');
}
}
}
..
query.php
..
<?php
error_reporting(E_ERROR|E_WARNING|E_PARSE);
$link=mysql_connect("localhost","root","root");
mysql_select_db("sortclass",$link) or die("no such database!");
//$GB2312string=iconv( 'UTF-8', 'gb2312//IGNORE' , $RequestAjaxString); //Ajax中先用encodeURIComponent对要提交的中文进行编码
mysql_query("set names gb2312");
$pid=$_GET[pid];
$res=mysql_query("select cid,cname from class where pid='$pid'",$link);
header('Content-type: text/html;charset=GB2312');
//指定发送数据的编码格式为GB2312
while($info=mysql_fetch_array($res)){
$str.=$info["cid"].",".$info["cname"];
$str.=";";
}
echo $str;
?>
1、什么是cookie?
0Cookie技术是一个非常有争议的技术,自经诞生它就成了广大网络用户和Web开发人员的一个争论焦点。有一些网络用户,甚至包括一些资深的Web专家也对它的产生和推广感到不满,这倒不是因为Cookie技术的功能太弱或别的技术性能上的原因,而仅仅是因为他们觉得Cookie的使用,对网络用户的隐私构成了危害。因为Cookie是由Web服务器保存在用户浏览器上的小文本文件,它包含有关用户的信息(如身份识别号码、密码、用户在Web站点上购物的方式或用户访问该站点的次数)。
那么Cookie技术究竟怎样呢?是否真的给网络用户带来了个人隐私的危害呢?还是让我们看了下面的内容,再做回答吧。
在WEB技术发展史上,Cookie技术的出现是一个重大的变革。最先是Netscape在它的Netscape Navigator 浏览器中引入了Cookie技术,从那时起,World Wide Web 协会就开始支持Cookie标准。以后又经过微软的大力推广(因为微软的IIS Web服务器所采用的ASP技术很大程度的使用了Cookie技术),即在微软的Internet Explorer浏览器中完全支持Cookie技术。到现在,绝大多数的浏览器都支持Cookie技术,或者至少兼容Cookie技术的使用。
按照Netscape官方文档中的定义,Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie是由Web服务器保存在用户浏览器上的小文件,它可以包含有关用户的信息(如身份识别号码、密码、用户在Web站点购物的方式或用户访问该站点的次数)。无论何时用户链接到服务器,Web站点都可以访问Cookie信息。
如果你使用的是windows系统,那么请打开C:\Documents and Settings\用户名\Cookies,你会发现该目录下有好多*.txt格式的小文件。那就是cookie文件。当然,在该目录下你也可能什么都发现不了,那时因为你新装了系统或者从未浏览过因特网,也或者你的浏览器禁用了cookie。否则该目录下总会有点东西的。
通俗地讲,浏览器用一个或多个限定的文件来支持Cookie。这些文件在使用Windows操作系统的机器上叫做Cookie文件,在Macintosh 机器上叫做magic Cookie 文件,这些文件被网站用来在上面存储Cookie数据。网站可以在这些Cookie文件中插入信息,这样对有些网络用户就有些副作用。有些用户认为这造成了对个人隐私的侵犯,更糟的是,有些人认为Cookie是对个人空间的侵占,而且会对用户的计算机带来安全性的危害。
目前有些Cookie是临时的,另一些则是持续的。临时的Cookie只在浏览器上保存一段规定的时间,一旦超过规定的时间该Cookie就会被系统清除。例如在PHP中Cookie被用来跟踪用户进程直到用户离开网站。持续的Cookie则保存在用户的Cookie文件中,下一次用户返回时,仍然可以对它进行调用。
在Cookie文件中保存Cookie,一些用户会过分地认为这将带来很大的问题。主要是有些用户担心Cookie会跟踪用户网上冲浪的习惯,譬如用户喜爱到那些类型的站点、爱从事些什么活动等。害怕这种个人信息一旦落入一些别有用心的家伙手中,那么个人也就可能成为一大堆广告垃圾的对象,甚至遭到意外的损害。不过,这种担心压根儿不会发生,因为网站以外的用户是无法跨过网站来获得Cookie信息的。所以想以这种目的来应用Cookie是不可能的。不过,由于一些用户错误的理解以及“以讹传讹”,一些浏览器开发商别无选择,只好作出相适的响应(例如Netscape Navigator4.0和Internet Explorer3.0都提供了屏蔽Cookie的选项)。个人认为,无风不起浪,如果网站程序员没有严谨思路的话,cookie确实也存在些许安全问题,不过这些瑕疵并不足以掩盖cookie的优秀品质,大多数人还是非常乐意使用它的。
对Cookie技术期待了这么久的结果是,迫使许多浏览器开发商在它们的浏览器中提供了对Cookie的灵活性控制功能。例如,目前的两大主流浏览器 Netscape Navigator 和 Internet Explorer是这样处理Cookie的:Netscape Navigator4.0不但可以接受Cookie进行警告,而且还可以屏蔽掉Cookie;InternetExplorer3.0也可以屏蔽 Cookie,但在Internet Explorer4.0中就只能进行接受警告而没有提供屏蔽选项,不过在Internet Explorer4.0之后的更新版本中又加入了屏蔽Cookie的功能选项。
此外,很多最新的技术甚至已经可以在不能屏蔽Cookie的浏览器上进行Cookie的屏蔽了。例如,可以通过将Cookie文件设置成不同的类型来限制 Cookie的使用。但是,非常不幸地是,要是你想完全屏蔽Cookie的话,肯定会因此拒绝许多的站点页面。因为当今已经有许多Web站点开发人员爱上了Cookie技术的强大功能,例如Session对象的使用就离不开Cookie的支持。
2、Cookie工作原理?
当客户访问某个基于PHP技术的网站时,在PHP中可以使用setcookie函数生成一个cookie,系统经处理把这个cookie发送到客户端并保存在C:\Documents and Settings\用户名\Cookies目录下。cookie是 HTTP标头的一部分, 因此setcookie函数必须在任何内容送到浏览器之前调用。这种限制与header()函数一样(如需了解head()函数,请自行查阅)。当客户再次访问该网站时,浏览器会自动把C:\Documents and Settings\用户名\Cookies目录下与该站点对应的cookie发送到服务器,服务器则把从客户端传来的cookie将自动地转化成一个 PHP变量。在PHP5中,客户端发来的cookie将被转换成全局变量。你可以通过$_COOKIE[‘xxx’]读取。
尽管今天仍有一些网络用户对于Cookie的争论乐此不倦,但是对于绝大多数的网络用户来说还是倾向于接受Cookie的。因此,我们尽可以放心地使用Cookie技术来开发我们的WEB页面。
3、Cookie常见函数
● SetCookie 函数创建了一个Cookie,并且把它附加在HTTP头的后面。必须注意的一点是:Cookie是HTTP协议头的一部分,用于浏览器和服务器之间传递信息,所以必须在任何属于HTML文件本身的内容输出之前调用SetCookie函数,调用该函数前即使有空格、空白行都不行。如果setCookie()认了第二,就没有哪个元素敢认第一。使用setcookie()函数的前提是客户浏览器支持cookie,如果客户将之禁用的话,setcookie()也就英雄无用武之地了。
int SetCookie(string name, string value, int expire, string path, string domain, int secure,bool httponly);
参数说明:
name;设置cookie变量的名称。
value;设置cookie的值。
expire;设置cookie过期时间。如果要把cookie保存为浏览器进程,即浏览器关闭后就失效。那么可以直接把expiretime设为0。 Eg:setcookie(“name”,”value”,0)。该参数不设置的话,关闭浏览器也能结束一个cookie。
path:表示web服务器上的目录,默认为被调用页面所在目录. 这里还有一点要说明的,比如你的站点有几个不同的目录(比如一个购物目录,一个论坛目录),那么如果只用不带路径的Cookie的话,在一个目录下的页面里设的Cookie在另一个目录的页面里是看不到的,也就是说,Cookie是面向路径的。实际上,即使没有指定路径,WEB服务器会自动传递当前的路径给浏览器的,指定路径会强制服务器使用设置的路径。解决这个问题的办法是在调用 SetCookie时加上路径和域名,域名的格式可以是“http://www.phpuser.com/”,也可是“.phpuser.com”。 SetCookie函数里表示value的部分,在传递时会自动被encode,也就是说,如果value的值是“test value”在传递时就变成了“test%20value”,跟URL的方法一样。当然,对于程序来说这是透明的,因为在PHP接收Cookie的值时会自动将其decode。
domain:cookie可以使用的域名,默认为被调用页面的域名。这个域名必须包含两个".",所以如果你指定你的顶级域名,你必须用 ".mydomain.com" 。设定域名后,必须采用该域名访问网站cookie才有效。如果你使用多个域名访问该页,那么这个地方可以为空或者访问这个cookie的域名都是一个域下面的。
secure:如果设为"1",表示cookie只能被用户的浏览器认为是安全的服务器所记住。
除了name之外所有的参数都是可选的。value,path,domain三个参数可以用空字符串""代换,表示没有设置;expire 和 secure两个参数是数值型的,可以用0表示。expire参数是一个标准的Unix时间标记,可以用time()或mktime()函数取得,以秒为单位。secure参数表示这个Cookie是否通过加密的HTTPS协议在网络上传输。
httponly:如果设为1,则表示cookie只能被http协议所使用,任何脚本语言,比如javascrīpt是不能获取PHP所创建的 cookie的,这就有效削弱了来自XSS的攻击。(注意了:这是PHP5才有的选项,咱也没有用过。看了官方手册尝试着翻译的,如有疑问,请参考官方手册。)
当前设置的Cookie不是立即生效的,而是要等到下一个页面或刷新后才能看到.这是由于在设置的这个页面里Cookie由服务器传递给客户浏览器,在下一个页面或刷新后浏览器才能把Cookie从客户的机器里取出传回服务器的原因。
小道消息
Cookie应用案例:
●创建一个cookie:
SetCookie()
●创建cookie数组:
其一:
SetCookie("CookieArray[]", "Value 1");
SetCookie("CookieArray[]", "Value 2");
其二:
SetCookie("CookieArray[0]", "Value 1");
SetCookie("CookieArray[1]", "Value 2");
● 接收和处理Cookie
PHP对Cookie的接收和处理的支持非常好,是完全自动的,跟GET,POST变量的原则一样,特别简单。
比如设置一个名为MyCookier的Cookie,PHP会自动从WEB服务器接收的HTTP头里把它分析出来,并形成一个可直接使用的全局变量,名为$_COOKIE[‘MyCookie’],这个变量的值就是Cookie的值。数组同样适用。
分别举例如下:(假设这些都在以前的页面里设置过了,并且仍然有效)
echo $_COOKIE[‘MyCookie’];
取出cookie数组的例子:
<?php
// 创建一个cookie数组
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");
// 页面刷新之后,用foreach提取cookie数组。
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $name => $value) {
echo "$name : $value <br />\n";
}
}
?>
就这么简单。
● 删除Cookie
要删除一个已经存在的Cookie,有两个办法:
1、调用只带有name参数的SetCookie,那么名为这个name的Cookie将被从关系户机上删掉;
setcookie(“MyCookie”); //删除MyCookie。
2、设置Cookie的失效时间为time()或time()-1//time()减多少没有关系啦,只要是过期时间就行//,那么这个Cookie在这个页面的浏览完之后就被删除了(其实是失效了)。例如:
setcookie(“MyCookie”,”Value”,time()-1); //删除MyCookie。
要注意的是,当一个Cookie被删除时,它的值在当前页在仍然有效的。
如果要把cookie保存为浏览器进程,即浏览器关闭后就失效。那么可以直接把expiretime设为0。例如:setcookie(“name”,”value”,0)。该参数不设置的话,关闭浏览器也能结束一个cookie。
Cookie注意事项
1、SetCookie()之前不能有任何html输出,它认了第二,没有哪个元素敢认第一,就是空格,空白行都不行。
2、SetCookie()后,你在当前页调用echo $_COOKIE["name"]不会有输出。必须刷新或到下一个页面才可以看到Cookie值。原因很简单。SetCookie()执行之后,往客户端发送一个cookie,你不刷新或浏览下一个页面,客户端怎么把cookie给你送回去呀?浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到 Cookie过期为止。
3、使用Cookie的限制。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个。 (这是书上看到的说法,应该是一个web站点能创建的Cookie不能超过30个吧,要不然,我机子里的cookie少说也上百了,请达人指教!)
4、Cookie是保存在客户端的,用户禁用了Cookie,你的Cookie自然也就没作用啦!现在的浏览器,每当咱发送一个Cookie给客户端,他就像看门狗一样给拦截住了,并询问用户是否允许Cookie进门。天,用户又不是专家,有几个人知道啥叫Cookie呀?搞不好都当病毒拒之门外了。
<?php
$im = imagecreatetruecolor(80,23);//创建画布
$bgcolor = imagecolorallocate($im,220,230,230);//调制背景色
$bordercolor = imagecolorallocate($im,0,0,255);//调制边框颜色
$tcolor = imagecolorallocate($im,255,0,0);
$green = imagecolorallocate($im,0,255,0);
imagefill($im,10,10,$bgcolor);//填充背景色
imagerectangle($im,1,1,79,22,$bordercolor);//绘制边框
for($i = 0;$i < 4; $i++){
$num_case = rand(0,2);//产生随机数0-2,根据数值的不同决定产生的是数字|小写|大写
switch($num_case){
case 0:$num = rand(48,57);break;//数字
case 1:$num = rand(65,90);break;//大写
default:$num = rand(97,122);//小写
}
$text[$i] = sprintf("%c",$num);//将随机产生的ASCII码转换为相应的字符
imagettftext($im,rand(10,20),rand(0,30),15*$i+5,20,$tcolor,"simkai.ttf",$text[$i]);//显示字符
}
for($i=0;$i<100;$i++){
imagesetpixel($im,rand(1,79),rand(1,22),$green);
}
session_start();
$_SESSION["ckcode"]=implode($text);
header("Content-type:image/png");//设置输出类型
imagepng($im);//输出图像
imagedestroy($im);
<html>
<head>
<script>
var flag = true;
function getNum(num){
if(!flag){
document.getElementById('res').value = '';
flag = true;
}
document.getElementById('res').value += num;
}
function getResult(){
var result = eval(document.getElementById('res').value);
document.getElementById('res').value = result;
flag = false;
}
</script>
</head>
<body>
<table border='1px' width='300px'>
<caption>计算器</caption>
<tr>
<td colspan='4'><input type='text' id='res' size=47></td>
</tr>
<tr>
<td><input type='button' value='1' style="width:75px" onclick="getNum(1)"></td>
<td><input type='button' value='2' style="width:75px" onclick="getNum(2)"></td>
<td><input type='button' value='3' style="width:75px" onclick="getNum(3)"></td>
<td><input type='button' value='+' style="width:75px" onclick="getNum('+')"></td>
</tr>
<tr>
<td><input type='button' value='4' style="width:75px" onclick="getNum(4)"></td>
<td><input type='button' value='5' style="width:75px" onclick="getNum(5)"></td>
<td><input type='button' value='6' style="width:75px" onclick="getNum(6)"></td>
<td><input type='button' value='-' style="width:75px" onclick="getNum('-')"></td>
</tr>
<tr>
<td><input type='button' value='7' style="width:75px" onclick="getNum(7)"></td>
<td><input type='button' value='8' style="width:75px" onclick="getNum(8)"></td>
<td><input type='button' value='9' style="width:75px" onclick="getNum(9)"></td>
<td><input type='button' value='*' style="width:75px" onclick="getNum('*')"></td>
</tr>
<tr>
<td><input type='button' value='0' style="width:75px" onclick="getNum(0)"></td>
<td><input type='button' value='.' style="width:75px" onclick="getNum('.')"></td>
<td><input type='button' value='=' style="width:75px" onclick="getResult()"></td>
<td><input type='button' value='/' style="width:75px" onclick="getNum('/')"></td>
</tr>
</table>
</body>
</html>
1、FORM标签enctype属性
表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,
这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;
只有使用了multipart/form-data,才能完整的传递文件数据
<form enctype="multipart/form-data" method="post" name="upform">
input标签 type 属性中的 "file"
<input name="upfile" type="file">
2、$_FILES 系统函数
$_FILES['myFile']['name'] 客户端文件的原名称。
$_FILES['myFile']['type'] 文件的 MIME 类型,例如"image/gif"。
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
$_FILES['myFile']['tmp_name'] 储存的临时文件名,一般是系统默认。
$_FILES['myFile']['error'] 该文件上传相关的错误代码。
3、move_uploaded_file函数
上传后移动文件到目标位置的函数
move_uploaded_file(临时文件,目标位置和文件名);
4、is_uploaded_file 函数
判断上传MIME类型的文件函数
关于用PHPExcel从数据库表导出到Excel表在网上查了好多关于这方面的资料,今天终于把这个问题解决了。我个人感觉 PHPExcel还是很好用的,首先到官方网站http://phpexcel.codeplex.com/下载最近版本的PHPExcel,解压后会发现里面有class、
Documentation、Tests三个文件夹和三个txt的日志文件,主要用到的是Class文件,而Tests主要是一些demo示例下面来介绍一下PHPExcel的简单用法,这里是与数据库连接的:首先,要包含PHPExcel.phprequire_once 'Classes/PHPExcel.php'; //路径根据自己实际项目的路径进行设置
$objPHPExcel = new PHPExcel(); //创建PHPExcel实例
//下面是对mysql数据库的连接
$conn = mysql_connect("localhost","root","") or die("数据库连接失败!"); mysql_select_db("image",$conn); //连接数据库
mysql_query("set names 'GBK'"); //转换字符编码
$sql = mysql_query("select * from test"); //查询sql语句
/*--------------设置表头信息------------------*/$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', 'ID编号')->setCellValue('B1', '月份')->setCellValue('C1', '产品一')->setCellValue('D1', '产品二')->setCellValue('E1', '产品三');/*--------------开始从数据库提取信息插入Excel表中------------------*/$i=2; //定义一个i变量,目的是在循环输出数据是控制行数
while($rs=mysql_fetch_array($sql)){$rm = iconv("GB2312","UTF-8",$rs[1]); //对字符进行编码将数据库里GB2312的中文字符转换成UTF-8格式
$objPHPExcel->setActiveSheetIndex(0)->setCellValue("A".$i, $rs[0])->setCellValue("B".$i, $rm)->setCellValue("C".$i, $rs[2])->setCellValue("D".$i, $rs[3])->setCellValue("E".$i, $rs[4]); $i++;}/*--------------下面是设置其他信息------------------*/$objPHPExcel->getActiveSheet()->setTitle('Example1'); //设置sheet的名称
$objPHPExcel->setActiveSheetIndex(0); //设置sheet的起始位置
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); //通过PHPExcel_IOFactory的写函数将上面数据写出来
$objWriter->save(str_replace('.php', '.xls', __FILE__)); //设置以什么格式保存,及保存位置
至此,一个完整的将mysql数据库里的信息用PHP导出Excel实例做完,可能在运行的时候会发生一些问题,如中文乱码,表头可能显示不出来,这是因为文件编码格式的原因,将文件编码设置成UTF-8就行了,在此我就不做太多解释了。二: PHPExcel从excel表导入到mysql数据库 error_reporting(E_ALL);
require './Common/Extend/Classes/PHPExcel.php';
require './Common/Extend/Classes/PHPExcel/Reader/Excel2007.php';
require './Common/Extend/Classes/PHPExcel/Reader/Excel5.php';
$info = $upload->getUploadFileInfo();
$filepath = "./Upimg/".$info[0][savename];
$PHPExcel = new PHPExcel();
$PHPReader = new PHPExcel_Reader_Excel2007();
$PHPExcel = $PHPReader->load($filepath);
$sheet = $PHPExcel->getActiveSheet();
$allCol=PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());
$allRow=$sheet->getHighestRow();
$M=new Model;
for($j=2;$j<=$allRow;$j++){
$a = $PHPExcel->getActiveSheet()->getCell("A".$j)->getValue();//获取A列的值
$b = $PHPExcel->getActiveSheet()->getCell("B".$j)->getValue();//获取B列的值
$c = $PHPExcel->getActiveSheet()->getCell("C".$j)->getValue();//获取C列的值
$d = $PHPExcel->getActiveSheet()->getCell("D".$j)->getValue();//获取D列的值
$e = $PHPExcel->getActiveSheet()->getCell("E".$j)->getValue();//获取E列的值
$f = $PHPExcel->getActiveSheet()->getCell("F".$j)->getValue();//获取F列的值
$g = $PHPExcel->getActiveSheet()->getCell("G".$j)->getValue();//获取G列的值
$h = $PHPExcel->getActiveSheet()->getCell("H".$j)->getValue();//获取X列的值
$i = $PHPExcel->getActiveSheet()->getCell("I".$j)->getValue();//获取I列的值
$jj = $PHPExcel->getActiveSheet()->getCell("J".$j)->getValue();//获取J列的值
$k = $PHPExcel->getActiveSheet()->getCell("K".$j)->getValue();//获取K列的值
$l = $PHPExcel->getActiveSheet()->getCell("L".$j)->getValue();//获取L列的值
$m = $PHPExcel->getActiveSheet()->getCell("M".$j)->getValue();//获取M列的值
$n = $PHPExcel->getActiveSheet()->getCell("N".$j)->getValue();//获取N列的值
$p = $PHPExcel->getActiveSheet()->getCell("P".$j)->getValue();//获取P列的值
$qq = $PHPExcel->getActiveSheet()->getCell("Q".$j)->getValue();//获取Q列的值
$r = $PHPExcel->getActiveSheet()->getCell("R".$j)->getValue();//获取R列的值
$sql="insert into law_constant(true_name,email,sex,birthday,certificate_num,first_date,law_firm_name,law_firm_address,lawer_xueli,professional,school,work_year,occup_language,word_experience,hobbies) values('".$c."','".$p."','".$d."','".$jj."','".$b."','".$e."','".$f."','".$h."','".$i."','".$k."','".$l."','".$m."','".$n."','".$qq."','".$r."');";
$res=$M->query($sql);
}
if($res[0]==''){
$this->success("导入数据库成功!",'__APP__/Lawerinfo/index');
}else{
$this->error("导入数据库失败!","__APP__/Lawerinfo/index");
}
}
}
}
我的学历不高,不过就是一个路上比比皆是的专科生而已,再加上家中没
有恒产,所以很早就出脱离学生单纯的生活,到处在为三餐温饱打拼。
在这十几年的工作历程中,只有在从事业务行销工作时让我的年收入达到
了千万,不仅有了进口豪华轿车,还拥有了独栋透天别墅,而当时我也不
过才三十岁左右。
今天在版面上看到有人批评业务工作的种种不是,其实我有着深刻的亲身
经历,当各位业务急先锋在市场上真枪实弹搏斗时,低声下气根本就是一
种太肤浅的形容词,请问有人被狗追过吗?有人被人家用扫把扫出来过吗
?如果没有,那我认为应该还需要再加强磨练一番。
我认为干业务的绝对不需要跟人低声下气,除非你愿意跟人低声下气;业
务工作是一个正正当当的职业,名片上印有响当当的头衔,不偷不抢没什
么好丢脸的;没有业务的招揽,再好的产品也出不了工厂大门;业务人员
的心中只有一句座右铭:成王败寇;业务员的人生是由他自己所定义的,
要住什么样的房子、开什么样的车子、等等,自己可以掌握,连老板都无
法为你定夺;业务员的养成不需要专门的科系来培训,但是的确需要一点
天生的傻劲。
我认为任何人都应该学习业务行销的技巧,因为你必须不断地推销你的理
念让别人接受,哪怕你是文书工作人员、程序设计师、美工、总机小姐、
乃至于董事长,我们每天都在推销我们的想法给别人,就像我老婆接受了
我的求婚推销一样,其实一点都不难,也没什么了不起,我们每天都在作
,祇是没有察觉而已。
所以说,千万不要再说不喜欢从事推销、我讨厌干业务,那是骗人的,事
实上我们每天都在作,就像我现在打字的这一篇文章一样,我在将我的想
法推销给你,你的反应只有四种:Yes、No、Yes But、No But,如此而已,
不要太排斥,因为我从来都不认为全世界的人会百分之百相信我,连上帝
都也有人反对,不是吗?
一些社会应对进退技巧或人格特质的确是可以被后天塑造出来的,这一点
我持肯定态度,因为我是一个极为渴望安静的人,我不喜欢一天到晚出门
奔波,常常喜欢自己静静地窝在一个小天地里作我感兴趣的事情,但是我
却被我以前的公司训练成超级业务高手,打破公司所有的历史纪录,这是
如何做到的呢?说穿了不稀奇,已经有人说过了, 什么卡内基、火凤凰.
....等等的,它的确有效,至少在我以及我周遭的同事身上发挥了作
用,而且屡试不爽,因为我也用在我的部属身上,真的蛮有效的。
但是我还是不快乐,因为我已经失去了自我价值,而追寻自我价值这件事
对于我而言又是一件很重要的人生大事,但是我还是去做了,原因很简单
,因为我娶妻生子,每个月付不完的帐单逼得我必须去做一大堆我不喜欢
的事情,甚至连我老婆也是一样,没什么好抱怨的,因为这就是人生,一
个非常真实在你我身边发生的事情,我在这个版面上看到好多人说如果景
气好转的话,他就要跳槽到比较具规模的公司去上班,唉,我就来说明一
下企业主的想法吧。
现在的我早已是一位公司负责人,我经常要陪客户应酬,推销我的产品及
服务,每个月要张罗员工薪资,遇到员工身体有病痛或是心情不佳,我还
得小心伺候,免得他一时之间突然离职,日常作业会陷入停顿,这一阵子
实在是很不景气,客户的预算大幅缩水不说,连决行的时程都一再往后延
,造成业务及生产单位极大的困扰。
然后一下子是下大雨,一下子淹水,搞得我都不知道该怎么办,在我的立
场来说(我要特别强调这是我作为老板的立场),每放一天假我就损失多
少钱,每泡掉一台计算机我就损失多钱,钱、钱、钱、钱、钱、钱、钱,通
通都要钱,我常在想说万一不幸有一天我垮台了,有多少员工会替这家公
司或这个事业来着想?
当景气还不错的时候,我得用很多花招来吸引这些所谓的人才,其中股票
选择权是我最反感的一件事情,我常想为什么我用我多年来辛苦存下来的
钱创办一个事业,而这些员工却要轻易跟我分享我辛苦的成果?
当景气变差的时候,就像是现在,有多少员工会念在当初曾经一起奋斗的
情谊呢?不会,因为我永远叫老板,你永远叫员工,这是千古以来无法保
持和谐的关系。
用比较感性的角度来看,与员工们朝夕相处共同奋斗,所以日久生情算大
家一份股份,这倒也无可厚非,但是刚面试就急着问说这家公司福利政策
如何?薪资待遇如何?的这些人,通常我都会请他们自己创业比较好,因
为这些问题永远没有办法找到平衡点。
如果用比较理性的角度来看,既然这个现实社会都是要用钱才能生存得下
去,那么废话就不要说太多,直接了当说明工作内容为何,期限到了的时
候该产出多少产品或是业绩,那这个样子的情况之下薪资及福利为何,我
想如此还比较节省彼此双方的时间。情?那就别闹了!
这些话听起来很刺耳,几乎所有的求职者听完一定会破口大骂,但是我只
能说这个就是绝大多数企业主的想法,这些基本上都是根据一个简单不过
的逻辑:「我一样每个月要花这么多钱来聘请员工作事情,我为什么没有
权利去选择那些已经有技巧、有经验,甚至于是有客户在手上的新人呢?
如果有一天这位员工表现突出,那么我就酌予提拔或奖励,再过一阵子,
当这位员工表现大不如前,或是突然出现了薪资待遇更便宜的高手来加入
公司,那我实在没有理由还要留着这位坐领高薪及福利的前朝重臣,却拒
绝掉一位这么价廉物美的新人。这位前朝重臣的丰功伟业呢?别傻了,老
板会回你一句话:我当初不是已经给了你相对的报酬吗?」
最刚开始的时候,台商找去大陆上班的台籍干部差不多都有三倍于台湾行
情的薪资,到了今天差不多已经掉到1.2倍而已了。台湾工厂的女工大
约一个月可以领个1.5~2万元,大陆工厂相同的工作却只需要600
~1000元人民币,但是生产出来的产品品质却都差不多。请问如果你
是老板,你会作何决定?当贸易商持续给你压力要求你降价,不然就要把
订单转给你认识的同业时,你的心情会好才奇怪!
各位可以不相信我所说的话,但是务必去查证一下我所讲的,如果没去过
大陆,那么趁失业中的空档前进一下东莞或是广州(大约只要准备三万元
就很够用了)。随便去一家工厂门口,从早上七点一直到下午六点,你会
发现到门口都有人排队想争取应征的机会,甚至贿赂门口警卫,为的是希
望获得一份300元起薪的现场操作员工作。
300元人民币大约等于1300元台币,当我从香港搭机回台湾,在机
场买了一瓶香水给我老婆,结帐时我才发现我花掉了两个大陆工厂新人的
一个月薪资所得,结果害得我整个人在飞机上心情都好不起来。
其实我蛮赞成神奇狮子文中的一些说法,在上海找一个什么工具软件都很
厉害的美工,一个月最高也只要4000元人民币(这已经是很高很高了
),比照到台湾的行情,没有7~8万,你大概别想请得到人。
前一阵子我有一些朋友应聘到大陆内地,而且是到大陆人开设的公司上班
,要我帮他恶补一下大陆文化,我才惊然发现我也快要被淘汰了,因为我
根本无法跟计算机沟通:中文输入法的问题!
先前我都没感觉到,那是因为我都是到台商公司去交货,碰到的计算机青一
色都是繁体中文的操作系统,这难不倒我,而且大陆员工都已经学会了仓
颉或是其它的输入法。但是大陆人开设的公司就只有简体中文的操作系统
了,这个时候换做是你,怎么办?
我要讲的意思是说接下来的二三十年,我们这一代或是下一代到底要跟谁
竞争?跟多少人竞争?我已经很慎重地在思考这个问题,各位想过没有?
我去了大陆这样子走马看花的逛了一下子,就觉得快活不下去了,各位的
危机意识到底在哪里?
大陆员工其实是相当糟糕的,几乎完全没有主动积极进取的精神,我看了
这么多公司工厂,只让我看到一个人会自己动脑筋想解决方案,这个就是
我们目前台湾员工的优势所在,但是能维持多久呢?
侏罗纪公园中很清晰的一句话:生命自会寻找出路!只要我们脑袋里确实
有料,其实企业老板是不太看学历的,有朝一日他必会回馈相当的报酬给
你。但如果你让老板觉得不放心你的时候,就算是需要作出违法的行为,
他还是会毅然下决心请你走路的。呆伯特这本书其实害了好多年轻人,这
是我的真实感觉。
最后谈到经验。经验是一种非常宝贵的人类资产,我绝对不会录用一个刚
出校门的年轻人,因为我曾经吃足了苦头,大学或大专资管资工科班毕业
,竟然还要我花费十几万元送去接受半个月的专业讲习训练,结训回来后
叫他们集思广益改写一个javascript,竟然在搞了一个星期之后跟我说这是
不可能写得出来的东西,然后在二个月之后的发薪日,因为香港机场罢工
我赶不回来(公司大小章刚好带在身上),以致晚了两天发薪水,这些新
人竟然就联合起来指着我说这是一家骗人的公司,当时那种情况,你认为
我的感觉会好吗?
后来我请一位朋友的小孩,帮我看一下系统分析纪录, 不到三个小时程序
就已经寄到我的电子邮件信箱了。这两者之间的差别在哪里 ?在经验!
这位朋友的小孩平时就在帮人家写案子,收费非常便宜,因为他把这件事
情当成是在作作业,练习练习,以便为将来出社会时找工作之用;而这些
花了大把钞票的国立大学大专同学,心中老是以为自己是全世界的重心,
一看到公司只有四十几坪,人没几个,听也没听说过,于是就....!
所以我现在宁愿用极高的薪资,来聘请一位二专毕业,但是拥有相当丰富
经验的人来帮我作事情,那些连接个电话留个信息在别人桌上的基本技巧
都不懂的人,我是绝对敬而远之的。
人类只是一种智商比较高级一点的动物,如果你常看Discovery或是国家地
理频道的话,你就会发现老年的动物最可怜,因为又不能狩猎,又不能保
卫家园,群体行动时还经常拖泥带水,影响整个行程进度,这是我们所谓
的动物界。其实我们人类也好不到哪里去,顶多批着一张道德的皮在身上
,当我们走进浴室衣服一脱掉,哪有什么不一样,眼、耳、鼻、口、四肢
、生殖器官...,差不多的啦!但是又为什么会出现圣人、先贤、总统
呢?因为脑袋里的东西不一样。
我们一辈子活在世上,无非就是要想尽办法来创造出被人家利用的价值。
如果我每天只被老板利用一个小时,但是老板没有我这一个小时的帮忙,
他就会赚不到钱,而且又找不到什么替代方案的话,那么我这一个小时就
会相当值钱,比如说我担任这家公司的技术总顾问。
反之如果我的被利用价值相当低,随便一个人或一套硬设备就可以取代
掉我,那么就算是我花了十几个小时,累得跟狗一样,老板还是会随时请
我走路,因为我没有被利用的价值,比如说我客户的一些总机小姐。
常常有很久没联络的朋友或客户突然打电话给我,霹雳啪啦的问了一大堆
问题,我也几哩呱啦地回答他们,生意就上门了,因为我有一些特定的印
象停留在他们的脑海中,凡是他们遇到这一方面的问题时,通常都会先来
问我,他们知道像这种事情找我准没错,这就是我个人独具的被利用价值
。 你的被利用价值在哪里?有多少?能持续产生新的价值吗?跟得上时代脉
动吗?
我想这才是老板最想了解的,其它的,我认为都不是重点。
愿共勉之!祝大家都能找到理想的工作! 主管欣賞的人 在職場上,苦勞不會成功,其實企業最欣賞的人才,是具有高度common sense的人,換句話說,就是要work hard,work smart,work happy,特質的A級人才。 努力工作≠績效 是不是最努力工作的人就一定受到主管賞識呢?
有三個檢視標準或許可以提供 大家做為一個參考:
Work Hard, Work Smart, Work Happy
你是不是很努力工作,但不快樂呢?這時或許可以檢核自己一下,工作的方式是不是夠smart?
在這裡跟大家分享一個故事,或許可以引發大家一些思考與想法。
小芬與小美畢業於某國立大學企管系,同時進入一家中型企業,擔任企劃專員的工作。小芬做事努力認真、守分務實,常常自動留下來為公司加班,工作到很晚才下班。
小美呢?只見她每天嘻嘻哈哈,工作輕鬆又愉快,每天都會主動去找主管聊天,給人一種跟主管感情很好的印象。
1年後,小美獲得主管升遷,委以重任,小芬則只獲得象徵性的加薪鼓勵。這讓小芬非常不平,認為小美工作又沒自己認真,只會逢迎拍主管馬屁,憑什麼考績反而比她好?而且還受到公司的重用。自己為公司付出許多,夙夜匪懈地工作,
反而落得一場空,於是遞了辭呈。
少了一根筋
就在小芬工作的最後一天,總經理找小芬晤談。剛好中秋節快到了,公司正在考慮該買什麼中秋禮送給客戶。總經理說,「小芬,可不可以請妳到南門巿場跑一趟,看看有沒有賣大閘蟹?」
小芬心裡很疑惑,不知道主管為什麼要她跑這一趟,因為這並不是她負責的工作啊!但她還是乖乖地依照主管的要求,搭計程車到南門巿場。過了20分鐘,小芬回到辦公室,向總經理報告,「南門巿場有賣大閘蟹。」
總經理接著問她,「南門巿場的大閘蟹怎麼賣?算斤?還是算隻?」小芬一臉茫然,無法回答。於是又跑了一趟南門巿場,30分鐘後又回來報告,「南門巿場大閘蟹算隻賣,每隻350元。」
總經理聽了之後,當著小芬的面,把小美找了進來,並吩咐小美,「麻煩妳到南門巿場去一趟,看看有沒有賣大閘蟹?」
小美馬上問總經理,「請問大閘蟹是有什麼用途嗎?」
總經理回答她,「中秋節快到了,打算送客戶大閘蟹做為中秋賀禮。」
小美立即出門。過了1個多小時,小美回來了。
一進門,就見她眉飛色舞地拎著兩隻大閘蟹。向總經理報告,「南門巿場有兩家攤位賣大閘蟹。第一家的大閘蟹,每隻平均4兩重,每隻賣350元。第二家的大閘蟹,每隻平均6兩重,一隻550元。我建議,如果總經理自家食用可以買4兩重的,肚白、背綠、金毛,看起來很新鮮。如果總經理要送人,我建議買6兩重的,看起來比較有份量。我各買了一隻帶回來給總經理參考。」
做事Smart有方法
聽完小美的報告之後,總經理轉頭問小芬,「妳看出妳們之間有什麼不同了嗎?」小芬一副恍然大悟的神情,趕忙點頭表示她明白了!
總經理向小芬進一步說明,「一樣是去南門巿場看看有沒有賣大閘蟹,妳們蒐集回來的巿場情報與態度截然不同。小芬,妳很認真沒有錯,但是妳並沒有思考這項任務的需求是什麼?只是一個口令一個動作,得來來回回好幾趟才能把一件事情做好。而小美呢?不用我多交待,一次就把事情搞定,她不僅蒐集了完整的巿場情報,甚至也提出建議與分析,協助我做為判斷的參考。」
苦勞不會成功
小芬聽了不禁自慚形穢,她最感慚愧的是,為何她與小美是最好的同學,居然沒有學習小美的做事優點,暗地嫉妒她。同時她也很謝謝總經理為她上了一堂寶貴的一課,點醒她的負面思維。
在職場上,苦勞不會成功,其實企業最欣賞的人才,是具有高度common sense的人,換句話說,就是要有work hard, work smart, work happy特質的A級人才。這樣的人才能快速掌握主管的需求與期待,為公司開創更大的格局。
The race is not to the swift or the battle to the strong, nor does food come to wise or wealth to the brilliant or favor to the learned: but time and chance happen to them all.
快跑的未必能贏,力戰的未必得勝;
智慧的未必得糧食,明哲的未必得資財,靈巧的未必得喜悅;
所臨到眾人的,是因為「時間」與「機會」。
親愛的好友們!你們學到了嗎?
你我是不是只懂得做個『努力工作、認真、守分務實』的人呢?
对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过文氏图 Venn diagrams 解释了SQL的Join。我觉得清楚易懂,转过来。
假设我们有两张表。Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所示:让我们看看不同JOIN的不同
A表 |
id | name |
1 | Pirate |
2 | Monkey |
3 | Ninja |
4 | Spaghetti |
B表 |
id | name |
1 | Rutabaga |
2 | Pirate |
3 | Darth Vade |
4 | Ninja |
1.INNER JOIN
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
结果集 |
(TableA.) | (TableB.) |
id | name | id | name |
1 | Pirate | 2 | Pirate |
3 | Ninja | 4 | Ninja |
Inner join 产生的结果集中,是A和B的交集。
2.FULL [OUTER] JOIN
(1)
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
结果集 |
(TableA.) | (TableB.) |
id | name | id | name |
1 | Pirate | 2 | Pirate |
2 | Monkey | null | null |
3 | Ninja | 4 | Ninja |
4 | Spaghetti | null | null |
null | null | 1 | Rutabaga |
null | null | 3 | Darth Vade |
Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。
可以使用IFNULL判断。
(2)
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null OR TableB.id IS null
结果集 |
(TableA.) | (TableB.) |
id | name | id | name |
2 | Monkey | null | null |
4 | Spaghetti | null | null |
null | null | 1 | Rutabaga |
null | null | 3 | Darth Vade |
产生A表和B表没有交集的数据集。
3.LEFT [OUTER] JOIN
(1)
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
结果集 |
(TableA.) | (TableB.) |
id | name | id | name |
1 | Pirate | 2 | Pirate |
2 | Monkey | null | null |
3 | Ninja | 4 | Ninja |
4 | Spaghetti | null | null |
Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
(2)
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.nameWHERE TableB.id IS null
结果集 |
(TableA.) | (TableB.) |
id | name | id | name |
2 | Monkey | null | null |
4 | Spaghetti | null | null |
产生在A表中有而在B表中没有的集合。
4.RIGHT [OUTER] JOIN
RIGHT OUTER JOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。
5.UNION 与 UNION ALL
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。
(1)SELECT name FROM TableA UNION SELECT name FROM TableB
新结果集 |
name |
Pirate |
Monkey |
Ninja |
Spaghetti |
Rutabaga |
Darth Vade |
选取不同值
(2)SELECT name FROM TableA UNION ALL SELECT name FROM TableB
新结果集 |
name |
Pirate |
Monkey |
Ninja |
Spaghetti |
Rutabaga |
Pirate |
Darth Vade |
Ninja |
全部列出来
(3)注意:
SELECT * FROM TableA UNION SELECT * FROM TableB
新结果集 |
id | name |
1 | Pirate |
2 | Monkey |
3 | Ninja |
4 | Spaghetti |
1 | Rutabaga |
2 | Pirate |
3 | Darth Vade |
4 | Ninja |
由于 id 1 Pirate 与 id 2 Pirate 并不相同,不合并
还需要注册的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:SELECT * FROM TableA CROSS JOIN TableB
这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。