高级查询

一.使用比较运算符的子查询

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容