視覺化軟體navicat
目錄
-
多表查詢思路
-
視覺化軟體navicat
-
多表查詢練習題
內容
多表查詢思路
多表查詢的思路總共就兩種:
白嫖兩個表
獲取jason所在的部門名稱
子查詢
相當於是我們日常生活中解決問題的方式(一步步解決)
將一條SQL語句的查詢結果加括號當做另外一條SQL語句的查詢條件
先獲取jason的部門編號
將結果加括號作為查詢條件
連表操作
先將多張表拼接到一起,形成一張大表,然後基於單表查詢獲取資料
連表操作有四個關鍵字:
- inner join 內連線(只連線兩張表中有對應關係的資料)
- left join 左連線(以左表為基準,展示所有的資料,沒有對應項則用NULL填充)
- right join 右連線(以右表為基準,展示所有的資料,沒有對應項則用NULL填充)
- union 全連線(左右兩表資料全部展示,沒有對應項則用NULL填充)
獲取jason的部門編號
笛卡爾積
會將所有的資料全部對應一遍,效率低下
一條SQL語句的查詢結果,我們也可以看成是一張虛擬表
如果一條SQL語句中涉及到多張表的欄位名稱編寫,建議使用表名字首做區分
學會了連表操作之後,可以將N多張表拼接到一起(將兩張表拼接之後的結果起別名當做一張表使用,然後再去跟另外一張表拼接)
視覺化軟體之Navicat
Navicat可以充當很多資料庫軟體的客戶端,提供了圖形化介面能夠讓我們更加快速的操作資料庫
使用navicat編寫SQL,如果自動補全語句,那麼關鍵字都會變大寫
SQL語句註釋語法:快捷鍵與pycharm中的一致
多表查詢練習題
- 查詢所有的課程的名稱以及對應的任課老師姓名
- 先明確需要幾張表,course表,teacher表
- 大致查詢一些表中的資料情況
- 既然是多表查詢,那麼查詢思路,子查詢,連表操作(複雜的SQL需要兩者配合使用)
- 編寫完成後,使用美化功能,將SQL語句規範化
-- SELECT
-- course.cname,
-- teacher.tname
-- FROM
-- course
-- INNER JOIN teacher ON course.teacher_id = teacher.tid;
- 查詢平均成績大於八十分的同學的姓名和平均成績
- 先明確需要用到幾張表 student score
- 大致檢視一下兩張表裡面的資料
- 先獲取平均成績大於80分的學生資訊(按照student_id分組)
- select score.student_id,avg(num) as avg_num from score group by score.student_id having avg_num>80;
- 結果需要從兩個表裡面的獲取 ,student ,SQL語句執行之後的虛擬表
-- SELECT
-- student.sname,
-- t1.avg_num
-- FROM
-- student
-- INNER JOIN ( SELECT student_id, avg( num ) AS avg_num FROM score GROUP BY score.student_id HAVING avg_num > 80 ) AS t1 ON student.sid = t1.student_id;
- 查詢沒有報李平老師課的學生姓名
此題有兩種思路:第一種是正向查詢,第二種是反向查詢(先查所有報了李平老師課程的學生id 之後取反即可)
- 先明確需要用到幾張表,四張表
- 先查詢李平老師的編號
- select tid from teacher where tname='李平老師'
- 再查李平老師教授的課程編號
- select cid from course where teacher_id=(select tid from teacher where tname='李平老師')
- 根據課程編號,去score表中篩選出所有選了課程的學生編號
- select distinct student_id from score where course_id in (select cid from course where teacher_id=(select tid from teacher where tname='李平老師'));
- 根據學生編號去學生表中反向篩選出沒有報李平老師課程的學生姓名
-- SELECT
-- sname
-- FROM
-- student
-- WHERE
-- sid NOT IN ( SELECT DISTINCT student_id FROM score WHERE course_id IN ( SELECT cid FROM course WHERE teacher_id = ( SELECT tid FROM teacher WHERE tname = '李平老師' ) ) )
- 查詢沒有同時選修物理課程和體育課程的學生姓名
- 先明確需要用到幾張表 三張
- 先獲取物理課程和體育課程的編號
- select cid from course where cname in ('物理','體育');
- 再去分數表中篩選出選了物理和體育的資料(包含了選了一門和兩門 沒有選的就已經被排除了)
- select * from score where course_id in (select cid from course where cname in ('物理','體育'))
- 如何剔除選了兩門的資料(按照學生id分組 然後對課程計數即可)
- select student_id from score where course_id in (select cid from course where cname in ('物理','體育')) -- group by student_id HAVING count(course_id) = 1;
- 根據上述學生id號篩選出學生姓名
-- SELECT
-- sname
-- FROM
-- student
-- WHERE
-- sid IN (
-- SELECT -
- student_id
-- FROM
-- score
-- WHERE
-- course_id IN ( SELECT cid FROM course WHERE cname IN ( '物理', '體育' ) )
-- GROUP BY
-- student_id
-- HAVING
-- count( course_id ) = 1
-- )
- 查詢掛科超過兩門(包括兩門)的學生姓名和班級
- 先明確需要幾張表 三張表
- 先去score表中篩選出所有不及格的資料
- select * from score where num < 60;
- 如何篩選每個學生掛科的門數(按照學生id分組 對學科計數即可)
- select student_id from score where num < 60 group by student_id -- HAVING count(course_id) >= 2;
- 由於最終的結果需要取自兩張表,所以應該拼接
- select student.sname,class.caption from class inner join student on class.cid=student.class_id;
SELECT student.sname, class.caption FROM class INNER JOIN student ON class.cid = student.class_id WHERE student.sid IN ( SELECT student_id FROM score WHERE num < 60 GROUP BY student_id HAVING count( course_id ) >= 2 );