1. 程式人生 > >MySQL高階查詢簡例

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)
)