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的常用命令

  1. 查看当前所有的数据库

    show databases;

  2. 打开指定的库

    use 库名;

  3. 查看当前库的所有表

    show tables;

  4. 查看其他库的所有表

    show tables from 库名;

  5. 查看表结构

    desc 表名;

  6. 查看服务器的版本

    • 方式一:登录到mysql服务端

      select version();

    • 方式二:没有登录到mysql服务端

      mysql --version 或者 mysql -V

三、DQL语句

1、基础查询

1)语法

select  查询列表 
from  表名;

注意: 查询列表可以是:表中的字段、常量值、表达式、函数

2)示例

  1. 查询常量
  • 用法:select 常量值;

注意: 字符型和日期型的常量值必须用引号引起来,数值型不需要

  1. 起别名
  • 方式一:as
  • 方式二:空格

注意: 如果别名有空格要用引号引起来

  1. 去重
  • 用法:select distinct 字段名 from 表名;
  1. +号运算符
  • 作用:做加法运算(不能做字符串拼接)

注意:

1、select 数值+数值; 直接运算
2、select 字符+数值;先试图将字符转换成数值,如果转换成功,则做加法运算;否则转换成0,再做加法运算
3、select null+值;结果都为null

  1. concat函数
  • 作用:拼接字符
  • 用法:select concat(字符1,字符2,字符3,…);
  1. ifnull函数
  • 作用:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
  • 用法:select ifnull(字符, 指定值) from 表;
  1. isnull函数
  • 作用:判断某字段或表达式是否为null,如果是null则返回true,否则返回false
  • 用法:select isnull(字符) from 表;

2、条件查询

1)语法

select 查询列表
from 表名
where 筛选条件;

2)筛选条件的分类

  1. 简单条件运算符

><=<>(不等于)、 !=>=<=<=>(安全等于)

  1. 逻辑运算符
  1. &&and (与)
  2. ||or (或)
  3. !not (非)
  1. 模糊查询
  1. like:一般搭配通配符使用,可以判断字符型或数值型
  2. 通配符%任意多个字符,_任意单个字符
  3. between and
  4. in
  5. is null /is not null:用于判断null
  1. isnull<=>的区别
普通类型的数值null值可读性
is null×
<=>×

3、常见函数

1)单行函数

  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();

  1. 日期函数
  • now:返回当前日期+时间

  • year:返回年

  • month:返回月

  • day:返回日

  • date_format:将日期转换成字符

  • curdate:返回当前日期

  • str_to_date:将字符转换成日期

  • curtime:返回当前时间

  • hour:小时

  • minute:分钟

  • second:秒

  • datediff:返回两个日期相差的天数

  • monthname:以英文形式返回月

    序号格式符功能
    1%Y4位的年份
    2%y2位的年份
    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)分组函数

  1. 分类
  • max 最大值
  • min 最小值
  • sum 和
  • avg 平均值
  • count 计算个数
  1. 特点
  • 语法
    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)注意

分组前筛选分组后筛选
使用关键字wherehaving
筛选的表原始表分组后的结果
位置group by的前面group by 的后面

5、连接查询

1)SQL92语法

  • 等值连接
select 查询列表
from1 别名,2 别名
where1.key=2.key
  • 特点:

1、表的顺序可以调换
2、等值连接的结果是多表交集部分
3、一般我们都会给表取别名(不强制,只是为了方便)
4、n个表连接至少要n-1个连接条件

  • 非等值连接
select 查询列表
from1 别名,2 别名
where 非等值的连接条件
  • 自连接(自己和自己连接)
select 查询列表
from 表 别名1,表 别名2
where 等值的连接条件

2)SQL99语法

  • 内连接(可以分为:等值连接、非等值连接和自连接)
select 查询列表
from1 别名
【innerjoin2 别名 on 连接条件
  • 外连接
select 查询列表
from1 别名
left | right | full [outer] join2 别名 on 连接条件
  • 特点:

1、左连接中左边的就是主表,右连接中右边的是主表,MySQL不支持全外连接
2、查询的结果会显示主表中所有的行,包括为空值的行

  • 交叉连接(会产生笛卡尔积)
select 查询列表
from1 别名
cross join2 别名;

6、子查询

1)概念

嵌套在其他语句内部的select语句称为子查询或内查询;
外面如果有select语句,则称此语句为外查询或主查询。

2)分类

  • 按结果集的行列

    • 标量子查询(单行子查询):结果集为一行一列
    • 列子查询(多行子查询):结果集为多行一列
    • 行子查询:结果集为多行多列
    • 表子查询:结果集为多行多列
  • 按出现位置

    • select后面:
      仅仅支持标量子查询
    • from后面:
      表子查询
    • where或having后面:
      标量子查询
      列子查询
      行子查询
    • exists后面:
      标量子查询
      列子查询
      行子查询
      表子查询

7、分页查询

1)语法

select 查询列表
fromlimitoffset,】  size;

2)注意

offset:起始的条目索引,默认从0开始
size:显示的条目数

8、联合查询

1)语法

查询语句1
unionall】
查询语句2
unionall

2)注意

1、每条查询语句的查询列数必须一致
2、每条查询语句的查询的各列类型、顺序最好一致(不是必须,但是最好一致)
3、union 会自动去除重复项,union all会包含重复项

