SQL Server 查询语句
一、表设计 以及 表数据
1.表设计
2.表数据
二、SELECT语法格式:
SELECT [ALL︱DISTINCT][TOP n][<目标字段表达式>[,…n]] [INTO <新表>] FROM <表名或视图名>[,<表名或视图名>[…n]] WHERE <条件表达式>] GROUP BY <字段名l>[HAVING <条件表达式>]] ORDER BY <字段名2>[ASC︱DESC]]
注意:
- 当有多个数据源(表或视图),使用“ , ”分隔
- 数据源可以使用别名,即数据源名 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.学生编号)