SQL语言中最主要、最核心的部分是它的查询功能。查询语句用来对已经存在于数据库的数据按照特定的组合、条件表达式或次序进行检索,使用SELECT语句来完成。
使用SELECT查询数据
1. SELECT语法结构
T-SQL中查询基本格式是有SELECT子句、FROM子句、WHERE子句组成的查询块:
select 列名 from 表名 where 查询限定条件
其中
* select 指定了想要查看哪些列的数据
* from 指定这些数据来自于哪些表
* where 指定了想要查看哪些行
SELECT语句的语法如下:
select 列名 //SELECT子句:指定查询列表字段,列名格式为“表.字段1,表.字段2”,如果查单个表,可简写为“字段1,字段2”
[into 新表名] //INTO子句:可选,将查询结果存放在一个新表中
from 表名 //FROM子句:指定查询数据的表名称
[where 查询限定条件] //WHERE子句:可选,查询条件,由字段组成的条件表达式或逻辑表达式
[group by 分组条件] //GROUP BY子句:可选,指定查询结果的分组条件,通常是一个列名,但不能是列的别名
[having 分组查询限定条件] //HAVING子句:指定分组搜索条件,通常与GROUP BY子句一起使用
[order by 排序规则esc|desc] //ORDER BY子句:指定查询结果的排序方式,默认为升序ESC;DESC表示
2. 表达式
表达式是符号和运算符的一种组合,并且可以对它求值得到单个数据值
(1)条件表达式
常量:单个指定数据值的符号(字母、数字、符号)
列名:表中列的名称
一元运算符:仅有一个操作数的运算符(+正数、-负数)
二元运算符:将两个操作数组合执行操作的运算符,可以是算数运算符、赋值运算符、位运算符、比较运算符、逻辑运算符、字符串串联运算符、一元运算符
在查询LIKE运算符的SQL语句需要使用以下的通配符运算符:
例如:要求查找“员工信息表”中电话号码前两位数为“13”,可以编写如下约束表达式
(2)逻辑表达式
3. 查询举例
(1)查询student表中成绩为90-100的学生所有信息
select * from student where 成绩 between 90 and 100
(2)查询student表中成绩低于90或高于95分学生信息
select * from student where 成绩<90 or 成绩>95
(3)查询student表中成绩为89、90、91分的学生信息
select * from student where 成绩 in (89,90,91)
(4)查询student表中所有姓刘的学生信息
select * from student where 姓名 like ‘刘%'
(5)查询student表中前5行的数据
select top 5 * from student
(6)查询student表中所有学生信息,按照成绩从高到低显示查询结果
select * from student order by 成绩 desc
4. 分组查询
分组查询就是将表中的数据按照一定的条件分类组合,在根据需要得到统计信息,通过group by子句可以实现
在group by子句查询中,select指定的列名要么是group by子句中指定的列,要么是聚合函数。聚合函数用于对一组值进行计算,并返回单个值,如求总和、最大值、最小值、平均值等。T-SQL中常见的聚合函数有SUM()、AVG()、MAX()、MIN()、COUNT()等
(1)查询student表中所有学生的总成绩,列表名显示为“总成绩”
select SUM(成绩)as 总成绩 from student
(2))查询student表中所有学生的平均成绩
select AVG(成绩)as 平均成绩 from student
(3)查询student表中所有学生的最高分和最低分
select MAX(成绩)as 最高分 MIN(成绩)as 最低分 from student
(4)查询student表中所有行数
select COUNT(*)as 总行数 from student
(5)查询student表中每个班级的总成绩
select SUM(成绩)as 总成绩 from student group by 班级
(6)查询student表中总成绩大于200的班级
select SUM(成绩)as 总成绩 from student group by 班级 having SUM(成绩)>200
(7)将student表中2班的学生信息保存到表student_new中
select * into student_new from student where 班级=2
5. 子查询
子查询就是查询中又嵌套的查询
案例1:查询student表中的最高分或最低分是哪个学生
select 姓名,成绩
from student
where 成绩=(select MAX(成绩) from student) or 成绩=(select MIN(成绩) from student)
案例2:查询每个季度的生产数量,百分比
select 季度,sum(生产数量) AS 每个季度的生产数量,
str((sum(生产数量)/(select sum(生产数量) from 生产表))*100)+'%' AS 百分比
from 生产表
group by 季度
order by 季度
使用T-SQL实现多表查询
前面的查询都是单表的查询。如果一个查询需要对多个表进行操作,就称为连接查询,就是通过各个表之间共同列的关联性来查询数据。
1. 内连接(INNER JOIN)
内连接(INNER JOIN)是最常用的一种连接方式,只显示两个表中数据的集合部分
案例:在表A和表B中使用内连接查询学生姓名、学校、职业
* 实现方式一:在where子句中指定连接条件,写法如下
select A.name 姓名A,A.school 学校A,B.name 姓名B,B.job 职业B
from A,B
where A.name=B.name
* 实现方式二:在from子句中使用inner join …on子句来实现,写法如下
select A.name 姓名A,A.school 学校A,B.name 姓名B,B.job 职业B
from A inner join B on A.name=B.name
2. 外连接
外连接是对内连接的扩充,除了将两个表中数据重复部分连接起来,还可以要求显示左侧或右侧全部的数据
(1)左外连接(LEFT JOIN)
左外连接的结果集包括左表的所有行
案例:在表A和表B中使用左外连接查询学生姓名、学校、职业
select A.name 姓名A,A.school 学校A,B.name 姓名B,B.job 职业B
from A left join B on A.name=B.name
(2)右外连接(RIGHT JOIN)
右外连接是左外连接的反向连接,其结果集包括右侧所有行
案例:在表A和表B中使用右外连接查询学生姓名、学校、职业
select A.name 姓名A,A.school 学校A,B.name 姓名B,B.job 职业B
from A right join B on A.name=B.name
(3)全连接(FULL JOIN)
全连接右成完整外连接,包括左表和右表中的所有行
案例:在表A和表B中使用完整外连接查询学生姓名、学校、职业
select A.name 姓名A,A.school 学校A,B.name 姓名B,B.job 职业B
from A full join B on A.name=B.name
3. 合并两个结果集
案例:将两个表的结果合并到一个结果显示
SELECT 姓名,学号,班级,国籍
FROM 二班
UNION
select 姓+' '+名,学号,班级,国籍
from 一班
order by 班级 desc,学号
4. 自连接
案例:查找每个员工的上司姓名
SELECT Y.员工姓名,S.员工姓名 AS 上司姓名
from 员工信息表 as Y inner join 员工信息表
on Y.上司ID=S.员工ID
5. 交叉连接
交叉连接就是表之间没有任何连接,左表与右表每一行一一组合,相当于两个表相乘
SELECT T.教师姓名,C.课程名
from 教员基本信息表 AS T cross join 课程表
https://blog.51cto.com/yangshufan/2044662