SQL Server 查询语句
一、表设计 以及 表数据
1.表设计
2.表数据
二、SELECT语法格式:
1 2 3 4 5 6 | SELECT [ ALL ︱ DISTINCT ][ TOP n][<目标字段表达式>[,…n]] [ INTO <新表>] FROM <表名或视图名>[,<表名或视图名>[…n]] WHERE <条件表达式>] GROUP BY <字段名l>[ HAVING <条件表达式>]] ORDER BY <字段名2>[ ASC ︱ DESC ]] |
注意:
- 当有多个数据源(表或视图),使用“ , ”分隔
- 数据源可以使用别名,即数据源名 AS 别名
1.返回数据表中的指定列
语法格式:
1 | SELECT [ ALL ︱ DISTINCT ][ 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.学生编号) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?