SQL知识点总结


select+from:部分现有字段、全部现有字段、新增计算字段

1. SQL语句是在数据库,还是在Datagrip\Navicat等GUI (图形用户界面)执行?
数据库
2. 使用Datagrip等软件连接数据库的正确流程包含哪些操作?
下载安装软件
安装驱动
填写参数
测试连接
刷新并选择架构
3. 连接数据库有哪些必须填写的参数?
Name/连接名称
Host/主机地址
User/用户
Password/密码
4. 为什么要使用Sublime?
可以创建sql笔记,方便储存和管理代码
5. Sublime有哪些常用的快捷键?
Ctrl+N:新建文件
Ctrl+S:保存文件
Ctrl+Shift+S:另存为文件
6. 使用Datagrip和Sublime写代码的流程是什么?
先构思代码,在Sublime里写好并命名,然后在Datagrip里运行调试
7. select*后还可以增加字段吗?
可以
8. mysql给字段别名的写法有哪些?
字段 as 别名
字段 空格 别名
9. 【from dsx_test.城市信息】中的dsx_test是表格所属的架构/数据库
是的
10. 针对某一架构新建查询控制台后,只能查询该架构下的表格
是的

select+from+where:筛选

select+from+where+group by:分组去重、聚合运算

1. where支持哪些筛选逻辑?

= != <> > < >= <=
in、not in
is null、is not null
and、or
= … and <= …
between … and …
like+通配符%:表示任何字符出现任意次数
like+占位符_:表示任何字符出现1次

2. where模糊筛选用什么?
like
3. group by是否相当于重新创建了一张表格?

group by会对字段进行分组去重,相当于Excel中创建透视表
4. group by会对表格进行哪些处理?
分组、去重、设置为聚合依据
相当于把字段拖到透视表的行
5. group by和聚合函数必须同时出现吗?
group by和聚合函数都可以独立使用
聚合函数可以针对整张表做聚合,此时无需group by指定聚合依据;
但若指定了聚合依据,聚合函数就会根据聚合依据进行聚合

知识点:
1.筛选条件中的文本要放在英文单引号内’’
where筛选的运行顺序在查询和计算前这样效率更高
2.select+distinct可以对查询结果进行去重
distinct在所有查询和计算完成后才进行(毕竟都没算出来到底有哪些数据,怎么去重?)
3.group by后的进行分组去重字段要与selcet后的非聚合字段保持一致
(只要是非聚合字段都是分组条件,都要提前放在group by后,包括数值度量)
group by是基于筛选后的数据创建透视表,即将group by后的字段添加到行维度(先分组再去重)
4.如果需要进行聚合运算,select后需要有作为聚合依据的非聚合字段,和进行聚合运算的聚合字段
(其实就是Excel数据透视表的结构)
group by后要有作为聚合依据的所有非聚合字段
5.count函数可以用count(distinct 字段)对字段进行去重计数


select+from+where+group by+having:聚合后筛选

select+from+where+group by+having+order by+limit:对输出的结果排序,并限制返回的行数

1. having对表格做了什么操作?
having对聚合后的数据做了筛选
准确说having是对聚合后的透视表中的字段做筛选,不是只对聚合字段使用,透视表中的非聚合字段也能筛选;
但从效率上来说,非聚合字段,在where阶段筛选掉就能减少数据量,提高计算效率
2. having和where的区别是什么?
where对聚合前的数据做筛选,
having对聚合字段后的数据做筛选
3. 什么时候用having?什么时候用where?
对聚合前的数据筛选不一定要用where,也可以用having,但是建议聚合前数据就用where筛选掉以提高效率,
但是只要是聚合后的透视表中的字段,having都可以做筛选。
对聚合后的数据筛选一定要用having,having也能对聚合后的聚合依据做筛选(即having也能对聚合前的数据做筛选)
4. 如何提高测试代码时的运行效率?
尽可能用where提前筛选数据;
在不排序的情况下使用limit,可以极大地提升查询效率,节省数据库的计算资源
(如果加了order by就会遍历全表做排序,还是对全表做了计算,不能节省运行效率)
5. order by默认升序还是降序?
默认升序
6. select+from+where+group by+having+order by+limit的运行原理与顺序是什么?
from、where、group by、having、select、order by、limit

