多表聯合查詢
多表聯合查詢可以通過連接運算實現,而連接運算又可以通過廣義笛卡爾積後在進行選擇運算來實現。
Select 多表聯合查詢語句
Select 列名 [[,列名]...] from 表名1,表名2,,... Where 查詢條件;
可以使用as爲表或者字段(屬性)取別名;
Select 列名 [[,列名]...] from 表名1 [as] 別名1,表名2 [as} 別名2,,... Where 查詢條件;
Select 列名1 [as] 列別名1 [[,列名2 [as] 列別名2]...] from 表名1 [as] 表別名1,表名2 [as] 表別名2,,... Where 查詢條件;
“[]”表示其中的內容可以省略;
查詢條件中要包含連接條件,通過不同的連接條件可以實現等值連接、不等值連接等各種連接。
示例:
原表數據:
學生表 student
老師表 teacher:
課程表 course:
選課表 student_course:
1 按“0001”號課程成績由高到低順序顯示所有學生學號、姓名、成績(二表連接);
SELECT
student.student_id,
student.student_name,
student_course.score
FROM
student,
student_course
WHERE
student.student_id = student_course.student_id
AND student_course.course_id = '0001'
ORDER BY
student_course.score DESC;
當兩個(多個)表中有相同的字段(屬性,列名)時,使用表名(或表別名).列名的形式對查詢內容和條件內容進行區分。
運行結果:
2 按“高等數學”課程成績由高到低順序顯示所有學生姓名、學號、分數、課程名(三表連接);
SELECT
st.student_id,
st.student_name,
sc.score,
co.course_name
FROM
student AS st,
student_course AS sc,
course AS co
WHERE
st.student_id = sc.student_id
AND sc.course_id = co.course_id
AND co.course_name = '高等數學'
ORDER BY
sc.score DESC;
運行結果:
3 查詢有薪水差額的任意兩位教師(單表連接查詢);
SELECT
t1.teacher_id AS '教工號1',
t1.teacher_name AS '教師姓名1',
t2.teacher_id AS '教工號2',
t2.teacher_name AS '教師姓名2'
FROM
teacher t1,
teacher t2
WHERE
t1.teacher_salary > t2.teacher_salary;
運行結果:
(數據較多,這裏只顯示一部分)
4 查詢既學過“0001”又學過“0002”號課程的所有學生學號;
SELECT
sc1.student_id '學號'
FROM
student_course sc1,
student_course sc2
WHERE
sc1.student_id = sc2.student_id
AND sc1.course_id = '0001'
AND sc2.course_id = '0002';
運行結果:
5 查詢“0001”號課程比“0002”號課程成績低的所有學生學號姓名;
SELECT
st.student_id '學號',
st.student_name '姓名'
FROM
student_course sc1,
student_course sc2,
student st
WHERE
sc1.student_id = sc2.student_id
AND sc1.student_id = st.student_id
AND sc1.course_id = '0001'
AND sc2.course_id = '0002'
AND sc1.score < sc2.score;
運行結果: