一.使用比較運算符的子查詢
SELECT * FROM employee WHERE
dept_no =(SELECT d_no FROM dept WHERE d_location='BeiJing')
1.使用IN子查詢
使用IN關鍵字進行子查詢是,內(nèi)層查詢語句僅僅返回一個數(shù)據(jù)列,這個數(shù)據(jù)列里的值將提供給外層查詢語句進行比較。
--IN
SELECT * FROM employee WHERE dept_no IN(SELECT d_no FROM dept WHERE d_location='BeiJing')
--NOT IN
SELECT * FROM employee WHERE dept_no NOT IN(SELECT d_no FROM dept WHERE d_location='BeiJing')
2.使用ANY的子查詢
通常使用比較運算符來連接ANY得到的結果,它可以用于比較某一列的值是否全部都大于ANY后面子查詢中查詢的最小值,或者小于ANY后面子查詢中的最大值。
--只要滿足內(nèi)層查詢中的一個條件,就能查出來
SELECT * FROM employee WHERE e_salary>ANY
(SELECT e_salary FROM employee WHERE dept_no IN(SELECT d_no FROM dept WHERE d_location='BeiJing')) AND dept_no=20
3.使用ALL的子查詢
使用ALL時需要同時滿足所有內(nèi)層查詢的條件。
--查出的數(shù)據(jù)需要滿足內(nèi)層查詢中所有條件
SELECT * FROM employee WHERE e_salary>ALL
(SELECT e_salary FROM employee WHERE dept_no IN(SELECT d_no FROM dept WHERE d_name='SALES')) AND dept_no=20
4.使用EXISTS的子查詢
EXISTS關鍵字代表‘存在’的意思,子查詢不為空,則返回TRUE,此時外層查詢語句將進行查詢,否正返回FALSE,外層查詢將不進行查詢。
EXISTS和NOT EXISTS的結果只取決于是否會返回行,而不在于這些行的內(nèi)容,所以這個子查詢輸入列表通常是無關緊要的。
--子查詢不為空,外層查詢進行查詢
SELECT * FROM employee WHERE EXISTS(SELECT * FROM dept WHERE d_no=50)
二.多表內(nèi)連接查詢
1.笛卡爾積查詢
(1) 笛卡爾積是針對多種查詢的特殊結果來說的,它的特殊之處在于多表查詢是沒有指定查詢條件,查詢的是多個表中的全部記錄,返回到具體結果是每張表中列的和、行的積。
(2)通過笛卡爾積可以得出,在使用多表連接查詢時,一定要設置查詢條件,否者就會出現(xiàn)笛卡爾積。這樣就會降低數(shù)據(jù)庫的訪問效率。
2.內(nèi)連接的簡單查詢
(1)等值內(nèi)連接查詢
SELECT * FROM employee
INNER JOIN dept ON employee.dept_no=dept.d_no
(2)不等值內(nèi)連接查詢
SELECT * FROM employee
INNER JOIN dept ON employee.dept_no<>dept.d_no
(2)特殊的內(nèi)連接查詢
在一個連接查詢中,涉及的兩種表都是同一張表,這種查詢稱為子連接查詢,也被稱為特殊的內(nèi)連接,它是指互相連接的表在物理上是同一張表,但可以在邏輯上分為兩張表。
SELECT DISTINCT e1.e_no,e1.e_name FROM employee AS e1,employee AS e2 WHERE e1.dept_no=e2.dept_no AND e2.dept_no=20
(3)帶條件的內(nèi)連接查詢
SELECT * FROM employee
INNER JOIN dept ON employee.dept_no=dept.d_no
WHERE dept_no=30
三.多表外連接查詢
1.外連接種類
外連接查詢包括左外連接、右外連接以及全外連接。
SELECT * FROM table
LEFT|RIGHT|FULL OUTER JOIN table2
ON conditions;
(1)左外連接:查詢得到的結果,除了符合條件的查詢部分結果,還要加上左表中余下的數(shù)據(jù)。
(2)右外連接:查詢得到的結果,除了符合條件的查詢部分結果,還要加上右表中余下的數(shù)據(jù)。
(3)全連接:查詢得到的結果,除了符合條件的查詢部分結果,還要加上左表和右表中余下的數(shù)據(jù)。
2.左外連接
SELECT * FROM employee
LEFT JOIN dept ON employee.dept_no=dept.d_no
3.右外連接
SELECT * FROM employee
RIGHT JOIN dept ON employee.dept_no=dept.d_no
4.全外連接
SELECT * FROM employee
FULL JOIN dept ON employee.dept_no=dept.d_no
四.動態(tài)查詢
--設置變量@location和@job,搭建好查詢語句,在賦值處輸入查詢條件的值
DECLARE
@location VARCHAR(20),
@job VARCHAR(20)
SELECT @location='BeiJing',@job='ANALYST'
SELECT * FROM employee
LEFT JOIN dept ON employee.dept_no=dept.d_no
WHERE d_location=@location AND e_job=@job