知识点:
1.having可以直接在group by创建透视表后,就提前运算聚合字段,并对依据聚合字段对透视表进行筛选
理论上having相当于Excel透视表中的标签和值筛选,所以也可以对非聚合字段进行筛选。
但实际规范中,只对聚合字段进行筛选,非聚合字段还是要交给前置的where进行,这样效率更高
2.order by可以在查询完成后对最终输出的结果进行排序;order by默认升序,降序需要在字段后加desc
order by后可以跟多个字段,并且和group by一样,可以用数字简写指代select后的字段
3.limit可以按表格最终的排序限制输出的行数,limit n则只展现前n行
limit还可以指定开始返回的起点,[limit x,n]则返回第x+1行开始的n行到x+n行,例如[limit 10,2],则返回第11行和第12行
使用limit,可以极大地提升查询效率,节省数据库的计算资源


select+from+join on+以上全部:连接不同表格的数据(双表单连接键、双表多连接键、多表单连接键)

1. join到底是什么?
join是一种【遍历匹配所有,不断向下增添】的运算逻辑
2. join连接会导致几种不同的计算结果?
三种
一对一:基于连接键一一匹配数据,没有数据重复
一对多:连接键唯一的表格,每次连接数据都会重复一次
多对多:连接将会产生大量的重复数据(笛卡尔积)
3. inner/left/right/full四种连接方式有什么不同?到底为什么不同?
inner/left/right/full只是基于连接键是否为空值的筛选方式,相当于加了个 where 连接键 is not null。
左连接-剔除左表连接键为空的所有行,相当于删除了右表没连接上的数据,导致右表的数据缺失,最后保留下左表的所有数据;
右连接-剔除右表连接键为空的所有行,相当于删除了左表没连接上的数据,导致左表的数据缺失,最后保留下右表的所有数据;
内连接-剔除左表和右表连接键为空的所有行,最后只保留连接键匹配上的数据;
完全外部连接-不剔除任何数据
4. join在哪两个核心语句之间运行?
from和where
5. mysql中支持full join吗?
不支持
需要用union/union all将两个左右连接上下连接到一起
6. union 和 union all 的区别是什么?
同:
union 和 union all都可以将多个结果集合并,而不仅仅是两个,所以可将多个结果集串起来。
使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的,但列名则不一定需要相同。
异:
(1) 对重复结果的处理不同
union all 是直接连接,取到得是所有值,记录可能有重复;union 是取唯一值,记录没有重复。
(2) 对排序的处理不同
union 将会按照字段的顺序进行排序;union all 只是简单的将两个结果合并后就返回。
从效率上说,union all 要比union快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用union all。
7. 其他类型的语句要不要学?
做数据分析师只要学查询语句即可
求职也需要了解一下一些其他语句
8. SQL语句到底要不要大写?
可以小写
一开始SQL语句需要大写才能被数据库识别为命令,但现在数据库越来越智能,工具也会自动用颜色标记语句,大小写已经不会影响数据库的执行和书写
并且,实际工作中根本没有那么多时间切换大小写,SQL语句应全部采用英文输入法小写输入
9. 逗号为什么要写字段前面?
怕忘记
10. join on后面为什么也可以跟筛选条件?
on后面直接加条件,相当于连接前筛选
但是SQL现在会自动优化代码运行的最优路径,所以没必要写前面,统一写后面更清晰还方便管理
11. select到底在order by&limit前还是后运行?
都可以,哪种效率高先运行哪个
如果数据很长,并且有limit,先排序限制,再查询
如果数据很宽,先查询,再限制

子查询:select子查询、from子查询、where子查询、having子查询

