SQL高级查询
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
17
模糊查询1-1 模糊查询
当我们对于要查询数据的特征只能描述出一部分时,可以 当我们对于要查询数据的特征只能描述出一部分时, 使用模糊查询。 使用模糊查询。 模糊查询使用关键字LIKE。 模糊查询使用关键字 例:USE pubs
GO SELECT phone FROM authors WHERE phone LIKE '415%' ORDER by au_lname GO
12
使用比较运算符
子查询可由一个比较运算符(=、< >、>、> =、 <、!>, ! < 或 < =)引入。 示例
USE pubs SELECT DISTINCT title FROM titles WHERE price > (SELECT MIN(price) FROM titles)
13
使用 ANY、SOME 或 ALL
20
Union1-2
Union 操作符:将两个或更多个 SELECT 语句的结果合并为一个结果集。 联合可以指定为如下形式:
SELECT 语句 UNION [ALL] SELECT 语句
使用 ALL 子句表示不删除重复的行。
21
Union2-2
每个Select必须具有相同的结构 兼容的列类型和相同数目的列
14
使用 EXISTS 和 NOT EXISTS
EXISTS 用于检查子查询返回的行是否存在 该子查询实际上并不返回任何数据,而是返回 TRUE 或 FALSE USE pubs SELECT au_lname, au_fname FROM authors WHERE exists (SELECT * FROM publishers WHERE authors.city = publishers.city)
18
模糊查询1-2 模糊查询
[ ]的使用 的使用 [ ]中的字符会被分别拿出来与 ]外的字符做匹配,然后去查询结果。 中的字符会被分别拿出来与[ 外的字符做匹配, 中的字符会被分别拿出来与 外的字符做匹配 然后去查询结果。 以下查询将会找出名字叫做Cheryl或是 或是Sheryl的作者。 的作者。 以下查询将会找出名字叫做 或是 的作者 例:USE pubs GO SELECT au_lname, au_fname, phone FROM authors WHERE au_fname LIKE '[CS]heryl' ORDER BY au_lname ASC, au_fname ASC GO
10
使用IN 或 NOT IN
通过 IN(或 NOT IN)引入的子查询结果是一 列值。子查询返回结果之后,外部查询将利用 这些结果。 例如
USE pubs SELECT pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business')
过多的相关子查询会降低查询效率。 过多的相关子查询会降低查询效率。
返回第一步
7
嵌套子查询
子查询自身可以包括一个或多个子查询。一个 语句中可以嵌套任意数量的子查询。
示例
USE pubs SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM titleauthor WHERE title_id IN (SELECT title_id FROM titles WHERE type = 'popular_comp'))
28
26
使用SELECT INTO 子句注意事 项
基于SELECT INTO语句需要现存表创建一 个新表,并以来自现存表的结果集填充该新 表 SELECT INTO 可将几个表或视图中的数据 组合成一个表 SELECT INTO可用于创建一个包含选自链 接服务器的数据的新表
27
总结
子查询 联合查询
DISTINCT 子句 COMPUTE BY SELECT INTO
15
使用exists查找交集
查找有作者和出版商共同居住的城市 use pubs select distinct city from authors where exists ( select * from publishers where authors.city = publishers.city) use pubs select distinct authors.city from authors inner join publishers on authors.city = publishers.city
23
DISTINCT 子句1-2
语法: 语法:
SELECT DISTINCT <column1> FROM <tablename>
结合使用Select 和Distinct,将删除重复的行 示例
SELECT DISTINCT deptno FROM emp
பைடு நூலகம்24
DISTINCT 子句2-2
如果使用 DISTINCT,那么在计算总和、平均值或 计数之前,先消除重复的值。 如果使用 DISTINCT 关键字,表达式必须只包含 列名。而不能包含算术表达式。 USE pubs SELECT AVG(DISTINCT price) FROM titles WHERE type = 'business'
可以用 ALL 或 ANY 关键字修改引入子查询 的比较运算符。SOME 是 SQL-92 标准的 ANY 的等效物。
SELECT title FROM titles WHERE advance > ALL ( SELECT advance FROM publishers INNER JOIN titles ON titles.pub_id = publishers.pub_id WHERE pub_name = 'Algodata Infosystems' )
8
许多其中的子查询和外部查询引用同一表的语句可被表述为自联接 use pubs select au_lname, au_fname, city from authors where city in (select city from authors where au_fname = 'livia' and au_lname = 'karsen') use pubs select au1.au_lname,au1.au_fname,au1.city from authors as au1 inner join authors as au2 on au1.city = au2.city and au2.au_lname = 'Karsen' and au2.au_fname = 'Livia'
9
在子查询中使用别名
例如
USE pubs SELECT au1.au_lname, au1.au_fname, au1.city FROM authors AS au1 WHERE au1.city in (SELECT au2.city FROM authors AS au2 WHERE au2.au_fname = 'Livia' AND au2.au_lname = 'Karsen')
11
使用UPDATE、DELETE 和 INSERT 语句 子查询可以嵌套在 UPDATE、DELETE 和 INSERT 语句以及 SELECT 语句中。 例如
UPDATE titles SET price = price * 2 WHERE pub_id IN (SELECT pub_id FROM publishers WHERE pub_name = 'New Moon Books')
19
替代表达式的子查询
在SQL中除了order by 列表外,任何可以使 用表达式的地方,都可以使用子查询: use pubs select title,price, (select avg(price) from titles) as average, price -(select avg(price) from titles) as differ from titles where type='popular_comp'
6
相关子查询分析 父查询传送列值给子查询
USE northwind 子查询获取父查询传送的列值 SELECT orderid, customerid FROM orders AS or1 WHERE 20 < (SELECT quantity FROM [order details] AS od 实例 WHERE or1.orderid = od.orderid AND od.productid = 23) GO 子查询返回查询值给父查询 父查询传送下一行的列值给子查询 (重复1-3步) 重复1
16
使用not exists查找交集
Authors 和 publishers 的差集是作者所居住的,但没有出版商居住的所有城市 的集合。 use pubs select distinct city from authors where not exists ( select * from publishers where authors.city = publishers.city) use pubs select distinct city from authors where city not in (select city from publishers)
4
子查询
子查询
一般子查询只需要计算一次:
5
相关子查询
许多查询都可以通过执行一次子查询并将结果值 代入外部查询的 WHERE 子句进行评估。 在包括相关子查询(也称为重复子查询)的查询中, 子查询依靠外部查询获得值。 示例 USE pubs
SELECT au_lname, au_fname FROM authors WHERE 100 IN (SELECT royaltyper FROM titleauthor WHERE titleauthor.au_ID = authors.au_id )
高级查询
1
查询步骤
一个关于表中的数 据的请求或问题
查询 发出
表中的数据
由 SQL Server处理
回答该查询 - 返回结果集
SQL Server
2
用户
多表查询类型
连接 子查询 联合
3
子查询
查询, 子查询是一个 SELECT 查询,它嵌套在 SELECT、 查询是一个 、 INSERT、UPDATE、DELETE 语句或其它子查询中。 句或其它子查询 查询中 、 、 任何允许使用表达式的地方都可以使用子查询。 任何允许使用表达式的地方都可以使用子查询。 查询 父查询 Select <Column Name> From Table 操作符 WHERE <Column Name> = Select <Column Name> From <Table> WHERE <Column> = <Criteria >
25
SELECT INTO
SELECT INTO 语句创建一个新表,并用 SELECT 的结果集填充该表 新表的结构由选择列表中表达式的特性定义
SELECT Shippers.*, Link.Address, Link.City, Link.Region, Link.PostalCode INTO NewShippers FROM Shippers JOIN LinkServer...Shippers AS Link ON (Shippers.ShipperID = Link.ShipperID) 1
示例
SELECT empno, ename, sal FROM emp UNION SELECT empno, ename, sal FROM ret_emp
22
Union举例
select account_no,account_name from saving_accounts union --all select account_no,account_name from current_accounts
模糊查询1-1 模糊查询
当我们对于要查询数据的特征只能描述出一部分时,可以 当我们对于要查询数据的特征只能描述出一部分时, 使用模糊查询。 使用模糊查询。 模糊查询使用关键字LIKE。 模糊查询使用关键字 例:USE pubs
GO SELECT phone FROM authors WHERE phone LIKE '415%' ORDER by au_lname GO
12
使用比较运算符
子查询可由一个比较运算符(=、< >、>、> =、 <、!>, ! < 或 < =)引入。 示例
USE pubs SELECT DISTINCT title FROM titles WHERE price > (SELECT MIN(price) FROM titles)
13
使用 ANY、SOME 或 ALL
20
Union1-2
Union 操作符:将两个或更多个 SELECT 语句的结果合并为一个结果集。 联合可以指定为如下形式:
SELECT 语句 UNION [ALL] SELECT 语句
使用 ALL 子句表示不删除重复的行。
21
Union2-2
每个Select必须具有相同的结构 兼容的列类型和相同数目的列
14
使用 EXISTS 和 NOT EXISTS
EXISTS 用于检查子查询返回的行是否存在 该子查询实际上并不返回任何数据,而是返回 TRUE 或 FALSE USE pubs SELECT au_lname, au_fname FROM authors WHERE exists (SELECT * FROM publishers WHERE authors.city = publishers.city)
18
模糊查询1-2 模糊查询
[ ]的使用 的使用 [ ]中的字符会被分别拿出来与 ]外的字符做匹配,然后去查询结果。 中的字符会被分别拿出来与[ 外的字符做匹配, 中的字符会被分别拿出来与 外的字符做匹配 然后去查询结果。 以下查询将会找出名字叫做Cheryl或是 或是Sheryl的作者。 的作者。 以下查询将会找出名字叫做 或是 的作者 例:USE pubs GO SELECT au_lname, au_fname, phone FROM authors WHERE au_fname LIKE '[CS]heryl' ORDER BY au_lname ASC, au_fname ASC GO
10
使用IN 或 NOT IN
通过 IN(或 NOT IN)引入的子查询结果是一 列值。子查询返回结果之后,外部查询将利用 这些结果。 例如
USE pubs SELECT pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business')
过多的相关子查询会降低查询效率。 过多的相关子查询会降低查询效率。
返回第一步
7
嵌套子查询
子查询自身可以包括一个或多个子查询。一个 语句中可以嵌套任意数量的子查询。
示例
USE pubs SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM titleauthor WHERE title_id IN (SELECT title_id FROM titles WHERE type = 'popular_comp'))
28
26
使用SELECT INTO 子句注意事 项
基于SELECT INTO语句需要现存表创建一 个新表,并以来自现存表的结果集填充该新 表 SELECT INTO 可将几个表或视图中的数据 组合成一个表 SELECT INTO可用于创建一个包含选自链 接服务器的数据的新表
27
总结
子查询 联合查询
DISTINCT 子句 COMPUTE BY SELECT INTO
15
使用exists查找交集
查找有作者和出版商共同居住的城市 use pubs select distinct city from authors where exists ( select * from publishers where authors.city = publishers.city) use pubs select distinct authors.city from authors inner join publishers on authors.city = publishers.city
23
DISTINCT 子句1-2
语法: 语法:
SELECT DISTINCT <column1> FROM <tablename>
结合使用Select 和Distinct,将删除重复的行 示例
SELECT DISTINCT deptno FROM emp
பைடு நூலகம்24
DISTINCT 子句2-2
如果使用 DISTINCT,那么在计算总和、平均值或 计数之前,先消除重复的值。 如果使用 DISTINCT 关键字,表达式必须只包含 列名。而不能包含算术表达式。 USE pubs SELECT AVG(DISTINCT price) FROM titles WHERE type = 'business'
可以用 ALL 或 ANY 关键字修改引入子查询 的比较运算符。SOME 是 SQL-92 标准的 ANY 的等效物。
SELECT title FROM titles WHERE advance > ALL ( SELECT advance FROM publishers INNER JOIN titles ON titles.pub_id = publishers.pub_id WHERE pub_name = 'Algodata Infosystems' )
8
许多其中的子查询和外部查询引用同一表的语句可被表述为自联接 use pubs select au_lname, au_fname, city from authors where city in (select city from authors where au_fname = 'livia' and au_lname = 'karsen') use pubs select au1.au_lname,au1.au_fname,au1.city from authors as au1 inner join authors as au2 on au1.city = au2.city and au2.au_lname = 'Karsen' and au2.au_fname = 'Livia'
9
在子查询中使用别名
例如
USE pubs SELECT au1.au_lname, au1.au_fname, au1.city FROM authors AS au1 WHERE au1.city in (SELECT au2.city FROM authors AS au2 WHERE au2.au_fname = 'Livia' AND au2.au_lname = 'Karsen')
11
使用UPDATE、DELETE 和 INSERT 语句 子查询可以嵌套在 UPDATE、DELETE 和 INSERT 语句以及 SELECT 语句中。 例如
UPDATE titles SET price = price * 2 WHERE pub_id IN (SELECT pub_id FROM publishers WHERE pub_name = 'New Moon Books')
19
替代表达式的子查询
在SQL中除了order by 列表外,任何可以使 用表达式的地方,都可以使用子查询: use pubs select title,price, (select avg(price) from titles) as average, price -(select avg(price) from titles) as differ from titles where type='popular_comp'
6
相关子查询分析 父查询传送列值给子查询
USE northwind 子查询获取父查询传送的列值 SELECT orderid, customerid FROM orders AS or1 WHERE 20 < (SELECT quantity FROM [order details] AS od 实例 WHERE or1.orderid = od.orderid AND od.productid = 23) GO 子查询返回查询值给父查询 父查询传送下一行的列值给子查询 (重复1-3步) 重复1
16
使用not exists查找交集
Authors 和 publishers 的差集是作者所居住的,但没有出版商居住的所有城市 的集合。 use pubs select distinct city from authors where not exists ( select * from publishers where authors.city = publishers.city) use pubs select distinct city from authors where city not in (select city from publishers)
4
子查询
子查询
一般子查询只需要计算一次:
5
相关子查询
许多查询都可以通过执行一次子查询并将结果值 代入外部查询的 WHERE 子句进行评估。 在包括相关子查询(也称为重复子查询)的查询中, 子查询依靠外部查询获得值。 示例 USE pubs
SELECT au_lname, au_fname FROM authors WHERE 100 IN (SELECT royaltyper FROM titleauthor WHERE titleauthor.au_ID = authors.au_id )
高级查询
1
查询步骤
一个关于表中的数 据的请求或问题
查询 发出
表中的数据
由 SQL Server处理
回答该查询 - 返回结果集
SQL Server
2
用户
多表查询类型
连接 子查询 联合
3
子查询
查询, 子查询是一个 SELECT 查询,它嵌套在 SELECT、 查询是一个 、 INSERT、UPDATE、DELETE 语句或其它子查询中。 句或其它子查询 查询中 、 、 任何允许使用表达式的地方都可以使用子查询。 任何允许使用表达式的地方都可以使用子查询。 查询 父查询 Select <Column Name> From Table 操作符 WHERE <Column Name> = Select <Column Name> From <Table> WHERE <Column> = <Criteria >
25
SELECT INTO
SELECT INTO 语句创建一个新表,并用 SELECT 的结果集填充该表 新表的结构由选择列表中表达式的特性定义
SELECT Shippers.*, Link.Address, Link.City, Link.Region, Link.PostalCode INTO NewShippers FROM Shippers JOIN LinkServer...Shippers AS Link ON (Shippers.ShipperID = Link.ShipperID) 1
示例
SELECT empno, ename, sal FROM emp UNION SELECT empno, ename, sal FROM ret_emp
22
Union举例
select account_no,account_name from saving_accounts union --all select account_no,account_name from current_accounts