create table man( mid int primary key auto_increment, mname varchar(32), wid int unique ); create table woman( wid int primary key auto_increment, wname varchar(32) ); create teble dept( deptno int primary key auto_increment, dname varchar(32) ); create table student( cid int primary key auto_increment, sname varchar(32) ); insert into student (sname) values('小张'); insert into student (sname) values('小李'); insert into student (sname) values('小王'); create table course( sid int primary key auto_increment, cname varchar(32) ); insert into course (cname) values('语文'); insert into student (sname) values('数学'); insert into student (sname) values('英语'); insert into student (sname) values('化学'); create table s_c( cid int, sid int ); insert into s_c(sid, cid) values (1, 1); insert into s_c(sid, cid) values (1, 2); insert into s_c(sid, cid) values (1, 3); insert into s_c(sid, cid) values (1, 4); insert into s_c(sid, cid) values (2, 2); insert into s_c(sid, cid) values (2, 4); insert into s_c(sid, cid) values (3, 1); insert into s_c(sid, cid) values (3, 3); create table emp( empno int primary key auto_increment, ename varchar(32) ); create table dept( depeno int primary key auto_increment, dname varchar(32) ); select * from emp union select * from dept; select * from emp union all select * from dept;-- 员工表create table emp( empno int primary key auto_increment, # 员工编号 ename varchar(32), # 员工姓名 job varchar(32), # 员工职位 mgr int, # 上级编号 hiredate date, # 入职时间 sal double, # 薪资 comm double, # 奖金 deptno int # 员工所属部门);-- 部门表create table dept( deptno int primary key auto_increment, # 部门编号 dname varchar(32), # 部门名称 loc varchar(32) # 部门地址); SQL优化: 尽量使用多表查询 绝大部分的子查询在最终执行的时候都是转换成一个多表查询来执行的。 通过SQL的执行计划可以看出来 通过SQL执行计划会发现两种方式执行的一样的。- from 后面的子查询
需求:
查询员工号 姓名 薪资
select empno, ename, sal from emp;
- 一般不在子查询中进行排序
- 一般先执行子查询,再去执行主查询假设any内部的查询返回结果个数是三个,如: result1, result2, result3, 那么select .... from .... where a > any(....)->select .... from .... where a > result1 or a > result2 or a > result3需求: 查询工资比1号部门中任意一个员工高的员工信息 select * from emp where sal > any(select sal from emp where deptno = 1); select .... from .... where a > all(....) -> select .... from .... where a > result1 and a > result2 and a > result3 需求: 查询工资比1号部门中所有员工高的员工信息 select * from emp where sal > any(select sal from emp where deptno = 1); select * from emp where sal > all(select sal from emp where deptno = 1);some 关键字和 any 关键字是一样的功能,所以:select .... from .... where a > any(....)->select .... from .... where a > result1 or a > result2 or a > result3In 运算符用于where 表达式中,以列表项的形式支持多个选择,语法如下: where column in (v1, v2, v3 ....); where column not in (v1, v2, v3 ....); 当in 前面加上not 运算符时,表示与in 相反的意思,即不在这些列表项中选择。案例: 查询部门名称是人力部和研发部的员工select * from emp where deptno in (select deptno from dept where dname = '人力部' or dname = '研发部');原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。