昨天写了一篇关于MySQL的简单单表查询的文章,但对于一个程序员来说,那些都是很基础的,单一的一个表在实际项目开发中基本上不会遇到。高级查询虽说也是基础,但相较于单表,高级查询的逻辑性更高,语句也更为复杂,更容易出错,在实际的开发中大量用到,由此掌握高级查询尤为重要。
如果想从多个表查询比较复杂的信息,就会使用高级查询实现。常见的高级查询包括多表连接查询、内连接查询、外连接查询与组合查询等。这里接上昨天的,使用2个表进行高级查询。2个以上的表格只是比2个表格多点内容,连接的方法是一样的,查询的时候多加要查询的字段和连接表自己也可以摸索出来。
本篇文章所用到的2个表详细:
1.内连接(INNER JOIN):
分为等值连接和非等值连接,使用等号"="、大于号">"或小于号"<"比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连结列值相等或一个表大于或小于另一个表的连结列值的记录。
eg.SELECT e.deptno,SUM(e.sal),d.dname FROM emp e INNER JOIN dept d ON e.deptno = d.deptno GROUP BY e.deptno;
SELECT e.*, d.* FROM emp e inner join dept d ON e.deptno < d.deptno;
2.外联结:
分为左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)
左外连接:将左表的所有记录与右表符合条件的记录,返回的结果除内连接的结果,还有左表不符合条件的记录,并在右表相应列中填NULL。
右外连接:左外连接相反,指将右表的所有记录与左表符合条件的记录,返回的结果除内连接的结果,还有右表不符合条件的记录,并在左表相应列中填NULL。
eg,SELECT e.deptno,SUM(e.sal),d.dname FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno GROUP BY e.deptno;
SELECT e.deptno,SUM(e.sal),d.dname FROM emp e RIGHT JOIN dept d ON e.deptno = d.deptno GROUP BY e.deptno;
这里要说明一下,INNER JOIN ... ON ...是99年的语法,还有一个也可以连接查询,直接用WHERE,这是92年的 语法,这两种在实际开发中都被大量使用 。查询结果也一样,相互转改也很简单,可根据自己的习惯来选择使用。上面的语句也可以改为用WHERE,如下:
eg.SELECT e.deptno,d.dname,SUM(e.sal) FROM emp e,dept d WHERE e.deptno = d.deptno GROUP BY e.deptno;
3.组合查询、子查询:
简单来说就是查询里面包含查询,而被包含的查询为子查询,可作为外层查询的条件或是 一个需要用到的连接表。不过一个查询语句查出来的结果有多少(大于0才有意义),即便是一个,也可以看作是一个虚拟的表。可重命名使用使之达到与本身存在的表相同的效果。
eg.SELECT ename,sal FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE dname="SALES");
SELECT xin.*,d.dname,d.loc FROM (SELECT deptno,SUM(sal),COUNT(*) FROM emp GROUP BY deptno) xin INNER JOIN
dept d ON xin.deptno = d.deptno;
顺便提一下关于重命名,这是在实际开发中经常会使用的,目的是为了让查询出的结果更容易被他人理解(因为建表的时候命名一般为英文,为了让更多人理解查询结果,一般重命名为中文),下面是一个比较好的例子,附带结果图;
eg.SELECT xin.deptno 部门编号,xin.sal_S 工资总计,xin.sal_A 平均工资,xin.emp_co 人数,
d.dname 部门名称,d.loc 部门所在 FROM (SELECT deptno,SUM(sal) sal_S,AVG(sal) sal_A ,COUNT(*) emp_co
FROM emp GROUP BY deptno)xin,dept d WHERE xin.deptno = d.deptno;
效果图:
关于having,简单来说可对查询结果进行过滤然后在显示,下面的例子对deptno进行分组,再过滤掉平均工资(avg_sa)在2000~2500区间外的数据在显示所要的结果。
eg.SELECT deptno,COUNT(*),SUM(sal),AVG(sal) avg_sal FROM emp GROUP BY deptno HAVING avg_sal
BETWEEN 2000 AND 2500;
4.分页查询:
可自定义每页显示多少条数据。LIMIT x,y。x为起始条目下标,从0开始,y为所要显示的条目数。
eg.SELECT * FROM emp ORDER BY deptno LIMIT 10,3;
从第11条数据开始,显示3条。