SQL数据查询
文章目录
1 select语法
select all|distinct <目标**列**表达式> 【列】
from <表名或视图名>(select语句)as <别名>
where<条件表达式>【行】
--只有符合having条件的组才可以输出
group by <列名1> HAVEING<条件表达式>
with {CUBE|ROLLUP}
order by<列名2>[ASC|DESC]
目标列表达式可以为列名,算数表达式,函数,字符串等。
where子句作用于基本表或者视图,从中选择满足条件的元组
having子句从group后的组中选择满足条件的组
总结一下自己的理解:
select相当于关系代数中的映射,是对列的操作,除了top 5 * 以外
where相当于关系代数里的选择操作,是对行的操作,where后边不可以使用聚集函数,having处和select处才可以使用聚集函数
group 是按指定列的值分组,比如,把学号相同的记录分为一个组,where筛选掉不需要参加分组的记录,
having时对分组后的记录进行筛选
order by 列名 ASC DESC默认升序
顺序:where-----group-----having
2 查询条件where
比较:
= 、>=、<=、<>
确定范围
between and (闭区间) not between and
确定集合
IN NOT IN
字符匹配
like not like
_匹配一个任意字符,包括一个汉字
%匹配0至多个任意字符
[]:指定范围内的任意单个字符,例如 LIKE’[CK]’,表示CK中的一个字符
[^ ] 和正则表达式一样的。
数据库字符集为ASCII 时一个汉字需要两个_,当字符集为GBK时只需要一个_
转义匹配,如果查询含有_的字符串 ,在前边加一个反斜杠 \
[not] like<匹配串> [escape换码字符’]
空值匹配
is null
is not nul
多重条件匹配
and , or , not
限制结果返回行数top
--选择前五行
select top 5 stu_no 学号,stu_name 姓名
FROM Student;
--3~5行记录---嵌套查询
select TOP 3* FROM student
where stu_no NOT IN (SELECT TOP 2 stu_no FROM student)
--集合的差 except
SELECT TOP 5 * FROM student
EXCEPT
SELECT TOP 2 * FROM student
---注意select * 代表选择所有列,即一行记录的所有属性,此时的select对行和列都进行了筛选,只是
行只能选择显示几行。
3 聚集函数
聚集函数只能用于select子句和group子句的having子句中
COUNT(*) | 统计元组个数 |
---|---|
COUNT([distinct|all]<列名>) | 统计一列中值的个数 |
SUM([distinct|all]<列名>) | 统计一列值的总和,must数值型 |
AVG([distinct|all]<列名>) | 统计一列值的平均值,must数值型 |
MAX([distinct|all]<列名>) | 求一列中的最大值 |
MIN([distinct|all]<列名>) | 求一列中的最小值 |
avg(),count()在统计时,会忽略为null的值。比如
在统计某学生选了多少门选课时,应该用count(cou_no),而不能用count(grade)
因为如果他缺考,成绩为null的话,这们选课就count()不到。
count(stu_no)统计学生人数时,也不会去掉相同学号的记录,就是说,count()不是集合操作,它只是数数符合条件的记录有几条。count(distinct stu_no)
4 字符串函数
CHARINDEX
用来寻找一个指定的字符串在另一个字符串中的起始位置
LEN
MySQL中为length
返回传递给它的字符串长度。
SELECT LEN(‘SQL SERVER课程’) ,返回12,空格也算哦
LOWER
把传递给它的字符串转换为小写
UPPER
把传递给它的字符串转换为大写
LTRIM
清除字符左边的空格,右边的不清除。
5 日期函数
6 数学函数
7 系统函数
注意CONVERT转换数据类型
MySQL·使用CAST
8例题:一组变一行
列用CASE语句表示,相当于把group后的一组数据变为一行数据
MAX使用原因,比如一个同学同一门课程考过两次(补考),也就是说符合学号和课程号的记录可能有多条,系统不知道选哪一条给我们看(二义性),或者使用MIN()也可以。
9 case用法
select Stu_no 学号,Cou_no 课程号,grade 成绩,case
when grade>=90 then '优秀'
when grade>=80 then '良好'
when grade>=70 then '中等'
when grade>=60 then '及格'
when grade is null then '缺考'
else '不及格'
end as '等级'
FROM SC
--注意case的用法。