MySQL基础篇总结
Posted !0 !
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL基础篇总结相关的知识,希望对你有一定的参考价值。
一、SQL的语言分类
-
DQL(Data Query Language):数据查询语言
如:select -
DML(Data Manipulate Language):数据操作语言
如:insert 、update、delete
-
DDL(Data Define Languge):数据定义语言
如:create、drop、alter -
TCL(Transaction Control Language):事务控制语言
如:commit、rollback
二、mysql的常用命令
-
查看当前所有的数据库
show databases;
-
打开指定的库
use 库名;
-
查看当前库的所有表
show tables;
-
查看其他库的所有表
show tables from 库名;
-
查看表结构
desc 表名;
-
查看服务器的版本
-
方式一:登录到mysql服务端
select version();
-
方式二:没有登录到mysql服务端
mysql --version 或者 mysql -V
-
三、DQL语句
1、基础查询
1)语法
select 查询列表
from 表名;
注意: 查询列表可以是:表中的字段、常量值、表达式、函数
2)示例
- 查询常量
- 用法:select 常量值;
注意: 字符型和日期型的常量值必须用引号引起来,数值型不需要
- 起别名
- 方式一:as
- 方式二:空格
注意: 如果别名有空格要用引号引起来
- 去重
- 用法:select distinct 字段名 from 表名;
- +号运算符
- 作用:做加法运算(不能做字符串拼接)
注意:
1、select 数值+数值; 直接运算
2、select 字符+数值;先试图将字符转换成数值,如果转换成功,则做加法运算;否则转换成0,再做加法运算
3、select null+值;结果都为null
- concat函数
- 作用:拼接字符
- 用法:select concat(字符1,字符2,字符3,…);
- ifnull函数
- 作用:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
- 用法:select ifnull(字符, 指定值) from 表;
- isnull函数
- 作用:判断某字段或表达式是否为null,如果是null则返回true,否则返回false
- 用法:select isnull(字符) from 表;
2、条件查询
1)语法
select 查询列表
from 表名
where 筛选条件;
2)筛选条件的分类
- 简单条件运算符
>
、<
、=
、<>
(不等于)、!=
、>=
、<=
、<=>
(安全等于)
- 逻辑运算符
&&
、and
(与)||
、or
(或)!
、not
(非)
- 模糊查询
like
:一般搭配通配符使用,可以判断字符型或数值型通配符
:%
任意多个字符,_
任意单个字符between and
in
is null /is not null
:用于判断null
值
isnull
和<=>
的区别
普通类型的数值 | null值 | 可读性 | |
---|---|---|---|
is null | × | √ | √ |
<=> | √ | √ | × |
3、常见函数
1)单行函数
- 字符函数
- concat:拼接字符串
select concat(str1,str2,…);
- substr(substring):截取子串
select substr(str, pos); //截取从pos开始的所有字符,MySQL中下标从1开始
select substr(str, pos, len) //截取从pos开始len个字符长度
- upper:变大写
select upper(str);
- lower:变小写
select lower(str);
- replace:替换
select REPLACE(str,from_str,to_str);//将str中from_str字符串全部替换成to_str字符串
- length:获取字节长度(一个字母占一个字节,一个汉字占三个字节)
select length(str);
- trim:去前后空格
select trim(str);
select trim(remstr FROM str) //移除str
前后的remstr
字符串
- lpad:左填充
select LPAD(str,len,padstr);//用padstr填充len个长度到str的左边
注意:如果len长度小于str的长度那么会截取从右往左的len个长度
- rpad:右填充
select RPAD(str,len,padstr);//用padstr填充len个长度到str的右边
注意:如果len长度小于str的长度那么会截取从左往右的len个长度
- instr:获取子串第一次出现的索引
select instr(str,substr); //str为母串,substr为子串
2.数学函数
- ceil:向上取整
select CEIL(X);
- floor:向下取整
select FLOOR(X);
- round:四舍五入
SELECT ROUND(X);
SELECT ROUND(X,D);//对X四舍五入,并且保留小数点后D位有效数字
- mod:取模
SELECT MOD(N,M);//N对M取余
- truncate:截断
select TRUNCATE(X,D);//保留小数点后D位
- rand:获取随机数,返回0-1之间的小数
select RAND();
- 日期函数
-
now:返回当前日期+时间
-
year:返回年
-
month:返回月
-
day:返回日
-
date_format:将日期转换成字符
-
curdate:返回当前日期
-
str_to_date:将字符转换成日期
-
curtime:返回当前时间
-
hour:小时
-
minute:分钟
-
second:秒
-
datediff:返回两个日期相差的天数
-
monthname:以英文形式返回月
序号 格式符 功能 1 %Y 4位的年份 2 %y 2位的年份 3 %m 月份(01,02…12) 4 %c 月份(1,2…12) 5 %d 日(01,02…) 6 %H 小时(24小时) 7 %h 小时(12小时) 8 %i 分钟(00,01…) 9 %s 秒(00,01…)
2)分组函数
- 分类
- max 最大值
- min 最小值
- sum 和
- avg 平均值
- count 计算个数
- 特点
-
语法
select max(字段) from 表名; -
支持的类型
sum和avg一般用于处理数值型
max、min、count可以处理任何数据类型 -
以上分组函数都忽略null
-
都可以搭配distinct使用,实现去重的统计
select sum(distinct 字段) from 表; -
count函数
count(字段):统计该字段非空值的个数
count(*):统计结果集的行数
count(1):统计结果集的行数
效率上:
MyISAM存储引擎,count(*)最高
InnoDB存储引擎,count(*)和count(1)效率>count(字段) -
和分组函数一同查询的字段,要求是group by后出现的字段
4、分组查询
1)语法
select 分组函数,分组后的字段
from 表
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】
2)注意
分组前筛选 | 分组后筛选 | |
---|---|---|
使用关键字 | where | having |
筛选的表 | 原始表 | 分组后的结果 |
位置 | group by的前面 | group by 的后面 |
5、连接查询
1)SQL92语法
- 等值连接
select 查询列表
from 表1 别名,表2 别名
where 表1.key=表2.key
- 特点:
1、表的顺序可以调换
2、等值连接的结果是多表交集部分
3、一般我们都会给表取别名(不强制,只是为了方便)
4、n个表连接至少要n-1个连接条件
- 非等值连接
select 查询列表
from 表1 别名,表2 别名
where 非等值的连接条件
- 自连接(自己和自己连接)
select 查询列表
from 表 别名1,表 别名2
where 等值的连接条件
2)SQL99语法
- 内连接(可以分为:等值连接、非等值连接和自连接)
select 查询列表
from 表1 别名
【inner】 join 表2 别名 on 连接条件
- 外连接
select 查询列表
from 表1 别名
left | right | full [outer] join 表2 别名 on 连接条件
- 特点:
1、左连接中左边的就是主表,右连接中右边的是主表,MySQL不支持全外连接
2、查询的结果会显示主表中所有的行,包括为空值的行
- 交叉连接(会产生笛卡尔积)
select 查询列表
from 表1 别名
cross join 表2 别名;
6、子查询
1)概念
嵌套在其他语句内部的select语句称为子查询或内查询;
外面如果有select语句,则称此语句为外查询或主查询。
2)分类
-
按结果集的行列
- 标量子查询(单行子查询):结果集为一行一列
- 列子查询(多行子查询):结果集为多行一列
- 行子查询:结果集为多行多列
- 表子查询:结果集为多行多列
-
按出现位置
- select后面:
仅仅支持标量子查询 - from后面:
表子查询 - where或having后面:
标量子查询
列子查询
行子查询 - exists后面:
标量子查询
列子查询
行子查询
表子查询
- select后面:
7、分页查询
1)语法
select 查询列表
from 表
limit 【offset,】 size;
2)注意
offset:起始的条目索引,默认从0开始
size:显示的条目数
8、联合查询
1)语法
查询语句1
union 【all】
查询语句2
union 【all】
2)注意
1、每条查询语句的查询列数必须一致
2、每条查询语句的查询的各列类型、顺序最好一致(不是必须,但是最好一致)
3、union 会自动去除重复项,union all会包含重复项
9、总结(sql语句执行顺序)
select 查询列表 --------------------------⑦
from 表1 别名 -----------------------------①
连接类型 join 表2 ------------------------②
on 连接条件 -------------------------------③
where 筛选 --------------------------------④
group by 分组列表 ----------------------⑤
having 筛选 -------------------------------⑥
order by排序列表 ------------------------⑧
limit 起始条目索引,条目数; ----------⑨
四、DML语句
1、插入
1)方式一
insert into 表名(字段名,...) values(值,...);
2)注意
1、要求值的类型和字段的类型要一致或兼容
2、字段的个数和顺序不一定与原始表中的一致,但必须保证值和字段一一对应
3、假如表中有可以为
null
的字段,我们可以同时省略字段和值或者在字段上填入null
4、字段名可以省略,默认所有列
3)方式二
insert into 表名 set 字段 = 值, 字段 = 值,......;
4)说明
我们一般常用方式一,因为方式一可以一次插入多行并且支持子查询
2、修改
1)方式一:修改单表的记录
update 表名 set 字段=值,字段=值 【where 筛选条件】;
2)方式二:修改多表的记录
update 表1 别名
left|right|inner join 表2 别名
on 连接条件
set 字段 = 值,字段 = 值
【where 筛选条件】;
3、删除
1)方式一:使用delete
删除单表的记录
delete from 表名 【where 筛选条件】【limit 条目数】
级联删除
delete 别名1,别名2 from 表1 别名
inner|left|right join 表2 别名
on 连接条件
【where 筛选条件】
2)方式二:使用truncate
truncate table 表名
3)【面试题】truncate和delete的区别
区别 | truncate | delete |
---|---|---|
删除后自增长开始位置 | 从1开始 | 从断点开始 |
是否可以添加筛选条件 | 不可以 | 可以 |
效率 | 高 | 低 |
返回值 | 无返回值 | 有返回值 |
是否可以回滚 | 不可以回滚 | 可以回滚 |
五、DDL语言
1、库的管理
1)创建库(为了增强健壮性会增加【if not exists】)
create database 【if not exists】 库名;
2)修改库(一般不用,一般用于修改字符集)
alter database 库名 character set 字符集名;
3)删除库
drop database 【if exists】 库名;
2、表的管理
1)创建表 ★
create table 【if not exists】 表名(
字段名 字段类型 【约束】,
字段名 字段类型 【约束】,
......
字段名 字段类型 【约束】
)
2) 修改表
①添加列
alter table 表名 add column 列名 类型 【first|after 字段名】;
②修改列的类型或约束
alter table 表名 modify column 列名 新类型 【新约束】;
③修改列名
alter table 表名 change column 旧列名 新列名 类型;
④删除列
alter table 表名 drop column 列名;
⑤修改表名
alter table 表名 rename 【to】 新表名;
3)删除表
drop table【if exists】 表名;
4) 复制表
①复制表的结构
create table 表名 like 旧表;
②复制表的结构+数据
create table 表名
select 查询列表 from 旧表【where 筛选】;
3、数据类型
1)数值型
① 整型
整数类型 | 字节 | 范围(可以类比java中的类型,不用记,知道就可以) |
---|---|---|
tinyint | 1 | -128~127 |
smallint | 2 | -32768~32767 |
mediumint | 3 | -8388608~8388607 |
int/integer | 4 | -2147483648~2147483647 |
bigint | 8 | -9223372036854775808~9223372036854775807 |
- 特点:
1、设置值时,默认有符号,如果需要设置无符号,在类型后面加一个unsigned,就可以设置成无符号
2、如果要插入的数据超出了数据范围,不会插入失败,而是会将最接近的临界值插入表中
3、每个默认会有一个长度(也可以自己设置长度),长度代表显示的最大宽度(不是数据范围),如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型。
② 浮点型
-
定点数:
- decimal(M,D)
-
浮点数:
- float(M,D) 4
- double(M,D) 8
特点:
1、
M
代表整数部位+小数部位的个数,D
代表小数部位
2、如果超出范围,并且插入临界值
3、M
和D
都可以省略,但对于定点数,M
默认为10
,D
默认为0
4、如果精度要求较高,则优先考虑使用定点数
2)字符型
-
较短的文本
- char
- varchar
- binary(较短二进制字符串)
- varbinary(可变较短二进制字符串)
- enum(枚举)
- set(集合)
-
较长的文本
- text
- blob(较大二进制文本)
char | varchar | |
---|---|---|
写法 | char(M) | varchar(M) |
M是否可以省略 | 可以省略,默认为1 | 不可以省略 |
特点 | 固定长度的字符 | 可变长度的字符 |
空间的消耗 | 大 | 小 |
效率 | 高 | 低 |
3)日期型
日期和时间类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
date | 4 | 1000-01-01 | 9999-12-31 |
datetime | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
timestamp | 4 | 19700101 080001 | 2038年的某个时刻 |
time | 3 | -8.8:59:59 | 838:59:59 |
year | 1 | 1901 | 2155 |
注意:timestamp比较容易受时区、语法模式、版本的影响,更能反映当前时区的真实时间
4、常见约束
1)六大约束
六大约束 | 名称 | 说明 |
---|---|---|
NOT NULL | 非空 | 该字段的值必填 |
UNIQUE | 唯一 | 该字段的值不可重复 |
DEFAULT | 默认 | 该字段的值不用手动插入有默认值 |
CHECK | 检查 | mysql不支持 |
PRIMARY KEY | 主键 | 该字段的值不可重复并且非空 |
FOREIGN KEY | 外键 | 该字段的值引用了另外的表的字段 |
2)主键和唯一的区别
主键 | 唯一 | |
---|---|---|
是否可以有多个 | 不可以 | 可以 |
能不能为空 | 不可以 | 可以 |
是不是唯一 | 唯一 | 唯一 |
是否支持组合键 | 支持,但不推荐 | 支持,但不推荐 |
3)外键的一些说明:
- 用于限制两个表的关系,从表的字段值引用了主表的某字段值
- 外键列和主表的被引用列要求类型一致,意义一样,名称可以不同
- 主表的被引用列要求是主键或者唯一键
- 插入数据,先插入主表;删除数据,先删除从表
- 可以通过以下两种方式来删除主表的记录
方式一:级联删除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
方式二:级联置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
4、创建表时添加约束
create table 表名(
字段名 字段类型 not null,#非空
字段名 字段类型 primary key,#主键
字段名 字段类型 unique,#唯一
字段名 字段类型 default 值,#默认
constraint 约束名 foreign key(字段名) references 主表(被引用列)
)
支持类型 | 可以起约束名 | |
---|---|---|
列级约束 | 除了外键 | 不可以 |
表级约束 | 除了非空和默认 | 可以,但对主键无效 |
注意:列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求
5)修改表时添加或删除约束
①非空
添加非空
alter table 表名 modify column 字段名 字段类型 not null;
删除非空
alter table 表名 modify column 字段名 字段类型 ;
②默认
添加默认
alter table 表名 modify column 字段名 字段类型 default 值;
删除默认
alter table 表名 modify column 字段名 字段类型 ;
③主键
添加主键
alter table 表名 add【 constraint 约束名】 primary key(字段名);
删除主键
alter table 表名 drop primary key;
④、唯一
添加唯一
alter table 表名 add【 constraint 约束名】 unique(字段名);
删除唯一
alter table 表名 drop index 索引名;
⑥、外键
添加外键
alter table 表名 add【 constraint 约束名】 foreign key(字段名) references 主表(被引用列);
删除外键
alter table 表名 drop foreign key 约束名;
6)自增长列
- 特点:
①不需要手动插入值,系统可以自动提供序列值,默认从1开始,步长为1
如果要更改起始值:手动插入值
如果要更改步长:set auto_increment_increment=值;
②一个表最多只能有一个自增长列
③自增长列只能支持数值型,不支持char
④自增长列必须为一个key
①创建表时设置自增长列
create table 表(
字段名 字段类型 约束 auto_increment
)
②修改表时设置自增长列
alter table 表 modify column 字段名 字段类型 约束 auto_increment
③删除自增长列
alter table 表 modify column 字段名 字段类型 约束
六、事务
1、含义
事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行
2、特点(ACID)
原子性(Atomicity):一个事务是不可再分割的整体,要么都执行要么都不执行
一致性(Consistency):一个事务可以使数据从一个一致状态切换到另外一个一致的状态
隔离性(Isolation):一个事务不受其他事务的干扰,多个事务互相隔离的
持久性(Durability):一个事务一旦提交了,则永久的持久化到本地
3、事务的使用步骤 ★
隐式(自动)事务:没有明显的开启和结束,本身就是一条事务可以自动提交,比如insert、update、delete
显式事务:具有明显的开启和结束
①开启事务
set autocommit=0;
start transaction;#可以省略
②编写一组逻辑sql语句
注意:sql语句支持的是insert、update、delete
设置回滚点:
savepoint 回滚点名;
③结束事务
提交:commit;
回滚:rollback;
回滚到指定的地方:rollback to 回滚点名;
4、并发事务
1)事务的并发问题
脏读:事务A读取了事务B更新的数据,然后B回滚,那么A读取的数据就是脏数据
不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据进行了更新并提交,导致事务A多次读取同一数据结果不一致。(注重更新)
幻读:A将数据库所有学生成绩从分数改成了等级,但是B在这个时候插入了一条带有分数的记录,当A改完之后发现还有一条记录没有改过来。(注重增删)
2)隔离级别
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
读未提交 | x | x | x |
不可重复读 | √ | x | x |
可重复读(MySQL默认) | √ | √ | x |
串行化 | √ | √ | √ |
以上是关于MySQL基础篇总结的主要内容,如果未能解决你的问题,请参考以下文章