1. 以下快速组合出复杂的分步查询代码的步骤中,第一步是(聚合依据——group by)、
库表来源——from
连接关系——join in
筛选条件——where或者having(先列出来再决定)
聚合依据——group by
目标字段——select
2. 以下快速组合出复杂的分步查询代码的步骤中,最后一步是(分段编辑)
目标字段——select
库表来源——from
梳理思路
分段编辑
组合代码
3. 子查询相当于在Excel中做了中间表,分多步计算数据
是的
4. where in 的本质是什么?
本质就是一种先连接再筛选的简化写法,用子查询和表连接一样能实现
(即:连接上先查询出的数据,然后作为筛选条件)
5. 扎实的基础可以帮助我们高效地偷懒
是的
6. 什么时候要用上子查询?
逻辑里一步实现不了的,都可以用子查询做中间表
将查询结果作为下一次查询的筛选条件
将查询结果作为下一次查询的源表
需要先聚合一次,筛选后,再次聚合
对聚合后的字段进行筛选
7. 有哪些常见的子查询?
select子查询
from子查询
where子查询
having子查询
8. where子查询和having子查询都可以用from子查询+表连接筛选代替
是的
本质就是先查询出了一部分数据,连接回原表做筛选条件
9. select子查询可以向表格直接添加计算结果
是的
例如从别的表算一个平均值,然后直接放到当前的查询中作为一个字段
10. 【select 城市,avg(成交额) 平均成交额 from dsx_test.8月成交数据 group by 1】计算的是?
8月份全公司各城市下各业务组的每天的平均成交额
avg()是在当前聚合依据的内部求平均,城市内部数据是每个业务组每天一行,所以是平均到各业务组每天的成交额;
如果求城市平均,就要先聚合到城市再求城市平均,并且只返回一条城市平均成交额数据,如下:
【select avg(各城市成交额) 平均成交额 from (select 城市,sum(成交额) 各城市成交额 from dsx_test.8月成交数据 group by 1)

知识点:
1.where in 到底发生了什么?
Excel中可以用高级筛选,基于列表筛选数据
但这种筛选的本质还是表连接;因为不连接,两张表就没有联系;连接后,把没连上的空值筛选掉就好了
where in本质就是一种先连接再筛选的简化写法
由于复杂表之间的连接非常消耗运算资源,部分公司可能会禁止使用where in
此时你理解where in的本质是连接,就可以表连接实现筛选
2.select后可以直接跟子查询出的具体数值,还可以直接手写数据,方便跨表引用具体数据
简化连接:直接把数放到查询结果里
引用参数:引用另一张表的数值,作为参数进行计算
不过,这只是个低频用法,或者被逼无奈之举


窗口函数原理:partition by指定分区、order by指定顺序、rows指定范围

1. 有哪些经典场景需要用到窗口函数?
字段内部排序取第一
同环比
分位数
数据分组
2. 窗口函数在何时运行?
窗口函数在select中运行,如果select中有窗口函数,回到准备阶段,筛选聚合好的表格进行开窗运算
3. 窗口函数的排序序号可以直接where筛选吗?
不可以
窗口函数在select中运行,此时where已经筛选过了,所以必须要套子查询
4. 窗口函数有哪些子句?它们各自会对表格进行怎样的操作?
窗口分析函数: 指定计算类型
over : 进行开窗
partition by: 指定分区
order by: 指定排序
rows: 指定计算范围
5. 【avg(成交额)over(partition by 小组 order by 日期 rows between 3 preceding and 4 following)】计算的是几天的移动平均
8天
从前面第3行到后面第4行,会包含本行,所以是8行
6. 窗口函数可以指定任意字段做聚合运算吗?
可以
因为所有的聚合函数也都能对开窗结果进行运算
7. 窗口函数可以基于聚合运算结果进行运算吗? #-- 所有聚合函数也都能对开窗结果进行运算
可以
窗口函数在select里进行运行时,如果有聚合,那么透视表已经生成窗口函数是基于最后的表格结果进行开窗,
当然可以基于聚合运算结果进行运算
例如:比较sum(成交额)、sum(sum(成交额)) over(partition by 战区)、sum(sum(成交额)) over()的区别
8. row_number()、 dense_rank()、rank() 中用的最多的是哪个?
row_number()
9. row_number()、 dense_rank()、rank() 的描述正确的是
row_number(): 根据分区内的排序,分配唯一且连续排名序号 #-- row_number()会给出唯一连续排名,方便无论如何都能选出第一名,所以用得最多
dense_rank(): 根据分区内的排序,分配不唯一且连续排名序号 #-- dense_rank()则是不唯一且连续,大家可以同排名且不占名词,皆大欢喜,但用得很少
rank(): 根据分区内的排序,分配不唯一且不连续排名序号 #-- rank()是高考排名算法,可以同名,但是会顺延
10. lag()、lead()的描述正确的是
lag():返回前n行 #-- 先lag后lead
lead():返回后n行

