複雜mysql/多表查詢
阿新 • • 發佈:2022-11-29
目錄
多表查詢的兩種方法
方式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 )