mssql 学习笔记【2】

来源:互联网 发布:www.ubuntu.org.cn 编辑:程序博客网 时间:2024/05/17 02:25

 select sname,sage,sdept
from s
where sno='990002'
返回学号为99002的学生 sanme sage sdept


select *
from s
where sage>20
返回年龄大学20的学生信息

990002是字符串类型所以加引号
20是数字类型所以不加引号

空值:该字段值未知 字段值不存在 该字段对表的记录不可用
空值不包括零 或空格组成的字符串 或零长度的字符串

select *
from sc
where grade is null
选课表中没有成绩的选课信息

select *
from sc
where grade=''
这样没有信息返回。由上可见空值不等于null


select *
from s
where sage between 20 and 22
选取年龄在20-22之间的所有学生信息


字符串数据范围用in

select sno as 学号 ,sname as 姓名
from s
where sdept in('计算机','外语')
同一表中字符床范围内的选取用in
选取s表中的计算机系和外语系学生的学号和姓名


select sno,sname,sage,sbirth
from s
where sdept='计算机'and sgentle='男'
选取同一表中计算机系男生的姓名、年龄、sbirth


select sno,sgentle,sname,sage,sbirth,sdept
from s
where sgentle='男'or sdept='计算机'
先把所有男生都查出来再把所有计算机系的查出来

select sno,sname,sage
from s
where sdept='计算机'or sdept='外语'
同一表中所有计算机系和外语系学生的sno,sname,sage


select *
from s
where sdept='计算机' and sgentle='男' and sage=20
年龄20岁计算机系男生信息


select *
from s
where (sdept='计算机'and sgentle='男')or (sdept='艺术'and sgentle='男') 

选取计算机系男生和艺术系男生的信息


逻辑运算符的优先级
not>and>or

使用了group bu 的字句
select 后面的列名: 1、常量 2、组合列 3、表达式,每个表达式为每组返回一个值 如聚合函数

select max(sage)最大年龄,sdept
from s
group by sdept
选取每个系部中年龄最大的学生,以系为单位输出信息

select sdept 系部,avg(sage)
from s
where sgentle='男'
group by sdept
--计算每个系部的男生的平均年龄 以系为单位输出

select avg(sage),sdept
from s
where sgentle='女'
group by sdept

select sno 学号,sdept 系部
from s
group by sdept,sno
with cube


having 子句用来对group by 字句增加数据过滤准则的

where 子句在分组之前去掉不满足条件的行
having 子句用在分组之后

having 子句可以包含内聚函数,但where子句不能
where 子句作用作用于表和试图, having 子句作用于分组

一般格式:
select 列名1 列名2,....聚合函数(列名n)
from 表名/试图名
group by 列名
having 条件

having 子句在group by子句之后

select max(sage) 最大年龄,sdept
from s
group by sdept
选取每个系部最大年龄的学生

select max(sage) 最大年龄,sdept
from s
group by sdept
having max(sage)>20

select max(sage) 最大年龄,sdept
from s
group by sdept
having max(sage)>20
选取每个系部最大年龄在20以上的的记录 按系部分组排列


order by 子句语法:

select 列名1,列名2,....列名n
from 表名
where 条件
[order by 列名1,[asc|desc][,列名2[asc|desc]][,...]]]

说明:
select 子句:该子句后面的参数可以是任意的字段名或别名、sql聚合函数、关键字(all、distinct、top等)
或其它select语句,用于选择一起检索的字段名称
from 子句:获取记录的表或试图的名称
where 子句: 附件条件表达式,在进行排序前对查询结果进行筛选
order by 子句:后面接要排序的字段名列表

可以对数字类型排序,也可以对字符串类型排序

asc 升序 desc降序

select *
from s
order by sage asc

选取学生表中所有数据并按年龄从小到大排序

默认升序,因此上述asc可省


select *
from s
order by sno desc


select *
from s
order by sdept

select *
from s
where sage>20
order by sage
选取年龄大于20 并按年龄升序排列
先where 再查询 查再排序


select max(sage) 最大年龄,sdept
from s
group by sdept
order by max(sage)
对每个系部学生的最大年龄进行分组,并按年龄小到大排序


select *
from s
order by sdept,sage
同一系部年龄从小到大


select *
from s
order by sdept desc,sage desc
先排系部,在排年龄

 

select 列名列表
[into 表名]
from 表名/视图名
[where 条件]
[group by 列名/聚合函数]
[ having 分组条件]
[order by 列名[asc|desc]]


select sdept,avg(sage)
from s
where sgentle='男'
group by sdept
having avg(sage)>20
order by avg(sage) desc
以系部为单位找出男生平均年龄大于20岁的系部名称及平均年龄,并以平均年龄为列进行降序排序

select 列名列表

from  表名/试图表名

where 条件

group by 列名 聚合函数

having 条件分组

order by 列名 [asc|desc]

先 where  再 group by 再 having 再 select 后 order

有join字句的select 先join 再 where  再 select


以系部为单位找出男生平均年龄大于20岁的系部名称及平均年龄,并以平均年龄为列进行降序排序
select avg(sage) 平均年龄, sdept
from s
where sgentle='男'
group by sdept
having avg(sage)>20
order by avg(sage) desc

年龄不小于19的计算机系的男生和外语系的女生的学号、姓名、年龄、性别和所属系部
列名为中文汉字 并以系部为单位排列,同一系部中按年龄降序排列

select sno,sname,sage,sgentle,sdept
from s
where sage>=19 and sdept='计算机'and sgentle='男' or sdept='外语' and sgentle='女'
order by sdept,sage desc

学生表中以系部为单位找出所有男生的平均年龄不小于20岁的系部名称及平均年龄
并将查询结果存储到新表stu3中

select sdept,avg(sage) 平均年龄
into stu3
from s
where sgentle='男'
group by sdept
having avg(sage)>=20
select *
from stu3

 

多表查询:

无条件多表查询:笛卡尔积形式
select s.sdept,c.cname,c.cgrade
from s,c

select distinct s.sdept,c.cname,c.cgrade
from s,c


select distinct  s.*,c.*
from s,c

等值多表查询:分为等值多表查询和非等值多表查询
select s.*,sc.*
from s,sc
where s.sno=sc.sno

select c.*,sc.*
from sc,c
where c.cno=sc.cno

非等值多表查询

select c.*,sc.*
from c,sc
where c.cno<>sc.cno


模糊查询
关键字like 一般只用于字符串数据类型
like运算符后面的字段值是完整值时 like与比较运算符“=”相同
select *
from s
where sname like '张忠和'

select *
from s
where sname ='张忠和'
--上述执行结果一样


通配符
_ 与任意单字符匹配
% 与包含一个或多个字符的字符串匹配
[]与特定范围中的任意单字符匹配如[abcdef]
[^]与特定范围之外的任意单字符匹配

 

连接查询
表之间的连接5种方式:
使用等值连接
使用笛卡尔积连接(即交叉连接)
使用自然连接
使用不等连接
使用外部连接