MySQL多表連接查詢
1.含義
當查詢中涉及到多個表的字段,需要使用多表查詢
select 字段1,字段2…
from 表1,表2…
笛卡爾積:當查詢多個表時,沒有添加有效的連接條件,導致多個表所有行實現完全連接
2.多表連接分類
2.1按sql語言分類
sql92標準:僅僅支持內連接
sql99標準:支持內連接+外連接(左外+右外)+交叉連接
2.2按功能分類
內連接:
1.等值連接 (sql99 inner join,sql92 where A.key=B.key)
2.非等值連接
3.自連接
外連接:
1.左外連接 left join
2.右外連接 right join
3.全外連接 full join
交叉連接(sql99語法的笛卡爾乘積) cross join
3.多表連接語法
3.1sql92語法
select 查詢列表
from 表1,表2
where 連接條件(表1.key=表2.key)
group by分組條件
having 分組後的篩選
order by 排序
limit(m,n) 排序後取從m行開始取值,取n行
注意連接條件:
等值連接 : where 表1.key=表2.key
非等值連接: where 非等值連接條件
自連接: where 自連接條件
說明:
自連接指的是同一個表的自連接
3.2sql99語法
交叉連接(sql99版的笛卡爾積)
語法:
select 查詢列表
from 表A cross join 表B
4.練習
1.內連接
牛客網mysql在線編程第四題
查找所有已經分配部門的員工的last_name和first_name以及dept_no(請注意輸出描述裏各個列的前後順序)
CREATE TABLEdept_emp
(
emp_no
int(11) NOT NULL,
dept_no
char(4) NOT NULL,
from_date
date NOT NULL,
to_date
date NOT NULL,
PRIMARY KEY (emp_no
,dept_no
));
CREATE TABLEemployees
(
emp_no
int(11) NOT NULL,
birth_date
date NOT NULL,
first_name
varchar(14) NOT NULL,
last_name
varchar(16) NOT NULL,
gender
char(1) NOT NULL,
hire_date
date NOT NULL,
PRIMARY KEY (emp_no
));
sql92參考示例:
select e.last_name,e.first_name,d.dept_no
from dept_emp as d,employees as e
where e.emp_no=d.emp_no;
sql99參考示例:
select e.last_name,e.first_name,d.dept_no
from dept_emp as d inner join employees as e
on e.emp_no=d.emp_no;
2.外連接
牛客網mysql在線編程第五題
查找所有員工的last_name和first_name以及對應部門編號dept_no,也包括暫時沒有分配具體部門的員工(請注意輸出描述裏各個列的前後順序)
CREATE TABLEdept_emp
(
emp_no
int(11) NOT NULL,
dept_no
char(4) NOT NULL,
from_date
date NOT NULL,
to_date
date NOT NULL,
PRIMARY KEY (emp_no
,dept_no
));
CREATE TABLEemployees
(
emp_no
int(11) NOT NULL,
birth_date
date NOT NULL,
first_name
varchar(14) NOT NULL,
last_name
varchar(16) NOT NULL,
gender
char(1) NOT NULL,
hire_date
date NOT NULL,
PRIMARY KEY (emp_no
));
左外連接參考示例:
select e.last_name,e.first_name,d.dept_no
from employees as e
left join dept_emp as d
on e.emp_no=d.emp_no;
右外連接參考示例:
select e.last_name,e.first_name,d.dept_no
from dept_emp as d
right join employees as e
on e.emp_no=d.emp_no;