SQL Server 查询语句

一、表设计 以及 表数据

1.表设计

2.表数据

 

二、SELECT语法格式:

1
2
3
4
5
6
SELECT  [ALLDISTINCT][TOP n][<目标字段表达式>[,…n]]
[INTO <新表>]
FROM <表名或视图名>[,<表名或视图名>[…n]]
WHERE <条件表达式>]
GROUP BY <字段名l>[HAVING <条件表达式>]]
ORDER BY <字段名2>[ASCDESC]]

注意:

  1. 当有多个数据源(表或视图),使用“ , ”分隔
  2. 数据源可以使用别名,即数据源名 AS 别名

1.返回数据表中的指定列

语法格式:

1
SELECT [ALLDISTINCT][TOP n][<目标字段表达式>[,…n]]
  • DISTINCT说明要去掉重复的元组
  • ALL表示所有满足条件的元组
  • TOP 表示只显示结果集的前多少行,n是对行数的说明。
  • 省略<目标字段表达式>表示结果集中包含<表名或视图名>中的所有字段,此时<目标字段表达式>使用“*”代替。

【例】查询成绩表中的学生编号信息,消除取值重复的字段 或 行

1
2
SELECT DISTINCT 学生编号
FROM 成绩表;

 

1
2
select distinct *
from 成绩表

 

【例】查询成绩表前5条记录,学生成绩别名为“成绩”

1
2
SELECT TOP 5 分数编号,科目编号,班级编号,学生编号,学生成绩 AS 成绩
FROM 成绩表;

 【例】查询学生成绩,从10到15的记录

1
2
3
4
5
6
7
select top 5 *
from (
    select top 15 *
    from 成绩表
    order by 学生编号 asc
    ) A
order by 学生编号 desc

 

2. Where  条件

1)关系运算

使用逻辑表达式,多重条件查询时,可以使用逻辑运算符AND、OR、NOT连接多个查询条件

【例】在成绩表中查询科目编号为1和学生成绩都大于90的学生。

1
2
select * from 成绩表
where 科目编号=1 and 学生成绩>90

 【例】between n and m,取出第5条到第15条数据

1
2
3
select *
from 学生表
where 学生编号 between 5 an 15

 【例】in、not in

1
2
3
select * from 学生表 where 学生编号 in (1,2,3)
--或者
select * from 学生表 where 学生编号 not in (1,2,3)

 

 2.字符串比较(模糊匹配)

【例】like '%模糊匹配内容%',该种模糊匹配为包含匹配

1
2
3
select *
from 学生表
where 学生姓名 like '%马%'

 【例】like '模糊匹配内容%',首匹配

1
2
3
select *
from 学生表
where 学生姓名 like '%马'

 【例】like '%模糊匹配内容',尾匹配

1
2
3
select *
from 学生表
where 学生姓名 like '马%'

 【例】_匹配,固定长度字符匹配,一个_代表一个字符

1
2
3
4
--匹配name为2位字符长度的数据
select *
from 学生表
where 学生姓名 like '__'

  【例】匹配name为3位字符长度,且倒数第三位为化的的数据

1
select * from TestInsertBase where name like '_化_'

【例】在科目表中查询以“计算机”开头的科目名称。

1
2
select * from 科目表
where 科目名称 like '计算机%'

 【例】[],范围匹配,匹配包含在中括号中字符的内容

1
2
3
4
--匹配第2位为云的内容
select *
from 学生表
where name like '马[云]snns'

 【例】[^],范围匹配的取反,匹配不包含在这个范围中的字符

1
2
3
4
--匹配第2位不为云的内容
select *
from 学生表
where name like '马[^云]'

 【例】查询前百分之N条内容

1
2
3
--查询前20%条
select top 20 percent *
from 学生表

 

 3.搜索范围[NOT]BETWEEN …….AND

【例】查询成绩表中期末成绩在90与100 之间的学生

1
2
select * from 成绩表
where 学生成绩 between 90 and 100

 

4.使用[NOT]IN检索范围

【例】在成绩表中查询学生成绩在92,95,100取值的学生

1
2
select * from 成绩表
where 学生成绩 IN(92,95,100)

 【例】删除成绩表中重复的行

1
2
3
4
5
6
delete 成绩表
where 学生编号 not in (
    select max(学生编号)
    from 成绩表
    group by 科目编号,班级编号,学生编号
)

5.聚合函数,SUM、MAX、MIN、AVG、COUNT

【例】查询班级的总数

1
2
SELECT count(*) AS 总数
FROM 班级表;

 

 6.使用GROUP BY分组

语法格式如下:

1
2
3
GROUP BY [ALL]列名列表
[WITH{CUBE  | ROLLUP}]
[HAVING 分组后的筛选条件表达式]

 【例】统计学生表中每个班级的学生人数

1
2
3
SELECT 班级编号,count(*) AS 人数
FROM 学生表
GROUP BY 班级编号;

 【例】统计学生总分数,并且平均分数大于90

1
2
3
4
SELECT 学生编号,sum(学生成绩) AS 总分
FROM 成绩表
GROUP BY 学生编号
Having AVG(学生成绩) >=90

 

 7.使用ORDER BY排序

语法格式如下:

