ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SQL Server教程 - T-SQL-DQL(Data Query Language)

2022-07-30 09:01:45  阅读:183  来源: 互联网

标签:JOIN Language 表名 查询 SQL Server WHERE 连接 SELECT


更新记录
转载请注明出处:https://www.cnblogs.com/cqpanda/p/16527471.html
2022年7月30日 发布。
2022年7月2日 从笔记迁移到博客。

T-SQL-DQL(Data Query Language)

简单形式

查询单列

SELECT [列名]
FROM [表名];

查询多列

SELECT [列名],[列名],[列名]
FROM [表名];

查询所有列

SELECT *
FROM [表名];

去除重复

SELECT ALL | DISTINCT [列名]
FROM [表名];

设置表和列别名

SELECT [列] AS [别名]
FROM [表名] AS [别名];

限制查询条数

SELECT TOP 数量 [PERCENT] 列名...
FROM [表];

条件筛选

SELECT [列名]
FROM [表名]
WHERE <条件>;

插入到新表

说明:使用INTO子句
注意:INTO语句会创建新表,旧表会导致报错

SELECT [列名], [列名]
INTO [表名]
FROM [表名];

实例:插入到临时表

SELECT * INTO #TempPanda
FROM [表名];

排序

ORDER BY 用于对结果集进行排序。
ASC :升序(默认)
DESC :降序
可以按多个列进行排序,并且为每个列指定不同的排序方式

SELECT 列
FROM [表名]
WHERE 条件
ORDER BY 列 [ASC | DESC];

排序时NULL 值如何处理
在处理查询结果中没有重复值时,如果指定的列中有多个NULL值,则作为相同的值对待,显示结果中只有一个空值。对于使用 ORDER BY子句排序得到的结果集中,若存在NULL值,升序排序时有NULL值的记录将显示在最前面,而降序时NULL值将显示在最后面。

实例:随机排序(使用GUID)

order by newid()

分组

GROUP BY
GROUP BY 子句将记录分组到汇总行中
GROUP BY 为每个组返回一个记录
GROUP BY 通常还涉及聚合:COUNT,MAX,SUM,AVG 等
GROUP BY 可以按一列或多列进行分组
GROUP BY 按分组字段进行排序后,ORDER BY 可以以汇总字段来进行排序

HAVING
HAVING 用于对汇总的 GROUP BY 结果进行过滤
HAVING 要求存在一个 GROUP BY 子句
WHERE 和 HAVING 可以在相同的查询中
HAVING vs WHERE
WHERE 和 HAVING 都是用于过滤
HAVING 适用于汇总的组记录;而 WHERE 适用于单个记录

SELECT 列
FROM [表名]
WHERE 条件
GROUP BY 列
ORDER BY 列 [ASC | DESC];

分页

注意:SQL Server2012起可用

SELECT * 
FROM [表名]
ORDER BY [列名]
OFFSET [跳过的行数] ROWS
FETCH NEXT [获得的行数] ROWS ONLY;

注意:跳过的行号为0则不跳过任何行

模式匹配

关键字

LIKE
NOT LIKE

注意:

  • 只有字段是文本类型时才使用 LIKE。
  • LIKE 支持两个通配符匹配选项:% 和 _。
  • 不要滥用通配符,通配符位于开头处匹配会非常慢。
  • % 表示任何字符出现任意次数。
  • _ 表示任何字符出现一次。

匹配符号

%   -- 0个或多个字符
_   -- 1个字符
[]  -- 匹配[]内的任意字符
[^] -- 匹配除了[]内的任意字符

实例:

_
    SELECT 列 FROM 表
    WHERE 列 LIKE '_panda';
%
    SELECT 列 FROM 表
    WHERE 列 LIKE '%panda%';
[]
    SELECT 列 FROM 表
    WHERE 列 LIKE '[pc]';
[^]
    SELECT 列 FROM 表
WHERE 列 LIKE '[^pc]';

其他实例:

WHERE SALARY LIKE '_00%'

Finds any values that have 00 in the second and third positions

WHERE SALARY LIKE '2_%_%'

Finds any values that start with 2 and are at least 3 characters in length

WHERE SALARY LIKE '%2'

Finds any values that end with 2

WHERE SALARY LIKE '_2%3'

Finds any values that have a 2 in the second position and end with a 3

WHERE SALARY LIKE '2___3'

Finds any values in a five-digit number that start with 2 and end with 3

子查询

子查询是嵌套在较大查询中的 SQL 查询
子查询也称为内部查询或内部选择
而包含子查询的语句也称为外部查询或外部选择
子查询可以嵌套在 SELECT,INSERT,UPDATE 或 DELETE 语句内或另一个子查询中
子查询通常会在另一个 SELECT 语句的 WHERE 子句中添加
可以使用比较运算符,如 >,<,或 =
比较运算符也可以是多行运算符,如 IN,ANY 或 ALL
子查询必须被圆括号 () 括起来
内部查询首先在其父查询之前执行,以便可以将内部查询的结果传递给外部查询

子查询语法

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
   (SELECT column_name [, column_name ]
   FROM table1 [, table2 ]
   [WHERE])

简单子查询(比较运算符)

SELECT 列 FROM [表名] 
WHERE 列 = |!= (子查询);

IN筛选

IN

