javawebday42(多表查询 内外连接 合并结果 基本习题练习 年度增长比)
2018-03-08 14:17
627 查看
多表查询 1、分类 合并结果集 连接查询 子查询 合并结果集 要求被合并的表中,列的类型和列数相同 UNION,去除重复行 UNION ALL 不去除重复行 SLECT * FROM cd UNION ALL 上面一个表不能加分号 SLECT * FROM cd; 连接查询 1、分类 内连接 外连接 左外连接 右外连接 全外连接(MySQL不支持) 自然连接(属于一种简化方式) 2、内连接 方言:SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.xx=别名2.xx 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx 自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2 内连接查询出来的所有记录都满足条件 3、外连接 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx 左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来,左表中不满足条件的记录,右表部分都为NULL 左外自然: SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 2 别名2 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx 右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来,右表中不满足条件的记录,左表部分都为NULL 右外自然: SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 2 别名2 全连接:可以使用UNION来完成全连接 子查询 查询中有查询(查看select关键字的个数) 1、出现的位置 where后作为条件存在 form后作为表存在(多行多列) 2、条件 单行单列 SELECT * FROM 表1 别名1 WHERE 列1(=、>、<、>=、<=、!=) (SELECT 列 FROM 表2 别名2 WHERE 条件) 多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [in,all,any] (SELECT 列 FROM 表2 别名2 WHERE 条件) 单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) in (SELECT 列1,列2 FROM 表2 别名2 WHERE 条件) 多行多列:SELECT * FROM 表1 别名1, (SELECT ...) 别名2 WHERE 条件
CREATE TABLE ab(a INT,b VARCHAR(50)); INSERT INTO ab VALUES(1,'1'); INSERT INTO ab VALUES(2,'2'); INSERT INTO ab VALUES(3,'3'); CREATE TABLE cd(c INT,d VARCHAR(50)); INSERT INTO cd VALUES(3,'3'); INSERT INTO cd VALUES(4,'4'); INSERT INTO cd VALUES(5,'5'); SELECT * FROM ab UNION ALL SELECT * FROM cd; SELECT * FROM emp,dept; 4*4=16 行数据 笛卡尔积 SELECT * FROM emp,dept WHERE emp.deptno = dept.deptno; /* 所有员工的姓名,工资 以及部门名称 */ SELECT emp.ename,emp.sal,dept.dname FROM emp,dept WHERE emp.deptno = dept.deptno; SELECT e.ename,e.sal,d.dname FROM emp e,dept d WHERE e.deptno = d.deptno; --------------------------------- SELECT e.ename,e.sal,d.dname FROM emp e INNER JOIN dept d ON e.deptno = d.deptno SELECT e.ename,e.sal,d.dname FROM emp e NATURAL JOIN dept d 会自动找匹配的自动加where条件 可读性差 /*外连接 外连接有一主一次,左外即左表为主 即emp为主,那么主表中所有的记录无论满足不满足条件,都打出来 当不满足条件时,右表部门使用NULL来补 */ SELECT e.ename ,e.sal,d.dname,e.deptno,IFNULL(d.deptno,'无部门') AS dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno; SELECT e.ename,e.sal,d.dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno SELECT e.ename,e.sal,d.dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno 也可以通过合并结果集完成全外 用union连接上面的左右外 SELECT e.ename,e.sal,d.dname FROM emp e FULL OUTER JOIN dept d ON e.deptno = d.deptno ----------------------------- /*查询本公司工资最高的员工的详细信息 聚合函数不能在where*/ SELECT MAX(sal) FROM emp; SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp); SELECT e.empno,e.ename FROM (SELECT * FROM emp WHERE deptno=30) e WHERE 条件 多行单列可以使用all SELECT * FROM emp WHERE sal>ALL (SELECT sal FROM emp WHERE deptno=30); SELECT * FROM emp WHERE (job,deptno) IN (SELECT job,deptno FROM emp WHERE ename='张三') /* 查处至少有一个员工的部门 显示部门编号、部门名称、部门位置、部门人数 列:d,deptno,d.dname,d.loc 部门人数 表: dept d,emp e 条件:e.deptno = d.deptno */ 直接count(*)不行会混乱 使用别名 SELECT d.*,z1.cnt FROM dept d,(SELECT deptno,COUNT(*) cnt FROM emp GROUP BY deptno) z1 WHERE d.deptno = z1.deptno; /* 列出所有员工的姓名以及其直接上级的姓名 列:员工姓名、上级姓名 表:emp e,emp m 条件 员工的mgr = 上级的empno */ 不能显示所有 需要左外 SELECT * FROM emp e,emp m; WHERE e.mgr=m.empno; SELECT e.ename,m.ename FROM emp e LEFT OUTER JOIN emp m ON e.magr=m.empno; /* 列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称 列:e.empno,e.ename,d.dname 表:emp e,emp m,dept d 条件 e.hiredate<m.hiredate 思路 1、先不查部门名称,只查部门编号 列:e.empno,e.ename,e.deptno 表:emp e,emp m 条件:e.mgr=m.empno,e.hiredate<m.hiredate */ SELECT e.empno,e.ename,e.deptno,e.hiredate,m.ename,m.hiredate FROM emp e,emp m WHERE e.mgr=m.empno AND e.hiredate<m.hiredate SELECT e.empno,e.ename,d.dname FROM emp e,emp m,dept d WHERE e.mgr=m.empno AND e.hiredate<m.hiredate AND e.deptno=d.deptno /* 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门 列:* 表:emp e,dept d 条件:e.deptno=d.deptno */ SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno /* 列出最低薪金大于15000的各种工作及从事此工作的员工人数 列:job,count(*) 表: emp e 条件: min(sal)>15000 分组:job */ SELECT job,COUNT(*) FROM emp e GROUP BY job HAVING MIN(sal)>15000 /* 列出在销售部工资的员工的姓名,假定不知道销售部的部门编号 列:e.ename 表 emp e, 条件:e.deptno=(通过dname查询出deptno) e.deptno=(select deptno from dept where dname='销售部'); */ SELECT * FROM emp e WHERE e.deptno(SELECT deptno FROM dept WHERE dname='销售部'); /* 列出新金高于公司平均薪金的所有员工信息,所在部门名称,上级领导,工资等级 列 * 表 emp e 条件 sal>(查询出公司的平均工资 */ SELECT e.*,d.dname,m.ename,s.grade FROM emp e ,dept d,emp m,salgrade s WHERE e.sal>(SELECT AVG(sal) FROM emp) AND e.deptno=d.deptno AND e.mgr = m.empno AND e.sal BETWEEN s.losal AND s.hisal SELECT e.*,d.dname,m.ename,s.grade FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno LEFT OUTER JOIN emp m ON e.mgr=m.empno LEFT OUTER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal WHERE e.sal>(SELECT AVG(sal) FROM emp); /* 列出与王五从事相同工作的所有与员工及部门名称 列:e.*,d.dname 表:emp e,dept d 条件:job=(查询出王五的工作) */ SELECT e.*,d.dname FROM emp e ,dept d WHERE e.deptno =d.deptno AND job=(SELECT job FROM emp WHERE ename='王五'); /* 列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称 列:e.ename,e.sal,d.dname 表:emp e,dept d 条件:sal>all(30部门薪金) */ SELECT e.ename,e.sal,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno AND sal>ALL(SELECT sal FROM emp WHERE deptno=30); /* 查出年份、利润、年度增长比 */ SELECT y1.*,IFNULL(CONCAT((y1.zz-y2.zz)/y2.zz*100,'%'),'0%') 增长比 FROM tb_year y1 LEFT OUTER JOIN tb_year y2 ON y1.year=y2.year+1; 比较隐秘的关联关系
相关文章推荐
- Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
- Java通过JDBC连接Oracle之后查询结果和在sqlplus查询结果不一样
- 重点:java后端直接连接数据库实现查询获取结果 jdbc
- MySQL多表查询合并结果union all,内连接查询
- Java 连接MYSQL基本操作 查询更新
- Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
- 第五章 单表查询,聚合函数查询,连接查询,子查询,合并查询结果,为表和字段取别名
- java利用jdbc连接数据库之获取查询结果集
- 反射技术将查询结果封装为对象_编写一个基本的连接池来实现连接的复用
- MySQL多表查询合并结果union all,内连接查询
- java根据后台查询结果合并list
- Java 基本方法连接数据库并且执行查询,你发现这个会有什么问题吗
- Java的MyBatis框架中实现多表连接查询和查询结果分页
- mysql常用基础操作语法(八)~~多表查询合并结果和内连接查询【命令行模式】
- java连接数据库(SQL Server、MySQL、Oracle)及基本查询
- Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
- Java连接MySQL数据库并查询结果
- Java连接MySQL数据库并查询结果
- 有关JAVA 显示SQL 查询结果的显示
- sql2005 内连接 外连接 交叉连接 查询 与联合查询(合并查询)