Mysql基础

2022-08-05 15:05:00  阅读 74 次 评论 0 条

SQL

DDL

#如果不存在则创建数据库
create database if not exists user default charset utf8mb4 collate utf8mb4_general_ci;
#查看所有数据库
show databases;
#使用数据库
use user;
#查看当前使用的是哪个数据库
select database();
#创建表
create table users (
    id int,
    name varchar(20) comment '年龄',
    age int,
    birth datetime
);
#查看所有表
show tables;
#查看创建表的语句
show create table user;
#查看表结构
desc user;
#添加新的字段
alter table user add email varchar(30);
#修改字段的数据类型
alter table user modify age tinyint unsigned comment '年龄';
#修改字段名和字段的数据类型
alter table user change birth birthday date comment '生日';
#删除字段
alter table user drop email;
#重命名表名
alter table user rename to user;
#截断表
truncate table user;
#如果存在则删除表
drop table if exists user;
#删库跑路
drop database if exists user;

DML

#给指定字段添加数据
insert into 表名(字段名1, 字段名2) values(值1, 值2, ...);
#给全部字段添加数据
insert into 表名 values(值1, 值2, ...);
#给指定字段添加多条数据
insert into 表名(字段名1, 字段名2) values(值1, 值2, ...),(值1, 值2, ...);
#添加多条数据
insert into 表名 values(值1, 值2, ...),(值1, 值2, ...);
#修改数据
update 表名 set 字段名1 = 值1, 字段名2 = 值2, ... [where 条件];
#删除数据
delete from 表名 [where 条件];

DQL

select
    字段列表
from
    表名列表
where
    条件列表
group by
    分组字段列表
having
    分组后条件列表
order by
    排序字段列表
limit
    分页参数
#查询多个字段
select 字段1, 字段2, ... from 表名;
select * from 表名;
#设置别名
select 字段1 [as 别名1] from 表名;
#去除重复记录
select distinct 字段列表 from 表名;

select * from user where name like "王%";
select * from user where name like "__";
select * from user where name is null;
select * from user where age in (20, 21, 22);
select * from user where age between 20 and 22;

select count(*) from sc;
select max(score) from sc;
select min(score) from sc;
select avg(score) from sc;
select sum(score) from sc;

select gender, count(*) from emp group by gender;
select gender, avg(age) from emp group by gender;
select workaddress, count(*) from emp where age < 30 group by workaddress;
select workaddress, count(*) num from emp where age < 30 group by workaddress having num >= 3;

select * from emp order by age [asc];
select * from emp order by age desc;
select * from emp order by age desc, entrydate desc;
#查询前10条记录
select * from emp limit [0,] 10;
#查询索引从3开始的10条记录
select * from emp limit 3, 10;

DCL

use mysql;
#查询所有用户
select * from user;
#创建用户
create user 'tao'@'localhost' identified by '123456';
create user 'test'@'%' identified by 'test';
#修改用户密码
alter user 'test'@'%' identified with mysql_native_password by '123456';
#删除用户
drop user 'test'@'%';

#查询用户的权限
show grants for '用户名'@'主机名';
#授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
#撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';

函数

字符串函数

函数 功能
concat(s1, s2, …, sn) 字符串拼接,将所有字符串拼接成一个字符串
lower(s) 将字符串s全部转成小写
upper(s) 将字符串s全部转成大写
lpad(s, n, pad) 左填充,用字符串pad对s的左边进行填充,达到n个字符串长度
rpad(s, n, pad) 右填充,用字符串pad对s的右边进行填充,达到n个字符串长度
trim(s) 去掉字符串s头部和尾部的空格
substring(s, start, len) 返回字符串s从start位置开始长度为len的字符串

数值函数

函数 功能
ceil(x) 向上取整
floor(x) 向下取整
mod(x, y) 返回x/y的模
rand() 返回0~1的随机数
round(x, y) 求参数x的四舍五入的值,保留y位小数

