SQL Server 查询语句

一、表设计 以及 表数据

1.表设计

2.表数据

 

二、SELECT语法格式:

SELECT  [ALL︱DISTINCT][TOP n][<目标字段表达式>[,…n]]
[INTO <新表>]
FROM <表名或视图名>[,<表名或视图名>[…n]]
WHERE <条件表达式>]
GROUP BY <字段名l>[HAVING <条件表达式>]]
ORDER BY <字段名2>[ASC︱DESC]]

注意:

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

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

语法格式:

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

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

SELECT DISTINCT 学生编号
FROM 成绩表;

 

select distinct * 
from 成绩表

 

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

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

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

select top 5 * 
from (
	select top 15 * 
	from 成绩表 
	order by 学生编号 asc
	) A 
order by 学生编号 desc

 

2. Where  条件

1)关系运算

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

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

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

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

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

 【例】in、not in

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

 

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

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

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

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

delete 成绩表 
where 学生编号 not in (
	select max(学生编号) 
	from 成绩表 
	group by 科目编号,班级编号,学生编号
)

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

【例】查询班级的总数

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

 

 6.使用GROUP BY分组

语法格式如下:

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

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

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

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

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

 

 7.使用ORDER BY排序

语法格式如下:

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

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

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

 

 8.INTO子句保存查询结果

语法格式如下:

SELECT * INTO 新表名

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

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

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

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

 【例】使用 SELECT * INTO 复制表

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

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

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

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

insert 学生表2
select * 
from 学生表

 

 三、多表连接查询

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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 组合,并消除表中所有重复行

语法格式如下:

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

 

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

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

语法格式如下:

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

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

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

语法格式如下:

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

 

子查询

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

语法格式如下:

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 完成子查询

select 学生成绩 
from 成绩表 
where 学生编号 not in(
	select 学生编号 
	from 学生表 
	where 学生姓名='马云'
)

 

【例】update中使用from子查询

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

 【例】delete 中使用from子查询

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

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

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

 

posted @ 2023-09-25 11:45  microsoft-zhcn  阅读(825)  评论(0编辑  收藏  举报