SQL学习听课笔记
学习平台:sqlzoo网站
语法结构 select 字段名from 表名where 表达式group by字段名having表达式orderby字段名 asc|desc limit位置偏移数|行数
运行顺序from—where—group by—having—order by—limit—select
知识点一
- Select * from 查询显示所有字段
- Select 字段 as 别名((1)as后加别名,在字段显示前赋予别名显示,表以别名的形式显示;(2)as前后有空格;别名不会修改到原数据表中的原名;(3)简写:as可以省略—select 字段 别名)eg:如图所示
3.去重:select distinct 字段 from 表名(得到去重后的数据),(distinct紧紧跟随select)以下是对比图:
4.Select表中没有的字段可以通过加减乘除进行运算的字段都可以直接进行计算并且赋予别名(eg: 人均gdp: gdp/population as 人均gdp)
知识点二(where)
- where 跟随在from表名之后,用来筛选条件的
- 运算符:
Eg: 查询瑞典、挪威的国家名和人口(in中的条件是or的关系)
Select name,population from world where name in(“Sweden”,”Norway”)
查询面积在250000和300000之间的国家名和面积(between and 默认是包含250000和300000的数据,如果要剔除,可以使用!=300000就不包含该数据)
Select name,area from world where area between 250000 and 300000
3.模糊查询:like
%多个占位字符;_单个占位字符
Eg:查询国家名以C开头ia结尾的国家
Select name from world where name like “C%ia”
查询国家名中第二个字符为t的国家
查询国家名中含有两个o且被两个字符隔开的国家名
- 多条件查询
查询国家名中含有三个a且面积大于60万的国家及面积
查询国家中含有三个a且面积大于60万的国家及其面积,或者人口大于13亿且面积大于500万的国家及其面积(可带括号)
查询Nobel中年份小于1910的诺贝尔医学奖和年份大于等于2004的诺贝尔文学奖的所有信息
知识点三(order by排序)
- 编写规则:select 字段名 from 表名 where 表达式 order by 字段名 asc/desc
- Desc降序 asc 升序(order by 字段 desc 升序;order by 字段(asc)降序)
Eg:查询姓名以Sir开头的获奖者,获奖年份和科目,查询结果按照年份从金稻园排序,再按照姓名顺序升序排序。
查询1984年所有获奖者的姓名和奖项科目,结果将诺贝尔化学奖和物理学奖排在最后,然后按照科目排序,再按照获奖者姓名排序。
Select winner,subject from nobel where yr=1984 order by subject in("physics","Chemistry") [紫申1] ,subject,winner
[紫申1]满足Order by 后加入这个条件证明给该条件标注1,排序时该特殊条件就排到最后
知识点四(limit限制查询)
编写规则:limit n 返回查询结果的前n行
Limit x,n 意味着从第x+1行开始返回n行
Eg:查询面积排名前三的国家
Select name from world order by area desc limit 3
查询人口数在第四到第七的国家和人口 (limit x-1,n-x+1)
Select name,population from world order by population desc limit 3,4
知识点四(聚合函数和group by)
聚合函数:avg()求平均,count()求行数,max()求列最大值,min()求列最小值,sum()求列总和
Group by :规定依据哪个字段分组聚合
Eg:求非洲总人数(可切换avg,count,max,min函数)
- Count(*)计算表格行数(无论是否是空行都计算其中);count(字段名)计算指定字段下的总行数,但是计算时将忽略空值的行。
- Sum、avg、max、min函数必须指定字段进行聚合运算,无法使用*通配符,同时这些指定字段名的聚合函数都会忽略空值行。
Group by:
分组思想:去重分组,相同的字段放到一起分区,会创建出一个新的表格
Distinct去重:相同的字段剔除掉
聚合函数和group by 联用
Eg:查询2013至2015年每年每个科目的获奖人数,结果按年份从大到小,人数从大到小排序:(使用group by子句时,select只能使用聚合函数和group by引用过的字段,否则会报错)
练习题训练
- 查询每个大洲和该大洲里人口数超过1千万的国家的数量
Having聚合后筛选
Eg:查询总人口数量至少为1亿的大洲
知识点:1、非聚合字段用where ;聚合后的用having(跟随在group by 后)
- Having只能使用聚合函数和group by分组的筛选
函数
- Round(x,y)四舍五入函数。
- Concat(s1,s2)链接字符串函数。eg:concat(“My”,” “,”sql”)返回My sql;concat(“My”,null”SQL”)返回null
- Replace(s,s1,s2) EG:replace(“MySQLMySQL”,”SQL”,”sql”)返回MysqlMysql
- Left(s,n)、right(s,n)、substring(s,n,len)截取字符串
- Cast(x as type)转换字符串类型
- Year()、mouth()、day()日期、
- Datediff(date1,date2) 计算两个日期之间间隔的天数
EG:datediff(2022-06-08,2022-06-01)返回1(前减后)
Date_format(date,format)将日期和时间格式化
Eg:查询国家名称及其首都名称都以相同的字母开头的国家名及其首都,且不能包括国家名称和首都名称完全相同的情况