男人表、女人表優化
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 = '研發部');