連接配接查詢
環境準備
-- 建立部門表
CREATE TABLE dept (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('開發部'),('市場部'),('财務部');
-- 建立員工表
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1), -- 性别
salary DOUBLE, -- 工資
join_date DATE, -- 入職日期
dept_id INT
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孫悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('豬八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
知識點-交叉查詢【了解】
1.目标
- 了解交叉查詢
2.分析
交叉查詢把若幹張表(>=2)沒有條件的連接配接在一起,進行展示
3.講解
- 文法
2.練習: 使用交叉查詢部門和員工
-- 練習: 使用交叉查詢部門和員工的所有資訊
select * from emp,dept;
select * from dept,emp;
select emp.*,dept.* from emp,dept;
-- 練習: 使用交叉查詢部門的名稱和員工id,名稱,salary,join_date資訊
select dept.name,emp.id,emp.name,emp.salary,emp.join_date from emp,dept;
-- 取别名
select d.name,e.id,e.name,e.salary,e.join_date from emp e,dept d;
以上資料其實是左表的每條資料和右表的每條資料組合。左表有3條,右表有5條,最終組合後3*5=15條資料。
左表的每條資料和右表的每條資料組合,這種效果稱為笛卡爾積
-内連接配接查詢【重點】
1.目标
- 掌握内連接配接查詢
2.分析
交叉查詢産生這樣的結果并不是我們想要的,那麼怎麼去除錯誤的,不想要的記錄呢,當然是通過條件過濾。通常要查詢的多個表之間都存在關聯關系,那麼就通過==關聯關系(主外鍵關系)==去除笛卡爾積。
3.講解
3.1 隐式内連接配接
隐式裡面是沒有inner關鍵字的
練習:查詢員工的id,姓名,性别,薪資,加入日期,所屬部門
結果
顯示内連接配接
顯示裡面是有inner關鍵字的
select ... from a [inner] join b on 連接配接條件 [ where 其它條件]
select * from emp inner join dept on emp.dept_id = dept.id
練習
查詢所有部門下的員工資訊,如果該部門下沒有員工則不展示.
-- 隐式内連接配接查詢
select * from emp e,dept d where e.dept_id = d.id;
-- 顯示内連接配接查詢
select * from emp e inner join dept d on e.dept_id = d.id;
小結
-
内連接配接的特點(查的是什麼東西)
内連接配接查詢的是公共部分,滿足連接配接條件(主外鍵關系)的部分
- 使用内連接配接的關鍵點
- 從表外鍵的值等于主表主鍵的值,過濾無用資料
- 顯示内連接配接裡面的,on隻能用主外鍵關聯作為條件,如果還有其它條件,後面加where
- 文法
-- 隐式(不出現inner)
select * from a,b where a.主鍵=b.外鍵 [and 其它條件]
-- 顯示(出現inner)
select * from a [inner] join b on a.主鍵=b.外鍵 [where 其它條件]