知识点:
1.强化理解partition by指定级别进行运算
select
战区
,城市
,小组
,cast(replace(replace(replace(日期,‘年’,‘-’),‘月’,‘-’),‘日’,‘-’)as date) 日期
,成交额 小组每天的成交额
,sum(成交额)over() 全公司整个8月的成交额
,sum(成交额)over(partition by 小组) 小组整个8月的成交额
,sum(成交额)over(partition by 战区) 战区整个8月的成交额
,sum(成交额)over(partition by 战区,日期) 战区当天的成交额
,sum(成交额)over(partition by 城市) 城市整个8月的成交额
,sum(成交额)over(partition by 城市,日期) 城市当天的成交额
from dsx_test.8月成交数据
;
2.强化理解order by和rows指定顺序和范围运算
select
小组
,日期
,rank() over(partition by 小组 order by 日期) 小组该月第几天营业
,rank() over(partition by 小组 order by 成交额 desc) 小组该日成交额排当月第几
,成交额 小组每天的成交额
,sum(成交额) over() 全公司整个8月的成交额
,sum(成交额) over(partition by 小组) 小组整个8月的成交额
,sum(成交额) over(partition by 小组 order by 日期 rows
between unbounded preceding and unbounded following) 小组整个8月的成交额_between做法
,sum(成交额) over(partition by 小组 order by 日期) 小组累计到当日的成交额
,sum(成交额) over(partition by 小组 order by 日期 rows
between unbounded preceding and current row) 小组累计到当日的成交额_between做法
,sum(成交额) over(partition by 小组 order by 日期 rows
between unbounded preceding and 1 preceding) 小组累计到前日的成交额
,sum(成交额) over(partition by 小组 order by 日期 rows
2 preceding) 小组近3天累计的成交额_今天及前两天
,sum(成交额) over(partition by 小组 order by 日期 rows
between 2 preceding and current row) 小组近3天累计的成交额_今天及前两天_between做法
#,sum(成交额) over(partition by 小组 order by 日期 rows 2 following) 小组近3天累计的成交额_今天及后两天【following当前版本不支持单独使用】
,sum(成交额) over(partition by 小组 order by 日期 rows
between current row and 2 following) 小组近3天累计的成交额_今天及后两天_between做法
#,sum(成交额) over(partition by 小组 order by 日期 rows 3 following) 小组后3天累计的成交额_包含今天【following当前版本不支持单独使用】
,sum(成交额) over(partition by 小组 order by 日期 rows
between 1 following and 2 following) 小组后2天累计的成交额_不包含今天
,sum(成交额) over(partition by 小组 order by 日期 rows
between 3 preceding and 3 following) 小组近7天累计的成交额
,avg(成交额) over(partition by 小组 order by 日期 rows
between 3 preceding and 3 following) 小组近7天移动平均成交额
,max(成交额) over(partition by 小组 order by 日期 rows
between 3 preceding and 3 following) 小组近7天最大成交额
,min(成交额) over(partition by 小组 order by 日期 rows
between 3 preceding and 3 following) 小组近7天最小成交额
from (
select
小组
,cast(replace(replace(replace(日期,‘年’,‘-’),‘月’,‘-’),‘日’,‘-’)as date) 日期
,成交额
from dsx_test.8月成交数据
) a #-- 这里日期转换函数太长,每次都在窗里写太麻烦,因此做一次子查询
order by 小组,日期
;
3.滑动窗口函数子句:
当前行: current row
前n行: n preceding
后n行: n following
首行: unbounded preceding
尾行: unbounded following
4.分析函数:对排序后指定范围内的行进行指定类型的运算
聚合型:sum()、avg()、max()、min()、count()
专用型:row_number()、dense_rank()、rank()
first_value()、nth_value()
lag()、lead()
percent_rank()、cume_dist()、ntile()
5.典型窗口函数记忆:
全表总和:sum(成交额) over()
分区总和:sum(成交额) over(partition by 小组)
截止当天累计:sum(成交额) over(paritition by 小组 order by 日期)
近3天累计:sum(成交额) over(paritition by 小组 order by 日期 rows 2 preceding)
7日移动平均:avg(成交额) over(paritition by 小组 order by 日期 rows between 3 preceding and 3 following)
6.各种窗口分析函数:
1.根据排序分配序号【取最新数据、给排名】
(1)**row_number(): 根据分区内的排序,分配唯一且连续排名序号【用得最多】(1,2,3,4)
(2)dense_rank(): 根据分区内的排序,分配不唯一且连续排名序号 (1,2,2,3)
(3)rank(): 根据分区内的排序,分配不唯一且不连续排名序号【高考排行】 (1,2,2,4)
2.根据排序取具体字段数值【取第一名或最新数值】
(1)**first_value(字段): 根据分区内的排序,返回排在第一行的对应的字段数值 (降序就可以去最后一行对应的数值)
(2)nth_value(字段,n): 返回分区内的排序第n行的字段数值。如果第n行还未运行到,则返回null。n必须是正整数,例如1,2和3。
3.根据排序取上下几行的数值【求同环比】
(1)**lag(字段,n,默认值): 返回分区内,本行前n行的字段数值,如果为空则填充默认值
(2)lead(字段,n,默认值): 返回分区内,本行后n行的字段数值,如果为空则填充默认值
4.根据排序统计分布位置【算占比和分布】
(1)percent_rank(): 根据分区内的排序,从0开始统计当前行所在排序中的处于百分之多少的位置(不管指定值与分组序列中某值是否重复,均将此值视为序列一部分)
(2)**cume_dist(): 根据分区内的排序,从0之后开始统计当前行所在排序中的百分比分布位置(如果指定值与分组序列中某值重复,则将二值视为一个值处理)【更常用】
5.在排序内分组【分组、下发任务】
(1)ntile(n): 将排序内的行分为n组,根据分区内的排序,返回每一行是第几组


