Mysql基本概念

80 阅读7分钟

SQL的语法结构:select,from,where,group by,having,order by,limit

SQL的运行顺序: from,where,group by,having,order by,limit,select


基础语句

select&from 

解释: select字段名决定这一段查询最后展示的字段;from表明指定这段查询语句涉及的数据来源

关键点:输出内容是select后跟的字段,顺序是select后字段顺序;单段无需在最后加分号

语句:select name, country, gdp from world

select * 查出表格所有字段并按原有顺序返回

别名: select name (as) 国家名 即把name重命名为国家名,as可加可不加,真实运用场景是不加的

数据去重:使筛选的列中不存在重复值(可一次性对多字段去重)

注意distinct 紧跟select

select dinstinct xx, xx  from xx

计算字段:select后加减乘除和函数都可以直接做


where

单条件查询

语法解释:where表达式限定查询行必须满足的条件;where核心子句是可选项,使用该子句是为了通过表达式筛选出符合查询条件的行数据

标准语法:select字段名 from 表名           where 字段名 运算符 值

运算符:where表达式中最常用的是运算符

where 运算符

关键点:

is null, 用于查询空值(NULL),空值不同于0,也不同于null字符串,='null'

查询若是数字,运算符后可直接跟数字;查询如是字符串,运算符后需要给字符串加上''

查询or筛选多个,用in: where 字段名 in ('字符串','字符串',....),以替代 where 字段名='字符串' or 字段名 ='' or ...

模糊查询

select 字段名 from 表名

where 字段名 like ‘ 通配符+字符’

通配符(占位符)用来匹配值的一部分,跟在like后面进行数据过滤。常用的通配符有%和_,%用来匹配多个字符可以是零个,一个也可以是多个,_仅能用来匹配单个字符

例子1:查询国家名称以c开头ia结尾

select name from world

where name like 'c%ia'

例子2:查询国家名称第二位是t

select name from world

where name like '_t%'

使用_占位符来占第一位

多条件查询

and 的优先级 大于 or,因此先用and进行并的逻辑都处理完之后,再用or处理或的逻辑。多条件可加括号

in 就是or的多选

between and 就是>= and <=;between and如果想去掉边界值可以用!=

order by 

标准语法:

select字段名

from表名

where 字段名 运算符 字符串/值

order by 字段名 asc/desc,后可加多个字段

语法解释:orber by 字段名规定查询出的结果集显示的顺序

order by 后可以加条件,例如order by subject in ('Chemistry', 'Phyics'), subject, winner。意义是把科目为化学和生物的行放到最后,定义为1,自然排在其他为0的后面,然后再对科目和获奖者按首字母a-z排序

limit

语法解释:限制最后展示多少行 limit x,n

select name from world

order by population desc

limit 3

返回排名第三

limit 2,5

返回排名3到7

聚合函数&group by

select 字段名1

from 表名

where表达式

group by字段名1

oder by 字段名 asc/desc

limit位置偏移量,行数

语法解释:group by 字段名 规定依据哪个字段分组聚合,根据字段名多行合成一行

count(*)计算表总行数

聚合函数只能对某字段计算,自动忽略空值。

*非聚合字段要为聚合字段做依据

聚合函数类型

group by流程,首先将所选字段名进行按照相同字段分区(但不删除),然后去重分组(去重)。

group by+聚合函数,对group by的每个分组进行聚合运算。创建数据透视表。

having

having 放在group by 后,聚合后筛选(功能与where相同);where是聚合前筛选。

部分常见函数

round(x,y) 四舍五入函数——x为数值,y四舍五入的位数

concat(s1,s2,...)连续字符串函数——concat('my',' ','sql')输出为my sql。(任一字符串为null,则返回null)

replace(s,s1,s2,..)替代函数——replace('MySQLMySQL','SQL','sql')返回MysqlMysql

left(s,n)、right(s,n)&substring(s,n,len)——截取字符串一部分的函数。left(s,n)函数返回字符串s最左边n个字符,right则相反。substring函数返回字符串s从第n个字符起取长度为len的子字符串,n也可以是负数,倒着取,如果没有len,就直接取到最后。——left('abcdefg',3)返回abc,substring('abcdrfg',2,3)返回bcd,substring('abcdefg',-2,3)返回fg,substring('abcdefg',2)返回bcdefg。

length()——返回字符串长度 cast(x as type)——转换数据类型的函数。type参数可写成char(n),date,time,datetime,decimal等数据类型

日期时间函数——year(date), month(date),day(date)获取年月日的函数;date_add(date,interval expr type), date_sub(date,interval expr type)——对指定其实时间进行加减操作;datediff(date1,date2)——取日期间隔天数;date_format(date,format)——日期和时间格式化

条件判断函数——

if(expr,v1,v2)

case expr when v1 then r1[when v2 then r2]...[else rn]end

case when expr then v1 else v2 end 

高级语句

窗口函数

在现有表格上,开个窗进行分区和排序或偏移,得到需要的字段及其内容再组合进当前表内。

标准语法

over([partition by 字段名][order by字段名 asc/desc]) ---紧跟select后

语法讲解

over()中两个子句为可选项,partition by指定分区依据(不同于group by只分区不去重)order by 指定排序依据

*partition by 可不写,但order by必须写

计算函数

sum() count() min() max() avg()

排序窗口函数

为了返回排序,第几

rank()over()——跳跃式排序,数值相同,名次相同1,1,3,4

dense_rank()over()——并列连续性排序1,1,2,3

row_number()over() ——连续型排序,若相同则随机,不重复1,2,3,4 ntile(num) ——分桶进行排序1,1,1,2,2,2,3,3,3

偏移分析函数

在某个分区中,取上面的数据,求同化比。

*如果是求每周增长or同化比,不要对数据直接偏移7个,而是先取每周一weekday()=0,然后偏移1个求。

lag(字段名,偏移量)over() ——向上偏移

lead(字段名,偏移量)over()——向下偏移

其他函数

rows between xx preceding and xx following——限定分组范围,默认形式为 rows between xx preceding and current now

表连接

两个表基于一个共有字段,形成一张表。

完全连接——数字相乘增加,每一行都去对面表找,两边分别匹配。

内连接 inner join

from 表1 inner join 表2 on 表1.字段名 = 表2.字段名

在完全连接的基础上,只保留连接上的数据,未连接上的(一个表有这个行,另一个没有会显示null)则会被剔除。

左连接 left join 

保留左边表所有值,在完全连接基础上,把右连接的表未连接上的null值剔除。

右连接 right join

保留右边表所有值,在完全连接基础上,把左连接的表未连接上的null值剔除。

多表连接,若出现相同字段需要标明字段来自哪个表,若不同则不用。

子查询

子查询本身就是完整额查询语句,然后用英文括号包裹嵌套在主查询语句中,子查询可以多层嵌套。越在里面的子查询越先运行。

最常用的子查询运用在from和where中。

where子查询

筛选条件是未知的,要先筛选出这个筛选条件。确定的用><=不确定的用in。

from子查询

对窗口函数内容进行筛选,必须要子查询进行筛选。