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)条件表达式

常量:单个指定数据值的符号(字母、数字、符号)

列名:表中列的名称

一元运算符:仅有一个操作数的运算符(+正数、-负数)

二元运算符:将两个操作数组合执行操作的运算符,可以是算数运算符、赋值运算符、位运算符、比较运算符、逻辑运算符、字符串串联运算符、一元运算符

杨书凡16.png

杨书凡17.png

   在查询LIKE运算符的SQL语句需要使用以下的通配符运算符:

杨书凡18.png


例如:要求查找“员工信息表”中电话号码前两位数为“13”,可以编写如下约束表达式

杨书凡19.png


(2)逻辑表达式

杨书凡20.png


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:查询每个季度的生产数量,百分比

杨书凡24.png

select 季度,sum(生产数量) AS 每个季度的生产数量,

str((sum(生产数量)/(select sum(生产数量) from 生产表))*100)+'%' AS 百分比

from 生产表

group by 季度

order by 季度




使用T-SQL实现多表查询

    前面的查询都是单表的查询。如果一个查询需要对多个表进行操作,就称为连接查询,就是通过各个表之间共同列的关联性来查询数据。


1. 内连接(INNER JOIN)

    内连接(INNER JOIN)是最常用的一种连接方式,只显示两个表中数据的集合部分

杨书凡21.png

案例:在表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. 合并两个结果集

杨书凡22.png

案例:将两个表的结果合并到一个结果显示

SELECT 姓名,学号,班级,国籍

FROM 二班

UNION

select +' '+,学号,班级,国籍

from 一班

order by 班级 desc,学号 asc


4. 自连接

杨书凡23.png

案例:查找每个员工的上司姓名

SELECT Y.员工姓名,S.员工姓名 AS 上司姓名

from 员工信息表 as Y inner join 员工信息表 as S

on Y.上司ID=S.员工ID


5. 交叉连接

    交叉连接就是表之间没有任何连接,左表与右表每一行一一组合,相当于两个表相乘

杨书凡25.png

SELECT T.教师姓名,C.课程名

from 教员基本信息表 AS T cross join 课程表 AS C