MySQL高階查詢簡例
多表查詢
1,內連線
1.1 等值連線
方式一:=
查詢所有員工的員工和部門資訊(查詢員工和部門的資訊)
select * from emp,dept
產生一個笛卡爾集
下面就是避免笛卡爾集的方式:等值條件
select * from emp,dept where emp.deptno = dept.deptno
方式二:join on
select *from emp join deptonemp.deptno = dept.deptno
方式二:inner join on
select *from emp inner join dept on emp.deptno = dept.deptno;
1.2 非等值連線
查詢所有員工的姓名和薪資等級資訊
select * from emp,salgrade where sal between salgrade.losal and salgrade.hisal
1.3 自連線
查詢每門課程的先修課名稱
select fir.*,sec.cname from course fir,course sec
where fir.cpno = sec.cno
查詢每門課程的間接先修課名稱(先修課的先修課)
select fir.cno,fir.cname,third.cno,third.cname from course fir,course sec,course third where fir.cpno = sec.cno and sec.cpno = third.cno 改造: select fir.cno,fir.cname,third.cno,third.cname from course fir inner join course sec on fir.cpno = sec.cno inner join course third on sec.cpno = third.cno 總結:內連線的特點 :求交集 select * from course select fir.*,sec.cname from course fir,course sec where fir.cpno = sec.cno
2,外連線
左外連線
查詢所有員工的部門資訊
select * from emp left join dept on emp.deptno = dept.deptno
右外連線
select * from emp right join dept on emp.deptno = dept.deptno;
select * from emp,dept where emp.deptno(+) = dept.deptno;(Oracle中可以如此,)
3,外來鍵
3.1 什麼是外來鍵
本質就是一種約束。
3.2 外來鍵的四個約束
3.3 外來鍵的條件
3.4 建立外來鍵
3.4.1 建表的同時建外來鍵
create table emp(
…
foreign key(外來鍵欄位) references dept(deptno)
)
3.4.2 建立表之後新增外來鍵
alter table emp add foreign key(deptno) references dept(deptno)
3.4.3刪除外來鍵:
語法:alter table 表名稱 drop foreign key 外來鍵名稱;
例:alter table empA drop foreign key empa_ibQk_1;
注意:如果沒有在建表的時候標明外來鍵名稱,可以通過:
show create table 表名 進⾏檢視外來鍵名稱;
4,子查詢
4.1 標量子查詢(子查詢的結果是1行1列)
查詢與egz同部門的員工資訊
select * from emp where deptno = egz的部門號相等
select * from emp where deptno =(select deptno from emp where ename='egz')
4.2 列子查詢(子查詢的結果是N行1列)
查詢與部門10工作崗位相同的員工資訊
select * from emp where empjob in (select empjob from emp where deptno = 10)
4.3 行子查詢(1行N列)
查詢與egz部門和崗位都相同的員工資訊
select * from emp where (deptno,empjob) = (select deptno,empjob from emp where ename='egz')
4.4 表子查詢(N行N列)
查詢與10號部門相同的崗位和上司的員工資訊
select * from emp where (empjob,mgr) in (select empjob, mgr from emp where deptno = 10)
5,exists 存在
select * from emp where deptno =10 and exists
(select * from dept where emp.deptno = dept.deptno and emp.deptno =20)
6, 派生表:子查詢查詢出來的表,叫虛表 放到from中就叫派生表
select emp.ename,emp.empjob,a.deptno,a.dname
from emp,(select deptno,dname from dept where deptno>10) a
where emp.deptno = a.deptno
7,union 與 union all
select * from emp
union
select * from emp
select * from emp
union all
select * from emp
select dept.* ,count(dept)from dept, emp;
select * from emp,dept where emp.deptno = dept.deptno;
select dept.deptno, dept.dname,dept.loc,count(empno) from emp ,dept where emp.deptno = dept.deptno group by deptno;
例項的表:
create table DEPT
(
DEPTNO int(2) not null primary key,
DNAME VARCHAR(14),
LOC VARCHAR(13)
)
create table EMP
(
EMPNO int(4) not null,
ENAME VARCHAR(10),
EMPJOB VARCHAR(9),
MGR int(4),
HIREDATE DATE,
SAL decimal(7,2),
COMM decimal(7,2),
DEPTNO int(2)
)
create table SALGRADE
(
GRADE int not null primary key,
LOSAL decimal(7,2),
HISAL decimal(7,2)
)