男人表、女人表优化
create table man(code
mid int primary key auto_increment, mname varchar(32), wid int unique
);排序
create table woman(ci
wid int primary key auto_increment, wname varchar(32)
);rem
员工表、部门表
create table emp(数学
empno int primary key auto_increment, ename varchar(32) deptno int
);io
create teble dept(table
deptno int primary key auto_increment, dname varchar(32)
);date
至少须要三张表select
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) # 部门地址 );
内链接
例如:
外链接
左外链接 LEFT OUTER JOIN | left join .... on
右外链接 right join | right outer join .... on
自链接
天然链接: natural join (join) | natural left join (同 left join) | natural right join (同 right join)
子查询解决的问题:
谁的薪资比张三高
定义
注意的问题:
主查询和子查询能够不是同一张表;只有子查询返回的值,主查询能够使用
需求:查询部门名称是人力部的员工信息
-- 第一种方式:利用子查询
select * from emp where deptno=(select deptno from dept where dname='人力部')
-- 第二种方式:利用关联查询
select * from emp e, dept d where e.deptno = d.deptno and d.dname = '人力部';
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);
ALL 关键字与 ANY 关键字相似,只不过把上面的or 改为 and
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 > result3
In 运算符用于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 = '研发部');