一.使用比较运算符的子查询
SELECT * FROM employee WHERE
dept_no =(SELECT d_no FROM dept WHERE d_location='BeiJing')
1.使用IN子查询
使用IN关键字进行子查询是,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较。
--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后面子查询中的最大值。
--只要满足内层查询中的一个条件,就能查出来
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时需要同时满足所有内层查询的条件。
--查出的数据需要满足内层查询中所有条件
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的结果只取决于是否会返回行,而不在于这些行的内容,所以这个子查询输入列表通常是无关紧要的。
--子查询不为空,外层查询进行查询
SELECT * FROM employee WHERE EXISTS(SELECT * FROM dept WHERE d_no=50)
二.多表内连接查询
1.笛卡尔积查询
(1) 笛卡尔积是针对多种查询的特殊结果来说的,它的特殊之处在于多表查询是没有指定查询条件,查询的是多个表中的全部记录,返回到具体结果是每张表中列的和、行的积。
(2)通过笛卡尔积可以得出,在使用多表连接查询时,一定要设置查询条件,否者就会出现笛卡尔积。这样就会降低数据库的访问效率。
2.内连接的简单查询
(1)等值内连接查询
SELECT * FROM employee
INNER JOIN dept ON employee.dept_no=dept.d_no
(2)不等值内连接查询
SELECT * FROM employee
INNER JOIN dept ON employee.dept_no<>dept.d_no
(2)特殊的内连接查询
在一个连接查询中,涉及的两种表都是同一张表,这种查询称为子连接查询,也被称为特殊的内连接,它是指互相连接的表在物理上是同一张表,但可以在逻辑上分为两张表。
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)带条件的内连接查询
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)左外连接:查询得到的结果,除了符合条件的查询部分结果,还要加上左表中余下的数据。
(2)右外连接:查询得到的结果,除了符合条件的查询部分结果,还要加上右表中余下的数据。
(3)全连接:查询得到的结果,除了符合条件的查询部分结果,还要加上左表和右表中余下的数据。
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
四.动态查询
--设置变量@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