1
ORDER BY 列名称表 [ASC |DESC]
  • ASC: 指定查询结果按照升序方式排列
  • DESC:排序结果按照降序方式排列
【例】查询成绩表中的学生成绩,按照降序排列结果。
1
2
3
select *
from 成绩表
order by 学生成绩,学生编号 desc

 【例】随机取出10条学生成绩

1
2
3
select top 10 *
from 学生表
order by newid()

 

 8.INTO子句保存查询结果

语法格式如下:

1
SELECT * INTO 新表名

 【例】把学生表中把班级编号为1的学生选择出来,生成学生表2,注:新表未创建

1
2
3
4
select 学生编号,班级编号,学生姓名,学生生日
into 学生表2
from 学生表
where 班级编号=1

 【例】使用 SELECT * INTO 创建临时表,注:临时表未创建

1
2
3
4
select 学生编号,班级编号,学生姓名,学生生日
into #学生表
from 学生表
where 班级编号=1

 【例】使用 SELECT * INTO 复制表

1
2
3
4
select 学生编号,班级编号,学生姓名,学生生日
into 学生表2
from 学生表
where 1=0

 9.使用Insert......Select

注:向数据表中插入从其他地方获取的值,新表已创建

【例】创建学生表2,然后插入查询数据

1
2
3
insert 学生表2
select *
from 学生表

 

 三、多表连接查询

1.自连接,满足两个表之间的关联条件

【例】把学生表与班级表连接起来

1
2
3
select A.班级名称,B.学生编号,B.学生姓名,B.学生生日
from 班级表 A,学生表 B
where A.班级编号=B.班级编号

 

 2.内连接,需要满足两个表之间的关联条件

【例】使用inner join学生表与班级表连接起来

1
2
3
4
select A.班级名称,B.学生编号,B.学生姓名,B.学生生日
from 班级表 A
inner join 学生表 B
on A.班级编号=B.班级编号

 

 3.左外连接(左表是主表)

【例】使用left join学生表与班级表连接起来

1
2
3
4
select A.班级名称,B.学生编号,B.学生姓名,B.学生生日
from 班级表 A
left join 学生表 B
on A.班级编号=B.班级编号

 

 4.右外连接(右表是主表)

【例】使用right join学生表与班级表连接起来

1
2
3
4
select A.班级名称,B.学生编号,B.学生姓名,B.学生生日
from 班级表 A
right join 学生表 B
on A.班级编号=B.班级编号

 

 5.全连接(会显示两个表信息,不匹配的填空值)

【例】使用full join学生表与班级表连接起来

1
2
3
4
select A.班级名称,B.学生编号,B.学生姓名,B.学生生日
from 班级表 A
full join 学生表 B
on A.班级编号=B.班级编号

 

四、联合查询,UNION [ALL]EXCEPT [ALL]INTERSECT [ALL]

  •  对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
  • union all会将全部的数据直接合并在一起。
  • union会对合并之后的数据去重。

1.UNION,UNION ALL 运算符(并集)

作用:TABLE1 和 TABLE2 组合,并消除表中所有重复行

语法格式如下:

1
2
3
SELECT 字段列表 FROM 表A
UNION [ALL]
SELECT 字段列表 FROM 表B;

 

2.EXCEPT,EXCEPT ALL 运算符(补集)

作用:查询 TABLE1 和 TABLE2,但 TABLE2 中有不同数据的行,并消除所有重复行

语法格式如下:

1
2
3
SELECT 字段列表 FROM 表A
EXCEPT [ALL]
SELECT 字段列表 FROM 表B;

3.INTERSECT,INTERSECT ALL 运算符(交集)

作用:查询 TABLE1 和 TABLE2 中有相同数据的行,并消除所有重复行

语法格式如下:

1
2
3
SELECT 字段列表 FROM 表A
EXCEPT [ALL]
SELECT 字段列表 FROM 表B;

 

子查询

SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。

语法格式如下:

1
SELECT FROM t1 WHERE column1 =(SELECT column1 FROM t2);

 1.常用的操作符:IN、NOT IN、ANY、SOME、ALL

操作符描述
IN 在指定的集合范围之内,多选一
NOT IN 不在指定的集合范围之内
ANY 子查询返回列表中,有任意一个满足即可
SOME 与ANY等同,使用SOME的地方都可以使用
ANYALL 子查询返回列表的所有值都必须满足

【例】使用in和not in 完成子查询

1
2
3
4
5
6
7
select 学生成绩
from 成绩表
where 学生编号 not in(
    select 学生编号
    from 学生表
    where 学生姓名='马云'
)

 

【例】update中使用from子查询

1
2
3
4
update 学生表
set 学生姓名=b.学生姓名
from 学生表 a join 学生表2 b on a.学生编号= b.学生编号
where b.班级编号=1

 【例】delete 中使用from子查询

1
2
3
DELETE A
FROM 学生表 As A with(rowlock)
Inner Join 学生表2 As B ON A.班级编号=B.班级编号;

 【例】使用exists和not exists完成子查询

1
2
3
SELECT 学生编号,学生姓名
FROM 学生表 A
WHERE EXISTS (SELECT * FROM 学生表2 B WHERE A.学生编号=B.学生编号)

 

posted @   microsoft-zhcn  阅读(1044)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示