1. 程式人生 > 其它 >複雜mysql/多表查詢

複雜mysql/多表查詢

目錄

多表查詢的兩種方法

方式1:連表操作
inner join  內連線
select * from l1 inner join l2 on l1.l2_id = l2.id;
# 表 l1 內連線 表 l2 連線條件是 l1的欄位L2_ID = L2的欄位id


left join 左連線
select * from l1 left join l2 on l1.l2_id = l2.id;
# 表 l1 內連線 表 l2 連線條件是 l1的欄位L2_ID = L2的欄位id
# 左連線是已 左表l1 顯示為準 右表沒有則用null 空填充

左連線:保證左表資料可以全部顯示 

右連結:可以保證右表全部顯示


right join 右連結
select * from l1 right join l2 on l1.l2_id = l2.id
# 表 l1 內連線 表 l2 連線條件是 l1的欄位L2_ID = L2的欄位id
# 右連線是已 右表l2 顯示為準 左表沒有則用null 空填充


union  全連線
select * from l1 left join l2 on l1.l2_id = l2.id;
union
select * from l1 right join l2 on l1.l2_id = l2.id;

將左右連線全部生效 展示兩個表的所有資料 各自沒有的全部用null填充

'''
學會了連表操作之後也就可以連線N多張表
思路: 將拼接之後的表起別名 然後當做一張表 再去連線其他表,依次反覆可以達到3 4 5表連線
'''
 

方式2:子查詢
將一條sql語句用括號括起來   可以當成另外一條SQL語句的查詢條件
題目:求姓名是jason的員工部門名稱
# 子查詢類似我們生活中解決問題的方式 分步操作

步驟1:先根據 jason 獲取到部門編號
select l1_id from l2 where name = 'jason'

步驟2:在根據部門編號 獲得部門名稱 
select name from l1 where id = (select l1_id from l2 where name = 'jason');

# 這樣就獲得了 jason的部門名稱

'''
很多時候多表查詢需要結合實際情況判斷用哪種  更多時候甚至是相互配合使用
'''

sql語句基礎語法補充

concat / existe / 表字段 增加 修改 刪除

1.concat
concat 用於展示分組之前的欄位拼接

select concat(name,'|',password) from l1;

+---------------------+
| concat(id,'|',name) |
+---------------------+
| 200|技術            |
| 201|人力資源        |
+---------------------+

可以把需要展示的資料拼接進行展示

多欄位拼接可以使用  concat_ws 方法 因為這樣就不需要輸入多個字元
select concat_ws('|',id,name,age,sex) from l1;
# 意思 使用'|'拼接所有欄位
# 得到結果  10001|張無忌|18|男



2.existe
sql語句1 existe sql語句2
只有當sql語句成立成功執行的情況下才會執行sql語句1 
否則不執行sql語句1 返回空資料
類似一點點 python語法中的if 

3.修改表名
alter table l1 rename l2;

4.新增表字段
alter table 表名 add 新增欄位名 欄位型別 欄位約束
alter table l1 add name char(4) unique;

5.修改表字段資訊
alter table 表名 change 舊欄位名 新欄位名 欄位型別 約束條件;
# 修改欄位資訊 比如 原欄位名 name 型別 char 條件 非空
# 新欄位名 age 型別 char 條件不填寫,預設是會只修改欄位名
# 欄位型別 約束條件等 沒有修改的還是會保留下來的 

6.刪除欄位
alter table 表名 drop 欄位名;
alter table l1 drop age;


複雜sql練習題

"""
編寫複雜的SQL不要想著一口氣寫完
	一定要先明確思路 然後一步步寫一步步查一步步補
"""
1、查詢所有的課程的名稱以及對應的任課老師姓名
SELECT cname,tname FROM course INNER JOIN  teacher on course.teacher_id = teacher.tid;

4、查詢平均成績大於八十分的同學的姓名和平均成績
SELECT
student.sname,
T1.AVG_NUM 
FROM
student
INNER JOIN ( SELECT student_id, avg( num ) AS AVG_NUM FROM score GROUP BY student_id HAVING AVG_NUM > 80 ) AS T1 ON student.SID = T1.student_id;

7、查詢沒有報李平老師課的學生姓名
SELECT
	student.sname 
FROM
	student 
WHERE
	student.class_id NOT IN (
	SELECT DISTINCT
		score.student_id 
	FROM
		score 
	WHERE
		score.course_id IN (
		SELECT
			course.cid 
		FROM
			course 
		WHERE
		course.teacher_id = ( SELECT teacher.tid FROM teacher WHERE teacher.tname = '李平老師' )));

8、查詢沒有同時選修物理課程和體育課程的學生姓名
SELECT
	student.sname 
FROM
	student 
WHERE
	student.sid IN (
	SELECT
		score.student_id 
	FROM
		score 
	WHERE
		score.course_id IN (
		SELECT
			course.cid 
		FROM
			course 
		WHERE
		course.cname IN ( '物理', '體育' )) 
	GROUP BY
		score.student_id 
	HAVING
		COUNT( course_id ) = 1 
	);
9、查詢掛科超過兩門(包括兩門)的學生姓名和班級
SELECT student_id,  FROM score WHERE score.num < 60 GROUP BY student_id HAVING COUNT(course_id)  >= 2;
SELECT
	student.sname,
	class.caption 
FROM
	student
	INNER JOIN class ON student.class_id = class.cid 
WHERE
	student.sid IN (SELECT student_id FROM score WHERE score.num < 60 GROUP BY student_id HAVING COUNT( course_id ) >= 2 )