SELECT 列 FROM [表名]
WHERE 列 IN (子查询);

NOT IN

SELECT 列 FROM [表名]
WHERE 列 NOT IN (子查询);

SOME/ALL

SELECT 列 FROM [表名]
WHERE 列 比较运算符 [ALL/SOME] (子查询);

EXISTS

SELECT 列 FROM [表名]
WHERE 列 [NOT] EXISTS 子查询

范围筛选

BETWEEN.AND

注意:该子句是闭区间

SELECT 列 FROM [表名]
WHERE 列 BETWEEN 起始 AND 终止;

NOT.BETWEEN.AND

注意:该子句是开区间

SELECT 列 FROM [表名]
WHERE 列 NOT BETWEEN 起始 AND 终止;

查找空值

IS NULL

SELECT 列 FROM 表
WHERE 列 IS NULL;

IS NOT NULL

SELECT 列 FROM 表
WHERE 列 IS NOT NULL;

连接(JOIN)

连接说明

如果一个 JOIN 至少有一个公共字段并且它们之间存在关系
则该 JOIN 可以在两个或多个表上工作
连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 WHERE
JOIN 保持基表(结构和数据)不变

JOIN 有两种连接类型:内连接和外连接

内连接
又称等值连接,使用 INNER JOIN 关键字
在没有条件语句的情况下返回笛卡尔积。
自连接
可以看成内连接的一种,只是连接的表是自身而已
自然连接是把同名列通过 = 测试连接起来的,同名列可以有多个

内连接 vs 自然连接
内连接提供连接的列
而自然连接自动连接所有同名列

外连接返回一个表中的所有行,并且仅返回来自次表中满足连接条件的那些行
即两个表中的列是相等的。外连接分为左外连接、右外连接、全外连接
左外连接就是保留左表没有关联的行
右外连接就是保留右表没有关联的行

连接 vs 子查询
连接可以替换子查询,并且比子查询的效率一般会更快

image

连接的具体类型

INNER JOIN(内连接)
Returns rows when there is a match in both tables

LEFT JOIN(左连接)
Returns all rows from the left table, even if there are no matches in the right table

RIGHT JOIN(右连接)
Returns all rows from the right table, even if there are no matches in the left table

FULL JOIN(全连接)
Returns rows when there is a match in one of the tables

SELF JOIN(自连接)
This is used to join a table to itself as if the table were two tables, temporarily renaming at least one table in the MS SQL Server statement

CARTESIAN JOIN(笛卡尔连接)
Returns the Cartesian product of the sets of records from the two or more joined tables

内连接

SELECT 列
FROM
  表1 INNER JOIN 表2
ON
  条件;

外连接-左

SELECT 列
FROM
  表1 LEFT OUTER JOIN 表2
ON
  条件;

外连接-右

SELECT 列
FROM
  表1 RIGHT OUTER JOIN 表2
ON
  条件;

全连接

全连接:保留两表的所有行,没有对应字段的值置为null

SELECT 列
FROM
  表1 FULL OUTER JOIN 表2
ON
  条件;

交叉连接

SELECT 列
FROM
  表1 CROSS JOIN 表2
ON
    条件;

自连接

SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM customers c1, customers c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';

自然连接(NATURAL JOIN)

SELECT *
FROM Products
NATURAL JOIN Customers;

组合(UNION)

UNION 运算符将两个或更多查询的结果组合起来
并生成一个结果集,其中包含来自 UNION 中参与查询的提取行

UNION 基本规则
所有查询的列数和列顺序必须相同
每个查询中涉及表的列的数据类型必须相同或兼容
通常返回的列名取自第一个查询

默认会去除相同行,如果需要保留相同行,使用 UNION ALL
只能包含一个 ORDER BY 子句,并且必须位于语句的最后

应用场景
在一个查询中从不同的表返回结构数据
对一个表执行多个查询,按一个查询返回数据

JOIN vs UNION
JOIN 中连接表的列可能不同,但在 UNION 中,所有查询的列数和列顺序必须相同
UNION 将查询之后的行放在一起(垂直放置),但 JOIN 将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积

合并1
注意:这种合并会删除重复行

SELECT column1,column2,column3..
FROM table_name1

UNION

SELECT column1,column2,column3..
FROM table_name2

合并2
注意:这种合并会保留重复行

SELECT column1,column2,column3..
FROM table_name1

UNION ALL

SELECT column1,column2,column3..
FROM table_name2

DQL总结语句

SELECT [ALL | DISTINCT] TOP n [PERCENT] 列....AS [别名]
[INTO 表名]
FROM 表 [别名],....
[WHERE 条件]
GROUP BY 分组字段 HAVING 分组条件
[ORDER BY 排序字段 ASC | DESC];

动态SQL

动态SQL由完整的SQL语句组成,即:拼接SQL语句
实例:

/* 定义动态SQL */
DECLARE @panda_id INT;
SET @panda_id = 123;
DECLARE @sql_expression VARCHAR(MAX);
SET @sql_expression = 'SELECT * FROM 
panda_table WHERE id = ';

/* 执行 */
EXEC(@sql_expression + @panda_id);

标签:JOIN,Language,表名,查询,SQL,Server,WHERE,连接,SELECT
来源: https://www.cnblogs.com/cqpanda/p/16527471.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有