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 TABLE dept_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 TABLE employees (
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 TABLE dept_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 TABLE employees (
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;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章