9、总结(sql语句执行顺序)

select 查询列表 --------------------------⑦

from1 别名    -----------------------------①

连接类型 join2  ------------------------②

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)方式二:修改多表的记录

update1 别名 
left|right|inner join2 别名 
on 连接条件  
set 字段 =,字段 = 值 
【where 筛选条件】;

3、删除

1)方式一:使用delete

删除单表的记录
delete from 表名 【where 筛选条件】【limit 条目数】

级联删除
delete 别名1,别名2 from1 别名 
inner|left|right join2 别名 
on 连接条件
【where 筛选条件】

2)方式二:使用truncate

truncate table 表名

3)【面试题】truncate和delete的区别

区别truncatedelete
删除后自增长开始位置从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 tableif 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中的类型,不用记,知道就可以)
tinyint1-128~127
smallint2-32768~32767
mediumint3-8388608~8388607
int/integer4-2147483648~2147483647
bigint8-9223372036854775808~9223372036854775807
  • 特点:

1、设置值时,默认有符号,如果需要设置无符号,在类型后面加一个unsigned,就可以设置成无符号
2、如果要插入的数据超出了数据范围,不会插入失败,而是会将最接近的临界值插入表中
3、每个默认会有一个长度(也可以自己设置长度),长度代表显示的最大宽度(不是数据范围),如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型。

② 浮点型

  • 定点数:

    • decimal(M,D)
  • 浮点数:

    • float(M,D) 4
    • double(M,D) 8

特点:

1、 M代表整数部位+小数部位的个数,D代表小数部位
2、如果超出范围,并且插入临界值
3、MD都可以省略,但对于定点数,M默认为10D默认为0
4、如果精度要求较高,则优先考虑使用定点数

2)字符型

  • 较短的文本

    • char
    • varchar
    • binary(较短二进制字符串)
    • varbinary(可变较短二进制字符串)
    • enum(枚举)
    • set(集合)
  • 较长的文本

    • text
    • blob(较大二进制文本)
charvarchar
写法char(M)varchar(M)
M是否可以省略可以省略,默认为1不可以省略
特点固定长度的字符可变长度的字符
空间的消耗
效率

3)日期型

日期和时间类型字节最小值最大值
date41000-01-019999-12-31
datetime81000-01-01 00:00:009999-12-31 23:59:59
timestamp419700101 0800012038年的某个时刻
time3-8.8:59:59838:59:59
year119012155

注意: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 表名 addconstraint 约束名】 primary key(字段名);

删除主键
alter table 表名 drop primary key;

④、唯一

添加唯一
alter table 表名 add【 constraint 约束名】 unique(字段名);

删除唯一
alter table 表名 drop index 索引名;

⑥、外键

添加外键
alter table 表名 addconstraint 约束名】 foreign key(字段名) references 主表(被引用列);

删除外键
alter table 表名 drop foreign key 约束名;

6)自增长列

  • 特点:

①不需要手动插入值,系统可以自动提供序列值,默认从1开始,步长为1
如果要更改起始值:手动插入值
如果要更改步长:set auto_increment_increment=值;
②一个表最多只能有一个自增长列
③自增长列只能支持数值型,不支持char
④自增长列必须为一个key

①创建表时设置自增长列

create table(
	字段名 字段类型 约束 auto_increment
)

②修改表时设置自增长列

alter tablemodify column 字段名 字段类型 约束 auto_increment

③删除自增长列

alter tablemodify column 字段名 字段类型 约束 

六、事务

1、含义

事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行

2、特点(ACID)

原子性(Atomicity):一个事务是不可再分割的整体,要么都执行要么都不执行
一致性(Consistency):一个事务可以使数据从一个一致状态切换到另外一个一致的状态
隔离性(Isolation):一个事务不受其他事务的干扰,多个事务互相隔离的
持久性(Durability):一个事务一旦提交了,则永久的持久化到本地

3、事务的使用步骤 ★

隐式(自动)事务:没有明显的开启和结束,本身就是一条事务可以自动提交,比如insert、update、delete

显式事务:具有明显的开启和结束

①开启事务
set autocommit=0;
start transaction;#可以省略

②编写一组逻辑sql语句
注意:sql语句支持的是insertupdatedelete

设置回滚点:
savepoint 回滚点名;

③结束事务
提交:commit;
回滚:rollback;
回滚到指定的地方:rollback to 回滚点名;

4、并发事务

1)事务的并发问题

脏读:事务A读取了事务B更新的数据,然后B回滚,那么A读取的数据就是脏数据

不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据进行了更新并提交,导致事务A多次读取同一数据结果不一致。(注重更新)

幻读:A将数据库所有学生成绩从分数改成了等级,但是B在这个时候插入了一条带有分数的记录,当A改完之后发现还有一条记录没有改过来。(注重增删)

2)隔离级别

脏读不可重复读幻读
读未提交xxx
不可重复读xx
可重复读(MySQL默认)x
串行化

以上是关于MySQL基础篇总结的主要内容,如果未能解决你的问题,请参考以下文章

MySQL基础篇总结

MySQL基础篇总结

MySQL 总结篇 [在Oracle基础上学习的MySQL]

MySQL基础篇(01):经典实用查询案例,总结整理

MySQL基础篇--在线DDL归纳总结

MySQL 子查询