目录
前置说明
1.本文所采用的示例是依赖于网站SELECT from WORLD Tutorial - SQLZoo
2.本文是学习了戴戴戴师兄的视频教程的笔记。
3.基于MySQL
4.关键字不区分大小写;","为英文逗号;SELECT选择的列名用","间隔;每个完整语句间用";"间隔;每行关键字可以换行来更清晰的表达语句 含义
1.SELECT&FROM
基本说明:
从哪个表中取出哪几列;select选中字段可以直接计算
SELECT 列名 FROM 表名
例:从world中表中取出name与population列
select name, population from world
例:计算人均gdp
select gdp/population 人均GDP from world
*与as说明:
SELECT *代表选择表中全部列;SELECT 列名 as 自定义名称 或直接省略as写成 SELECT 列名 自定义名称 表示用新的自定义名称替换为原列名
例:取出名字与人口,并重命名;取出整个表
select name 名字, population 人口 from world;
select * from world
distinct说明:
distinct位于select后面,对取出的字段去重,后面有多个列名则表示每一列内容都一样才会去重
例:取出name和continet并去重
select distinct name, population from world
2.WHERE
基本说明:
位于FROM字段后的可选项,用于SELECT选中内容的条件选择,常见如下
例:选择人口在200万到500万之间的国家
SELECT name, population
FROM world
WHERE population between 2000000 and 3000000
例:查询中国与加拿大人口
SELECT name, population
FROM world
WHERE name in ('China', 'Canada')
like说明:
like为模糊查询,"%"表示任何字符出现任意次数;"_"表示任何字符出现一次。
例:查询国家名中含有两个o且被两个字符隔开的国家名
SELECT name
FROM world
WHERE name like '%o__o%'
3.ORDER BY
基本说明:
代表排序的可选项,asc为升序。desc为降序,不写则默认为升序、
例:查询姓名以Sir开头的获奖者,获奖年份和科目,结果按照年份从近到远,再按照姓名升序
SELECT winner, yr, subject
FROM nobel
WHERE winner='Sir%'
ORDER BY yr desc, winner asc
in()说明:
字段在'()'中代表1,不在代表0
例:查询1954年获奖者名与科目,化学奖与物理学奖排在最后,然后按照科目升序,再按照名字升序
SELECT winner, subject
FROM nobel
WHERE yr=1984
ORDER BY subject in ('chemistry', 'physics'), subject, winner
4.LIMIT
基本说明:
限制查询结果显示行数的可选项; limit x, n代表从x+1开始返回n行;limit仅能在MySQL中使用
例:查询国家面积第4到第7的国家并展示
SELECT name, area
FROM world
ORDER BY area desc
LIMIT 3, 4
5.聚合函数&GROUP BY
基本说明:
聚合函数是一些可直接用函数
例:计算非洲国家总人口
SELECT sum(population) 非洲总人口
FROM world
WHERE continent = 'Africa'
例:返回表总行数,gdp列总行数
SELECT count(*), count(gdp)
FROM world
group by是对选中字段进行分组的可选项,常常与聚合函数联用,类似Excel中创建数据透视表
例:计算每个大洲的国家数
SELECT continent, count(name)
FROM world
GROUP BY continent
例:查询2013年至2015年每年每个科目的获奖人数,结果按照年份从大到小,人数从大到小排序
SELECT yr, subject, count(winner)
FROM nobel
WHERE yr between 2013 and 2015
GROUP BY yr, subject
ORDER BY yr desc, count(winner) desc
6.HAVING
基本说明:
对分组后的每行进行限定和筛选的可选字段
例:查询人口数大于10亿的大洲
SELECT continent
FROM world
GROUP BY continent
HAVING sum(population)>=1000000000
例:查询人口数至少为3亿的大洲和其平均gdp,其中只有gdp高于200亿且人口数大于6000万或者gdp低于80亿且首都中含有三个a的国家的计入计算,最后按照国家数从大到小排序,只显示第一行
SELECT continent, avg(gdp) 平均gdp
FROM world
WHERE (gdp>20000000000 and population>60000000) or (gdp<8000000000 and capital like '%a%a%a%')
GROUP BY continent
HAVING sum(population)>=300000000
ORDER BY count(name) desc
LIMIT 1
7.部分常见函数
数学
round(x,y):对x四舍五入保留y位;y为负数时保留小数点左侧对应位数为0,例:round(3.15, 1) = 3.2;round(12.15, -1) = 10
字符串
concat(s1, s2, ...):对s1、s2...进行拼接;其中任意一个为null,则结果为null
replace(s, s1, s2):用s2替换s中全部的s1
left(s, n), right(s, n):返回字符串s最左(右)边n个字符串,n为负数则倒数;
substring(s, n, len):从第n个开始len长度的子字符串。
字符转换
cast(x as type):将x转换为type类型值,type可以为char(n), date,time,datetime,decimal
时间类
year(date), month(date), day(date):获取年月日
date_add(date, interval 数字 type), date_sub(date, interval 数字 type):对date加或减指定时长,如date_add('2021-07-08 23:59:59', interval 3 month)
datediff(date1, date2):计算date1与date2之间的差
date_format(date, format):格式化时间
条件判断
if(e, v1, v2):e为真返回v1,否则返回v2。
case e when v1 then r1 when v2 then r2 ... else rn end:当e为v1时返回r1....否则返回rn。
8.SQL语句顺序与运行顺序
语句顺序:SELECT->FROM->WHERE->GROUP BY->HAVING->ORDER BY->LIMIT
运行顺序:FROM->WHERE->GROUP BY->HAVING->ORDER BY->LIMIT->SELECT