所谓查询,就是对已经存在于数据库中的数据按特点的组合、条件或次序进行检索。查询功能是数据库最基本也是最重要的功能。
SELECT select_list
[INTO new_table_name]
FROM table_list
[WHERE search_conditions]
[GROUP BY group_by_list]
[HAVING search_conditions]
[ORDER By order_list[ASC|DESC]]
--example
从学生表里面查看部分学生信息
SELECT 学号,姓名,籍贯
FROM 学生信息
从学生表里面查看全部学生信息
SELECT *
FROM 学生信息
注意:此时*代表所有的属性
如果用户希望在查询返回结果中删除重复行,就可以在SELECT子句中使用DISTINCT关键字,也是一种聚合函数。
SELECT DISTINCT select_list
FROM table_name
--example
从学生表里面查看学生都来自什么地方
SELECT DISTINCT 籍贯
FROM 学生信息
DISTINCT去除重复只能针对某一列。
TOP语句用于规定要返回的记录的数目的语法
SELECT TOP n [PERCENT] * FROM table_name
--example
从学生表里面查询前100名不重复的学生姓名。
SELECT DISTINCT TOP 100 姓名
FROM 学生信息
可使用别名的方法根据需要对数据显示的标题进行修改
1. SELECT select_list 'new_name',··· FROM table_name
2. SELECT 'new_name'=select_list,··· FROM table_name
3. SELECT select_list as 'new_name',··· FROM table_name
--example
使用'NO'替换学号,'Name'替换姓名.'Sex'替换性别.
1. SELECT 学号 'NO',姓名 'Name',性别 'Sex' FROM 学生信息
2. SELECT 'NO'=学号,'Name'=姓名,'Sex'=性别 FROM 学生信息
3. SELECT 学号 as 'NO',姓名 as 'Name',性别 as 'Sex' FROM 学生信息
在进行数据查询时,经常需要对查询到的数据进行再次计算。
SELECT 属性1,属性2,'调整前属性'=属性3,'调整后属性'=属性3+运算符。
FROM table_name
--example
从学生表中输出学号,姓名,成绩,成绩-10
SELECT 学号,姓名,'调整前成绩'=成绩,'调整后成绩'=成绩-10。
FROM 学生信息
一般查询都不是针对全表所有行的查询,只是从整个表中选出满足制定条件的内容,这就要用到WHERE子句。
1.先确定表
2.确定要查询那些列
3.限制条件
SELECT select_list
FROM table_list
WHERE search_conditions
其中,search_conditions为选择查询结果的条件。SQL Server支持比较、逻辑、范围、列表、字符串匹配选择方法。
比较运算符包括:
>(大于)、<(小于)、=(等于)、>=(大于等于)、<=(小于等于)、!=(不等于)、!>(不大于)、!<(不小于),其中!=、!>、!<不是ANSI标准的运算符
--example
--1.查询籍贯是beijing的学生有那些?--比较
SELECT *
FROM 学生信息
WHERE 籍贯=‘beijing’
--2.查询籍贯是beijing,男学生有那些?--逻辑and 和 or
SELECT *
FROM 学生信息
WHERE 籍贯=‘beijing’ and 性别=‘男’
范围搜索返回介于两个指定值之间的所有值,可分为包括范围和排他范围两个类型。用BETWEEN和NOTBETWEEN
--3.查询成绩在(不在)70-80之间学生有那些?
SELECT *
FROM 学生信息
WHERE 成绩 BETWEEN 70 AND 80 --在
WHERE 成绩 NOT BETWEEN 70 AND 80 --不在
IN关键字使用户可以选择与列表中的任意值匹配的行
--4.查询成绩为60和100学生有那些?
SELECT *
FROM 学生信息
WHERE 成绩 IN(60,100)
like关键字搜索与制定模式匹配的字符串、日期或时间值。模式包含要搜索的字符串,字符串中可包含4中通配符的任意组合。
通配符 | 描述 |
---|---|
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符,也可以范围[a-d]或者[abcd] |
[^charlist] | 不在字符列中的任何单一字符也可以范围[^a-d] 或者[^abcd] |
--5.查询姓名中包括的学生有那些?
SELECT *
FROM 学生信息
WHERE 姓名 like '王%'
--6.查询姓名中包含大或小的学生有那些?
SELECT *
FROM 学生信息
WHERE 姓名 like '%[大小]%'
--7.查询姓名中不包含猪或狗的学生有那些?
SELECT *
FROM 学生信息
WHERE 姓名 like '%[^猪狗]%'
--8.查询没有参加考试的学生有那些?
SELECT *
FROM 学生信息
WHERE 成绩 is null
聚合函数对一组值执行计算,并返回单个值。
聚合函数有什么特点?
1.除了 COUNT 以外,聚合函数忽略空值。
2.聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用。
3.所有聚合函数都具有确定性。任何时候用一组给定的输入值调用它们时,都返回相同的值。
4.标量函数:只能对单个的数字或值进行计算。主要包括字符函数、日期/时间函数、数值函数和转换函数这四类。
T-SQL提供很多聚合函数,以下对部分讲解。
1、求总和,总分等:sum() --必须为数字列
--example
1.求某个班级总分
select Sum(成绩) as '总成绩' from 学生信息
2、求某一列平均数 :avg()
--example
2.求某个班平均成绩 ?
select avg(成绩) as '平均分' from 学生信息
3、最高分
--example
3.求某个班最高分?
select max(成绩) as '最高分' from 学生信息
4、最低分
--example
4.求某个班最低分?
select min(成绩) as '最低分' from 学生信息
5、求个数/记录数/项目数等:count()
--example
5.总人数?
select count(*) as '总人数' from 学生信息
6.有成绩的总人数
select count(成绩) as '总人数' from 学生信息 where 成绩 is not null
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
语法格式
SELECT column_name,aggregate_function(column_name)
FROM table_name GROUP BY column_name
--example
1.查询每个年级的总人数和班级数量
SELECT 年级,
SUM(学号) as '总人数',
count(DISTINCT 班级名称) as '班级数量',
FROM 学生信息表
GROUP BY 年级
--example
create table 成绩表
(
学号 int primary key identity(1801305351,1),
课程编号 varchar(8) not null,
成绩 int
)
insert into 成绩表(课程编号,成绩) values ('1000',100);
insert into 成绩表 values ('1000',88);
insert into 成绩表 values ('1000',55);
insert into 成绩表 values ('1001',55);
insert into 成绩表 values ('1002',55);
insert into 成绩表 values ('1000',35);
insert into 成绩表 values ('1000',5);
insert into 成绩表 values ('1002',55);
insert into 成绩表 values ('1002',95);
insert into 成绩表 values ('1001',85);
insert into 成绩表 values ('1001',15);
--查询每门课的最高分和最低分
select 课程编号,
MAX(成绩) as '最高分',
MIN(成绩) as '最低分'
from 成绩表
group by 课程编号
having通常与group by子句一起使用。相当一个用于组的where子句,制定组的搜索条件。having子句可以包含聚合函数,但where不可以。
--example
create table 成绩表
(
学号 int primary key identity(1801305351,1),
课程编号 varchar(8) not null,
成绩 int
)
insert into 成绩表(课程编号,成绩) values ('1000',100);
insert into 成绩表 values ('1000',88);
insert into 成绩表 values ('1000',55);
insert into 成绩表 values ('1001',55);
insert into 成绩表 values ('1002',55);
insert into 成绩表 values ('1000',35);
insert into 成绩表 values ('1000',5);
insert into 成绩表 values ('1002',55);
insert into 成绩表 values ('1002',95);
insert into 成绩表 values ('1001',85);
insert into 成绩表 values ('1001',15);
--查询每门课总分少于250分的课程。
select 课程编号,
sum(成绩) as '总分'
from 成绩表
group by 课程编号
having sum(成绩)<250
--example
create table 成绩表
(
学号 int primary key identity(1801305351,1),
课程编号 varchar(8) not null,
成绩 int
)
insert into 成绩表(课程编号,成绩) values ('1000',100);
insert into 成绩表 values ('1000',88);
insert into 成绩表 values ('1000',55);
insert into 成绩表 values ('1001',55);
insert into 成绩表 values ('1002',55);
insert into 成绩表 values ('1000',35);
insert into 成绩表 values ('1000',5);
insert into 成绩表 values ('1002',55);
insert into 成绩表 values ('1002',95);
insert into 成绩表 values ('1001',85);
insert into 成绩表 values ('1001',15);
--对成绩进行排序。
select *from 成绩表
order by 成绩 desc
--example
create table 成绩表
(
学号 int primary key identity(1801305351,1),
课程编号 varchar(8) not null,
成绩 int
)
insert into 成绩表(课程编号,成绩) values ('1000',100);
insert into 成绩表 values ('1000',88);
insert into 成绩表 values ('1000',55);
insert into 成绩表 values ('1001',55);
insert into 成绩表 values ('1002',55);
insert into 成绩表 values ('1000',35);
insert into 成绩表 values ('1000',5);
insert into 成绩表 values ('1002',55);
insert into 成绩表 values ('1002',95);
insert into 成绩表 values ('1001',85);
insert into 成绩表 values ('1001',15);
--对课程为1000并且成绩高于平均分的进行筛选。
select * from 成绩表
select 学号,成绩
from 成绩表
where 课程编号=1000 and 成绩>(select AVG(成绩)from 成绩表 where 课程编号=1000)
在这里插入代码片
--example
--查询课程为1000的学生的姓名,学号,成绩。
--用到学生表和成绩表
select 学生表.姓名,学生表.学号,成绩表.成绩 from 学生表,成绩表
where 学生表.学号=成绩表.学号 and 学生表.学号 in
(select 成绩表.学号 from 成绩表 where 课程编号=1000)
--example
create table 成绩表
(
学号 int primary key identity(1801305351,1),
课程编号 varchar(8) not null,
成绩 int
)
insert into 成绩表(课程编号,成绩) values ('1000',100);
insert into 成绩表 values ('1000',88);
insert into 成绩表 values ('1000',55);
insert into 成绩表 values ('1001',55);
insert into 成绩表 values ('1002',55);
insert into 成绩表 values ('1000',35);
insert into 成绩表 values ('1000',5);
insert into 成绩表 values ('1002',55);
insert into 成绩表 values ('1002',95);
insert into 成绩表 values ('1001',85);
insert into 成绩表 values ('1001',15);
CREATE TABLE 学生表(
学号 int IDENTITY(1801305351,2) NOT NULL,
姓名 varchar(8) NOT NULL,
性别 varchar(8) NOT NULL,
地址 varchar(8) NOT NULL
)
insert 学生表(学号,姓名,性别,地址) values( 1801305351 , '小猪' , '男' , '上海' )
insert 学生表(学号,姓名,性别,地址) values( 1801305353 , '小狗' , '女' , '深圳' )
insert 学生表(学号,姓名,性别,地址) values( 1801305355 , '小1' , '女' , '武汉' )
insert 学生表(学号,姓名,性别,地址) values( 1801305357 , '小2' , '女' , '背景' )
insert 学生表(学号,姓名,性别,地址) values( 1801305359 , '小3' , '女' , '北京' )
insert 学生表(学号,姓名,性别,地址) values( 1801305361 , '小4' , '女' , '杭州' )
insert 学生表(学号,姓名,性别,地址) values( 1801305363 , '小5' , '女' , '地域' )
insert 学生表(学号,姓名,性别,地址) values( 1801305365 , '小6' , '女' , '黑屏' )
insert 学生表(学号,姓名,性别,地址) values( 1801305367 , '小7' , '女' , '按时' )
insert 学生表(学号,姓名,性别,地址) values( 1801305369 , '小8' , '女' , '奇怪' )
insert 学生表(学号,姓名,性别,地址) values( 1801305371 , '小9' , '女' , '深圳' )
--1.多表数据 学号,姓名,课程标号,成绩。
select 学生表.学号,学生表.姓名,成绩表.课程编号,成绩表.成绩
from 成绩表 inner join 学生表
on 成绩表.学号=学生表.学号
create table 成绩表2
(
学号 varchar(15),
课程编号 varchar(2),
成绩 int
)
insert into 成绩表2
select 学号,课程编号,成绩 from 成绩表
where 成绩>70 and 课程编号='1003'