以上总结:

1. DataGrip、Navicate和Mysql数据库均可以运行SQL代码
错误
SQL代码的最终执行/运行是在数据库里进行的,前端界面只是负责连接数据库,管理代码并传输执行指令
2. SQL更擅长处理结构化、标准化的数据,包含各种合并单元格和合计的表格更适合用Excel等工具处理分值
是的
理论上只要进入数据库的数据都必须是标准数据,而SQL也是针对标准数据处理设计的,这也是SQL语法简洁的原因
3. SQL的正确学习方法是
不会先想,想完再搜,搜完再想,最后再问
4. group by相当于重新创建了一张数据透视表
是的
5. 什么时候用having?什么时候用where?
对聚合后的数据筛选一定要用having;having也能对聚合后的聚合依据做筛选。
但是建议聚合前数据就用where筛选掉以提高效率,但只要是聚合后透视表中的字段,having都可以做筛选
6. limit 7,6会输出
第8行至第14行
7. 判断以下关于select语法描述
select只运行一次(错误)
select会运行2次甚至以上(正确)
select后新创建的一些字段可用于where筛选(正确)
select在最开始会运行(正确) #–先建立表头
select只在最后运行(错误)
select首先会给数据库传递表头,在where和group by中可以直接引用表头;最后运行将查询结果输出
8. 判断一下关于SQL语句运行顺序的描述
where在from后运行(正确)
where在group by后运行(错误)
having在group by后运行(正确)
having在where后运行(正确)
limit在order by后运行(正确)
窗口函数在group by前运行(错误)

