模糊查询 空值处理 数据排序oreder by 数据分组group by
--带条件查询
select
列名
from
数据源(表名,子查询的结果,视图)
where
条件(筛选一些行)
1--查询MyStudents数学成绩不及格的学生
select * from MyStudents
select
FId as 学号,FMath as 数学成绩
from MyStudents
where FMath<60 --60<=FMath and FMath<80
go
2--查询年龄大于20的男学生
select * from MyStudents
select
FName as 姓名,FAge as 年龄
from MyStudents
where FAge>20 and FAge<=30 and FGender='男'
go
3--between ..and 查询年龄在27-30之间的男学生
select * from MyStudents
select
FName as 姓名,FAge as 年龄
from MyStudents
where FAge between27 and 30 and FGender='男'
go
--------------------------------------------------
select * from Department-----部门表
insert into Employees(EmpName,EmpAge,EmpDepId)
values('吕布1',30,4)
insert into Employees(EmpName,EmpAge,EmpDepId)
values('吕布2',30,4)
insert into Employees(EmpName,EmpAge,EmpDepId)
values('吕布3',30,5)
insert into Employees(EmpName,EmpAge,EmpDepId)
values('吕布4',30,5)
insert into Employees(EmpName,EmpAge,EmpDepId)
values('吕布5',30,6)
insert into Employees(EmpName,EmpAge,EmpDepId)
values('吕布6',30,6)
insert into Employees(EmpName,EmpAge,EmpDepId)
values('吕布7',30,6)
-- 查询部门1、4、5中的员工
select
EmpName as 姓名,EmpDepId as 部门
from Employees
where EmpDepId=1 or EmpDepId=4 or EmpDepId=5 --where EmpDepId in(1,4,5)
-----------------------------------------------------------------------
--模糊查询----(针对字符串)
通配符:
%代表0个或多个字符
_代表任意一个字符
[]中括号里面的任意多的字符,只选一个
1--查询Mystudents中所有姓张的同学
select * from Mystudents
where FName like '张%'
2--查询姓名中只要包含一个敏字的
inter into MyStudents valuse('赵敏',24,'女',100,80)
select * from Mystudents
select * from Mystudents
where FName like '%敏%'
--查询最后一个字是敏的
select * from Mystudents
where FName like '%敏'
--查询所有姓王的同学,姓名的字数必须为3个
select * from Mystudents
where FName like '王_'
select * from Mystudents
where FName like '王%'and LEN(FName)=3
--查询姓名中有“磊”或“伟”
select * from Mystudents
where FName like '%[磊伟]%'
--姓名中没有磊或伟的
select * from Mystudents
where FName like '%[^磊伟]%'
--姓名以X开头,Y结尾的,没有磊或伟的
select * from Mystudents
where FName like 'x[^磊伟]y'
--查询姓名中包含%的所有人
select * from Mystudents
where FName like '%[%]%'
--查询所有不姓王的学生
select * from Mystudents
where FName like '[^王]%'
select * from Mystudents
where FName not like '王%'
--------------------------------------------------------
--空值处理---null在设计页面必须大写
修改表
update Mystudents set
FMath=null where FName like '王%'
--查询所有数学成绩为null的同学
--数据库中只有三种逻辑结果true false nuknow,数据库中的null就是unknow
select * from Mystudents
where FMath is null
--不为null
select * from Mystudents
where FMath is not null
-------------------------
Isnull函数
select
FName,FAge,数学成绩=isnull(cast(FMath as varchar(50)),'缺考')
from Mystudents
where FMath is null
--同一个列上的数据类型必须一致,如果不一致就报错
-----------------------------------------------------------------------
--数据排序oreder by (集合中的数据是无序的,如果排序之后有序了之后“游标”,集合
可以作为一个查询的数据源,但是有序了的“游标”是不能作为数据源的。)
select * from
(select * from MyStudent where Fage>30) as tb1
select * from
(select top 5 * from MyStudent where Fage>30 order by FAge desc) as tb1
--oreder by 数据排序
按英语成绩降序排列
select * from Mystudents
oreder by FEnglish desc
--先按英语成绩排序再按再按数学成绩排序(先按英语成绩相同的再按数学排序)
select * from Mystudents
oreder by FEnglish desc,FMath desc,FAge asc
--查询学生表中的成绩信息显示,姓名,性别,英语成绩,数学成绩,平均分
select
Fname as 姓名,
FGender as 性别,
FEnglish as 英语成绩,
FMath as 数学成绩
平均分=(FEnglish+FMath)/2
from Mystudents
oreder by (FEnglish+FMath)/2 desc -----oreder by 平均分 desc
---------------------------------------------------------------
--数据分组group by --(数据挖掘)
--统计Mystudents中男生和女生的个数
select
性别=FGender,
count(*) as人数
from Mystudents
group by FGender
--查询Employees表,每个部门Id和这个部门的男性人数
1.找这个公司
2.对公司里的所有人喊:男的都出来
3.让他们按照部门id站成几堆
4.艾堆数人头
select * from Employees
select
部门id=EmpDepId,
人数=count(*)
from Employees
where EmpGender='男'
group by EmpDepId --------没有在group by中出现的字段,也不能出现在select中。
having 语句对组进行筛选的。where也是进行筛选的。
区别:
where是在分组前进行筛选,having是在分组后进行筛选
having的使用方式与where一样可以用betwee and,in
例如:
1.查询男性人数大于3人的部门
select
部门号=EmpDepId,
部门男性人数=count(*)
from Employees
where EmpGender='男'
group by EmpDepId
having count(*)>3
2.统计一下MyStudents那个表中的男同学和女同学的个数,列出人数大于20的
select
性别=FGender,
人数=count(*)
from MyStudents
group by FGender
having count(*)>20
SQL语句执行顺序
from
where
group by
having
select----选择列>distinct>top
order by
select
count(distinct(FGender)) as 性别,
count(*)as 人数
from MyStudents
select top 5 * from MyStudents
order by FEnglish desc
1.热销售商品排名表,【即按照每种商品的总销售数量排序】。
select
商品名称=commodityName,
总销售数量=sum(saveNumber)
from MyOrders
group by commodityName
order by 总销售数量 desc
2.统计销售总价格超过 3000 元的商品名称和销售总价,并按照销售总价降序排列。
select
商品名称,
销售总价=SUM (销售价格*销售数量)
from MyOrders
group by 商品名称
Having SUM (销售价格*销售数量)>3000
order by 销售总价 desc
3.统计各个客户对“可口可乐”的喜爱程度(即统计每个购买人对“可口可乐”的购买数量)
select
购买人,
购买数量=COUNT (*),
购买名称='可口可乐'
from MyOrders
group by 购买人
order by 购买数量 desc