3 SQL
3.1 SQL查询语言
新手学习网址:https://sqlzoo.net/wiki/SQL_Tutorial
-
- SQL查询语句语法结构和运行顺序
- 语法结构:select--from--where--group by--having--order by--limit
- 运行顺序:from--where--group by--having--order by--limit--select
- SQL查询语句语法结构和运行顺序
主知识点一:select&from
1加分号——运行两行代码,为什么报错?(好像是这个编译器不支持)
select name,population from world;select yr from nobel;
2 重命名——as别名中as可以省略,换成空格
select name as 国家,continent as大洲,population as人口 from world;
=等价于=
select name 国家,continent 大洲,population 人口 from world;
3去重——在需要去重的属性名(这里是continent)前面加distinct,但必须在select后面
select distinct continent from world;
4计算字段——加减乘除,还可以嵌套
select name,population,gdp,gdp/population 人均gdp from world
主知识点二:where
1查询特定人口数量,between不要写错
select name,population,gdp,gdp/population 人均gdpfrom worldwhere population between 200000000 and 300000000
2 查询德国人口,'Germany'字符串要打单引号
select name,population,gdp,gdp/population 人均gdpfrom worldwhere name='Germany'
3 多个内容查询,= 换成 in,还要加括号
select name,population,gdp,gdp/population 人均gdpfrom worldwhere name in ('Germany','Norway')
4模糊查询——like
● select 字段名
● from 表名
● where 字段名 like '通配符+字符'
通配符%和_可以结合使用
5多条件查询——and和or链接
select name,areafrom worldwhere name like '__t%'and area >=60000
运行结果:
● 【例题15】查询国家名中含有三个a且面积大于60万(600000)的国家及其面积,或者人口大于13亿(1300000000)且面积大于500万(5000000)的国家及其面积
注意:and的优先级高于or,所以是先算and,最后再考虑or,也可以加括号区分逻辑
主知识点三:排序order by
1看到通配符就要用like,
order by 属性名 desc(降序), 属性名 asc(升序)
● 【例题17】查询姓名以Sir开头的
获奖者(winner),获奖年份(yr)和科目(subject),
查询结果按照年份从近到远排序,
再按照姓名顺序升序排序。(题目要拆分明白!!!!)
代码:
select * from nobelwhere winner like 'Sir%'order by yr desc,winner asc
结果:
2 排序特殊值
● 【题目】查询1984年所有获奖者的姓名和奖项科目。结果将诺贝尔化学奖和物理学奖排在最后,然后按照科目排序,再按照获奖者姓名排序
分析:order by后面加入判断subject in ('physics','chemistry'),如果subject在括号中记为1否则为0,以此将特殊值排在后面。
代码:
select * from nobelwhere yr=1984order by subject in ('physics','chemistry'),subject,winner
结果:
主知识点四:限制limit
● 【例题18】查询面积排名前三的国家
分析:先排序,再取前三limit 3(不知道具体数值不能用where)
结果:
● 【例题19】查询人口数第1到第3的国家和人口(结果同上)
分析:
limit x,n意味从x+1行开始返回n行
如,第4到第7,共4行,就是在排序后使用limit 3,4
结果:
主知识点五:分组聚合 group by
1聚合函数如下:注意——函数忽略空值
● 【例题20】查询非洲总人口数
将sum函数依次修改为avg()、max()、min(),依次计算平均人口数、最大人口数、最小人口数。
2计算表格行数count
3聚合函数和group by联用
● 【例题24】查询每个大洲(continent)和大洲内的国家(name)数量
分析:
根据分组依据进行聚合运算,以“大洲”为聚合依据,对每个大洲内的“国家”数量进行聚合运算。
代码:
select continent,count(name)from worldgroup by continent
结果:
● 【例题25】查询2013至2015年每年每个科目的获奖人数,结果按年份从大到小,人数从大到小排序
代码:
select yr,subject,count(winner)from nobelwhere yr between 2013 and 2015 //查询2013至2015年group by subject,yr //每年每个科目order by yr desc,count(winner) desc //按年份从大到小,人数从大到小
结果:
● 【题目】查询每个大洲和该大洲里人口数超过1千万的国家的数量
分析:
(1)查询每个大洲和特殊国家的数量
(2)特殊国家:该大洲里人口数超过1千万的国家
(3)按照大洲分组就显示出的是每个大洲了
先后顺序不能变!!!
主知识点六:having
聚合区的筛选用where,聚合分组后的筛选用having
Having和where的区别是:运行顺序和对象不用
。。。未完待续,导师喊我干活了。。。