select语句运行原理:from——join in——where——group by——having——select(发现select中有窗口函数,复制上述表格进行开窗运算,计算出结果后直接匹配回select)——order by——limit

9. limit和order by连用就无法节约数据库的缓存资源
是的
在不排序的情况下使用limit,可以极大地提升查询效率,节省数据库的计算资源
如果加了order by就会遍历全表做排序,还是对全表做了计算,不能节省运行效率
10. having只可以对作为分组依据的非聚合字段和任意分组后聚合运算的结果进行筛选,除了对象,having具体的语法和where几乎完全一致
是的
11. 窗口函数可以基于group by前的查询结果指定任意详细级别进行窗口函数的计算
错误
窗口函数是最后运行的,是group by创建了透视表之后再进行开窗的;group by之前能进行的操作只有join表连接和where筛选
12. 以下哪些是Mysql的窗口函数
rank() (是)
dense_rank() (是)
row_number() (是)
first_value() (是)
last_value() (是)
first() (不是)
last() (不是)
nth_value() (是)
lag() (是)
lead() (是)
percent_rank() (是)
cume_dist() (是)
ntile() (是)
13. 以下哪些是Mysql的时间函数
to_date() (不是)
date() (是)
year() (是)
now() (是)
dateformat() (不是)
dateadd() (不是)
datediff() (是)

date_format()和date_add()都有下划线,to_date是Oracle等数据库的用法,Mysql用cast(字段 as date)来转换字段类型

14. Mysql直接就支持full join语句

需要用union/union all将两个左右连接上下连接到一起
union 和 union all 的区别是什么?
同:union 和 union all都可以将多个结果集合并,而不仅仅是两个,所以可将多个结果集串起来。
使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的,但列名则不一定需要相同。
异:(1)对重复结果的处理不同
union all 是直接连接,取到得是所有值,记录可能有重复;union 是取唯一值,记录没有重复。
(2)对排序的处理不同
union 将会按照字段的顺序进行排序;union all 只是简单的将两个结果合并后就返回。
从效率上说,union all 要比union快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用union all。
15. Mysql8.0之前的版本并不支持窗口函数,因此无法实现窗口函数相应的功能

虽然没有窗口函数,但是通过复杂的传参连接,也可以实现窗口函数的各种功能,只不过比较复杂罢了。
16. 一处代码不规范,亲人会流两行泪。请问以下代码,亲人会流几行泪?
6处不规范,流12行泪
select
user_id
,months月份
from edw.dsx_listing_info as midw
where fullbid_date is not null and months = 6
and user id in (
select
distinct user_id
from (
select
user_id
,sum(case when months in (6,12) then 0 else 1 end) num
from edw.dsx_listing_info
where fullbid_date is not null
group by 1
having num = 0
) a
)
group by 1,2
order by 1,2
;
select
user_id
,months
from edw.dsx_listing_info
where fullbid_date <> ‘null’
and user_id in (
select count(distinct user_id)
from (
select
user_id
,sum(case when months in (6,12) then 0 else 1 end) num
from edw.dsx_listing_info
where fullbid_date <> ‘null’
group by 1
having num=0
) a
)
group by 1,2
order by 1,2
;
17. 以下代码,语法和逻辑错误有几处?
7处
18. 以下哪些说法是正确的?(全对)
生产环境不断存储T0(Today当天)的数据
T+1的0点开始,数据中心服务器集群开始运转,按照中心的数据库规则从生产环境备份、处理、存储、更新T时数据。
数据中心的数据库准备完毕后,数据平台会开始从数据中心提取数据,生成各种中间表
商业智能平台会从数据中心和数据平台自动提取数据生成各类报表、图表、看板,并通过邮件、网址推送给数据需求方
19. 复杂计算一定要在SQL中实现,以此减少在Tableau中的操作成本和计算性能

谁性能好,在谁那算,性能优化这里没有绝对


字段长度:char_length与length