日期函数

函数 功能
curdate() 返回当前日期
curtime() 返回当前时间
now() 返回当前日期和时间
year(date) 获取指定date的年份
month(date) 获取指定date的月份
day(date) 获取指定date的日期
date_add(date, interval expr type) 返回一个日期/时间值加上一个时间间隔expr后的时间值
datediff(date1, date2) 返回起始时间date1和结束时间date2之间的天数

流程函数

函数 功能
if(value, t, f) 如果value为true,返回t,否则返回f
ifnull(value1, value2) 如果value不为null,返回value1,否则返回value2
case when [val1] then [res1] …else [default] end 如果val1为true,返回res1,否则返回default
case [expr] when [val1] then [res1] …else [default] end 如果expr的值为val1,返回res1,否则返回会default

约束

约束 描述 关键字
非空约束 限制该字段的数据不能为null not null
唯一约束 保证该字段的所有数据都是唯一、不重复的 unique
主键约束 主键是一行数据的唯一标识,要求非空且唯一 primary key
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 default
检查约束(8.0.16以后) 保证字段值满足某一个条件 check
外键约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 foreign key
create table user (
    id int primary key auto_increment comment '主键',
    name varchar(10) not null unique,
    age int check (age > 0 && age <= 120),
    status char(1) default '1',
    gender char(1)
);

#添加外键
create table 表名 (
    字段名 数据类型
    [constraint] [外键名称] foreign key (外键字段名) referemce 主表(主表列名)
);
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名);
#删除外键
alter table 表名 drop foreign key 外键名称; 
#外键的更新和删除行为
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名) on update cascade on delete cascade;

多表查询

内连接

#隐式内连接
select 字段列表 from 表1, 表2 where 条件 ...;
#显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件 ...;

外连接

#左外连接
select 字段列表 from 表1 left [outer] join 表2 on 连接条件 ...;
#右外连接
select 字段列表 from 表1 right [outer] join 表2 on 连接条件 ...;

自连接

select 字段列表 from 表1 别名1 join 表2 别名2 on 连接条件 ...;

联合查询

#union会对合并后的数据进行去重,而union all不会
select 字段列表 from 表1 ...
union [all]
select 字段列表 from 表2 ...;

子查询

select * from t1 where column1 = (select column1 from t2);

#标量子查询
select * from emp where dept_id = (select id from dept where name = '研发部');

列子查询

操作符 描述
in 在指定集合范围内,多选一
not in 不再指定集合范围内
any 子查询返回列表中,有任意一个条件满足即可
some 与any相同,使用some的地方都可以用any
all 子查询返回的列表的所有值都必须满足
select * from emp where salary > all(select salary from emp where dept_id = (select id from dept where name = '研发部'));

行子查询

select * from emp where (salary, managerid) = (select salary, managerid from emp where name = '小明');

表子查询

select * from emp where (job, salary) in (select job, salary from emp where name = '小明' or name = '小红');

事务

事务开启方式

#查看事务提交方式
select @@autocommit;
#设置事务提交方式
set @@autocommit = 0;
#提交事务
commit;
#回滚事务
rollback;

#开启事务
start transaction;
begin;

事务的四大特性

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability)︰事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

并发事务问题

问题 描述
脏读 一个事务读到另外一个事务还没有提交的数据
不可重复读 一个事务先后读取到一条记录,但两次读取的数据不同
幻读 一个事务按照条件查询数据时,没有对应的行,但是在插入数据时,又发现这行数据已经存在

事务隔离级别

隔离级别 脏读 不可重复读 幻读
读未提交
读已提交 ×
可重复读(默认) × ×
串行化 × × ×
#查询事务隔离级别
select @@transaction_isolation;
#设置事务隔离级别
set [session|global] transaction isolation level {read uncommitted|read committed|repeatable read|serializable};
本文地址:https://www.68686.ltd/?id=60
版权声明:本文为原创文章,版权归 wu1724 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?