- SELECT语句语法
- 查询执行顺序
- 使用SELECT…WHERE查询数据
- 模糊查询
- OR/AND逻辑运算
- BETWEEN…AND
- IN
- IS NULL
- ORDER BY
- 排名函数RANK
- 排名函数ROW_NUMBER
- 过滤重复数据
- 判断对象(表/存储过程/视图等)是否存在
- SELECT…INTO
- INSERT…SELECT
- MERGE..INTO
- TOP
SELECT语句语法
基本语法:
1 | select 选择列表(查询所显示的内容) |
解析:
- 选择列表:可以包括几个列名或者表达式,用逗号隔开,用于指示应该返回哪些数据
- from子句包含提供数据的表或视图名称
- where子句用于给出查询条件
- 聚合函数对数据进行汇总计算,使用having进行筛选
- order by子句决定结果集的排列顺序
查询执行顺序
- FROM:查询首先回根据
select
语句的from
子句组装初始数据集 - WHERE:筛选阶段实际上是根据
where
子句进行筛选 - 聚合:SQL语句对数据集执行聚合运算
- ORDER BY:根据
from
子句和where
子句筛选出满足条件的行后,按照order by
子句指定方式排序 - 谓词:可以只显示前几行或只返回指定行
使用SELECT…WHERE查询数据
使用通配符*
查询所有列
示例:
1 | SELECT * FROM dbo.STUDENT |
查询指定的列
示例:
1 | SELECT NAME,AGE FROM dbo.STUDENT |
使用as
给列或表指定别名
示例:
1 | SELECT NAME AS 姓名,AGE AS 性别 FROM dbo.STUDENT AS 学生表 |
其中AS可以直接省略,例如:
1 | SELECT NAME 姓名,AGE 性别 FROM dbo.STUDENT 学生表 |
where
使用
示例:
1 | SELECT * FROM dbo.STUDENT WHERE NAME='李筱思' |
注:字符类型和时间类型的数据需要加引号标识
模糊查询
示例:
1 | -- 查找学生姓名以'李'开头的学生信息 |
OR/AND逻辑运算
示例:
1 | -- 查询姓名以'李'开头或年龄是13岁的学生信息 |
BETWEEN…AND
示例:
1 | -- 查询年龄在11到13范围内的学生 |
注:BETWEEN…AND是包括边界的
IN
示例:
1 | -- 查询年龄为10岁或15岁的学生 |
IS NULL
示例:
1 | -- 查询地址为空的学生信息 |
ORDER BY
ORDER BY ... DESC/ASC
:降序排序/升序排序,默认是ASC
示例:
1 | -- 查询所有学生,按年龄降序排序 |
同时对多个字段排序:若以多个字段排序时,以第一个排序的字段为主,当第一个字段出现相等值时对第二个字段排序
示例:
1 | -- 同时对学生性别、年龄排序 |
排名函数RANK
具体语法:
1 | RANK() OVER(PARTITION BY 表达式 ORDER BY 表达式) |
注:针对分区内的每行数据排名,若排序字符按值相等,则排名相同,PARTITION BY子句可选
示例:
1 | -- 按照学生年龄降序排名 |
排名函数ROW_NUMBER
具体语法:
1 | ROW_NUMBER() OVER(PARTITION BY 表达式 ORDER BY 表达式) |
注:对分区内的每行数据排名,若排序字段值相等,则排名累计,PARTITION BY子句可选
示例:
1 | -- 按照学生年龄降序排名 |
过滤重复数据
DISTINCT
消除重复项
DISTINCT
关键字可以从SELECT
语句的结果中消除重复的行,如果没有指定DISTINCT
,将返回所有行,包括重复的行
示例:
1 | SELECT DISTINCT ADDRESS FROM dbo.STUDENT |
判断对象(表/存储过程/视图等)是否存在
判断表是否存在方式1
使用SYS.OBJECTS
测试,在数据库中创建的每个用户定义的架构作用域内的对象在该表中对应一行
示例:
1 | IF EXISTS(SELECT * FROM sys.objects WHERE name='STUDENT') |
判断表是否存在方式2
使用OBJECT_ID
测试,OBJECT_ID(OBJECT_NAME.[OBJECT_TYPE])
返回架构范围内数据库对象的唯一标识。
OBJECT_TYPE
:U表示用户自定义表,P表示SQL存储过程,V表示视图
示例:
1 | IF(OBJECT_ID('STUDENT','U/P/V') IS NOT NULL) |
SELECT…INTO
使用SELECT...INTO
创建表并复制表中数据,源表中定义的索引、约束和触发器不会转移到新表中,也不能在SELECT...INTO
语句中指定它们
如果定义表的SELECT
语句包含一个联接,而该联接将导致IDENTITY
属性不能转移到新表
示例:
1 | -- 创建表并复制表数据 |
INSERT…SELECT
使用INSERT...SELECT
将数据从一个表插入另一个表
基本语法:
1 | INSERT INTO 目标表...INSERT INTO 源表 |
注:目标表必须存在
示例:
1 | -- 先判断表是否存在,存在则删除,然后再创建一张表,再往表里写源表查询出来的数据 |
MERGE..INTO
根据与源表的联接的结果,对目标表执行插入、更新或删除操作。例如:根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步
示例:
1 | -- 合并两张学生表的学生信息,当学生姓名相同时更新目标表的学生信息,当目标表没有该学生时插入学生信息 |
TOP
TOP
限制返回结果集的行数,当将TOP
与ORDER BY
子句结合使用时,结果集限制为前N个已排序行,否则,它将以未定义的顺序返回前N个行
示例:
1 | -- 查询学生表中前3行数据 |
使用TOP限制删除的行数
示例:
1 | -- 删除年龄小于15岁的任意一个学生数据 |
使用TOP限制更新的行数
示例:
1 | -- 更新年龄小于15岁的任意一个学生的年龄 |
使用TOP限制插入行数
示例:
1 | -- 向新创建的表中插入任意两条学生数据 |
注:Inserted是一张系统的临时表,将要插入的数据都会在这个表里有记录,OUTPUT就是将这些要插入的数据显示出来