**1. char_length():**单位为字符,不管汉字还是数字或者是字母都算是一个字符。
2. length(): 单位是字节,utf8编码下,一个汉字三个字节,一个数字或字母一个字节。gbk编码下,一个汉字两个字节,一个数字或字母一个字节。

插入记录的3种方式

1. 普通插入(全部字段):insert into table_name values (value1, value2, …)
普通插入(限定字段): insert into table_name (column1, column2, …) values (value1, value2, …)
多条一次性插入: insert into table_name (column1, column2, …) values (value1_1, value1_2, …), (value2_1, value2_2, …), …
2. 从另一个表导入: insert into table_name select * from table_name2 [where key=value]
3. 带更新的插入: replace into table_name values (value1, value2, …) (注意这种原理是检测到主键或唯一性索引键重复就删除原记录后重新插入)

修改记录的2种方式

1. 设置为新值: update table_name set column_name=new_value [, column_name2=new_value2] [where column_name3=value3]
2. 根据已有值替换: update table_name set key1=replace(key1, ‘查找内容’, ‘替换成内容’) [where column_name3=value3]

删除记录的2种方式

1. 根据条件删除: delete from tb_name [where options] [ [ order by fields ] limit n ]
2. 全部删除: truncate table tb_name(表清空,包含自增计数器重置)

表的创建、修改与删除

1.1 直接创建表
create table [if not exists] tb_name – 不存在才创建,存在就跳过
(column_name1 data_type1 – 列名和类型必选
[ not null – 该列非空
| primary key – 可选的约束,主键
| foreign key – 外键,引用其他表的键值
| unique – 唯一性约束,不允许两条记录该列值相同
| default default_value – 默认值
| auto_increment – 自增id
| comment comment – 列注释(评论)
], …
) [character set charset] – 字符集编码
[collate collate_value] – 列排序和比较时的规则(是否区分大小写等)
1.2 从另一张表复制表结构创建表:
create table tb_name like tb_name_old
1.3 从另一张表的查询结果创建表:
create table tb_name as select * from tb_name_old where options
2.1 修改表:
alter table 表名 [修改选项]
修改选项:
{ add column <列名> <类型> [first|after 字段名] – 增加列
| modify column <列名> <新类型> first – 将某一列放到第一列
| drop column <列名> – 删除列
| change column <旧列名> <新列名> <新列类型> – 修改列名
| modify column <列名> <新类型> [新约束] – 修改列类型或约束
| rename to <新表名> – 修改表名
| character set <字符集名> – 修改字符集
| collate <校对规则名> } – 修改校对规则(比较和排序时用到)
3.1 删除表:
drop table [if exists] 表名1 [ ,表名2]

索引创建、删除与使用

1.1 create方式创建索引:(常用)
create
[ unique – 唯一索引
| fulltext – 全文索引
] index index_name on table_name – 不指定唯一或全文时默认普通索引
(column1[(length) [desc|asc]] [,column2,…]) – 可以对多列建立组合索引
1.2 alter方式创建索引:
alter table tb_name add [unique | fulltext] [index] index_content(content) – 主键索引
2.1 drop方式删除索引:(常用)
drop index <索引名> on <表名>
2.2 alter方式删除索引:
alter table <表名> drop index <索引名>
3.1 索引的使用:
(1)索引使用时满足最左前缀匹配原则,即对于组合索引(col1, col2),在不考虑引擎优化时,条件必须是col1在前col2在后,或者只使用col1,索引才会生效;
(2)索引不包含有null值的列
(3)一个查询只使用一次索引,where中如果使用了索引,order by就不会使用
(4)like做字段比较时只有前缀确定时才会使用索引
(5)在列上进行运算后不会使用索引,如year(start_time)<2020不会使用start_time上的索引
3.2 不同索引的区别:
(1)主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候指定了主键,就会创建主键索引, create index不能用来创建主键索引,使用 alter table来代替。
(2)唯一索引:与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须一。
(3)普通索引:这是最基本的索引,它没有任何限制。
(4)全文索引:fulltext索引用于全文搜索。只有innodb和 myisam存储引擎支持fulltext索引、仅适用于 char,varchar和 text列。

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毛媛媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值