MySql(干货)

写这篇博客的目的不是为了将介绍原理,而是为了Sql中的代码操作属实太多了,在这里进行一个汇总,方便查阅!!!

|-----|----------------------------|------------------------------|
| 分类 | 全称 | 说明 |
| DDL | Data Definintion Language | 数据定义语言,用来定义数据库对象 |
| DML | Data Manipulation Language | 数据库操作语言,用来对数据库表中的数据进行增删改 |
| DQL | Data Query Language | 数据查询语言,用来查询数据库的表的记录 |
| DCL | Data Control Language | 数据库控制语言,用来创建数据库用户,控制数据库的访问权限 |
[Sql分类]

DDL:

数据库操作

1.查询所有数据库

sql 复制代码
SHOW DATABASES

2.查询当前数据

sql 复制代码
select database() 

3.创建数据库

sql 复制代码
create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序
规则 ] 

#如果wincast存在的话则不用创建,不存在的话则直接创建
create database if not extists wincast

#创建一个wincast数据库并指定字符集
create database wincast default charset utf8mb4;

案例:

sql 复制代码
create database if not extists itcast;

4.删除数据库desc 表名 ;

sql 复制代码
DROP DATABASE [IF EXISTS] 数据库名

5.切换数据库

sql 复制代码
use 数据库名

表操作

1.查询当前数据库中的所有表

sql 复制代码
show tables;

2.查看指定表结构

sql 复制代码
desc 表名 ;

3.查询指定表的建表语句

sql 复制代码
show create table 表名 ;

4.创建表的结构

sql 复制代码
CREATE TABLE 表名(
字段1 字段1类型 [ COMMENT 字段1注释 ],
字段2 字段2类型 [COMMENT 字段2注释 ],
字段3 字段3类型 [COMMENT 字段3注释 ],
......
字段n 字段n类型 [COMMENT 字段n注释 ]
) [ COMMENT 表注释 ]

案例:

sql 复制代码
create table tb_user(
id int comment '编号',
name varchar(50) comment '姓名',
age int comment '年龄',
gender varchar(1) comment '性别'
) comment '用户表';

5.添加字段

sql 复制代码
ALTER TABLE 表名 ADD 字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];

案例:

sql 复制代码
#为emp表增加一个新的字段"昵称"为nickname,类型为varchar(20)
ALTER TABLE emp ADD nickname varchar(20) COMMENT '昵称';

6.修改数据类型

sql 复制代码
ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);

7.修改字段名和字段类型

sql 复制代码
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];

案例:

sql 复制代码
#将emp表的nickname字段修改为username,类型为varchar(30)
ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '昵称';

8.删除字段

sql 复制代码
ALTER TABLE 表名 DROP 字段名;

案例:

sql 复制代码
#将emp表的字段username删除
ALTER TABLE emp DROP username;

9.修改表名

sql 复制代码
ALTER TABLE 表名 RENAME TO 新表名;

案例:

sql 复制代码
#将emp表的表名修改为 employee
ALTER TABLE emp RENAME TO employee;

10.删除表

sql 复制代码
DROP TABLE [ IF EXISTS ] 表名;

案例:

sql 复制代码
#如果tb_user表存在,则删除tb_user表
DROP TABLE IF EXISTS tb_user;

11.删除指定表,并重新创建表

sql 复制代码
TRUNCATE TABLE 表名;

DML

添加数据

1.给指定字段添加数据

sql 复制代码
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);

案例:

sql 复制代码
#给employee表所有的字段添加数据 
insert into employee(id,workno,name,gender,age,idcard,entrydate)
values(1,'1','Itcast','男',10,'123456789012345678','2000-01-01');

2.给全全部字段添加数据

sql 复制代码
INSERT INTO 表名 VALUES (值1, 值2, ...);

案例:

sql 复制代码
#插入数据到employee表
insert into employee values(2,'2','张无忌','男',18,'123456789012345670','2005-01-
01');

3.批量的添加数据

sql 复制代码
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值
1, 值2, ...) ;


INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;

案例:

sql 复制代码
#批量插入数据到employee表
insert into employee values(3,'3','韦一笑','男',38,'123456789012345670','2005-01-
01'),(4,'4','赵敏','女',18,'123456789012345670','2005-01-01');

修改数据

sql 复制代码
UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ;

删除数据

sql 复制代码
DELETE FROM 表名 [ WHERE 条件 ] ;

DQL

基础语法

sql 复制代码
SELECT
   字段列表
FROM
   表名列表
WHERE
  条件列表
GROUP BY
  分组字段列表
HAVING
  分组后条件列表
ORDER BY
  排序字段列表
LIMIT
  分页参数

基础查询

1.查询多个字段

sql 复制代码
SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;
sql 复制代码
SELECT * FROM 表名 ;

2.字段设置别名

sql 复制代码
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
sql 复制代码
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;

3.去除重复记录

sql 复制代码
SELECT DISTINCT 字段列表 FROM 表名;

条件查询

1.语法

sql 复制代码
SELECT 字段列表 FROM 表名 WHERE 条件列表 ;

2.条件

|------------------|-------------------------|
| 比较运算符 | 功能 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| <>或!= | 不等于 |
| BETWEEN...AND... | 在某个范围之内(含最小、最大值) |
| IN(...) | 在in之后的列表中的值,多选一 |
| LIKE 占位符 | 模糊匹配(_匹配单个字符,%匹配任意一个字符) |
| IS NULL | 是NULL |
| == | 等于 |

|-----------|----------------|
| 运算符 | 功能 |
| ADD 或&& | 并且(多个条件同时成立) |
| OR 或 || | 或者(多个条件任意一个成立) |
| NOT 或! | 非,不是 |
[常用逻辑运算符]

聚合函数

语法:

sql 复制代码
SELECT 聚合函数(字段列表) FROM 表名 ;

|-------|------|
| 函数 | 功能 |
| count | 统计数量 |
| max | 最大值 |
| min | 最小值 |
| avg | 平均值 |
| sum | 求和 |
[常见的聚合函数]

分组查询

语法

sql 复制代码
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组
后过滤条件 ];

# 根据性别分组 , 统计男性员工 和 女性员工的数量
select gender, count(*) from emp group by gender ;

排序查询

语法

sql 复制代码
#ASC:升序(默认值) DESC:降序

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ; 1

#根据年龄对公司的员工进行升序
select * from emp order by age asc;
select * from emp order by age;

分页查询

语法

sql 复制代码
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
# 查询第1页员工数据, 每页展示10条记录
select * from emp limit 0,10;
select * from emp limit 10;

执行顺序

DCL

查询用户

sql 复制代码
select * from mysql.user;

创建用户

sql 复制代码
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

案例:

sql 复制代码
#创建用户itcast,只能够在当前主机localhost进行访问,密码123456
create user 'itcast'@'localhost' identified by '123456';

修改用户密码

sql 复制代码
# 修改用户heima的访问密码为1234;
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;

案例:

sql 复制代码
alter user 'heima'@'%' identified with mysqlnativepassword by '1234';

删除用户

sql 复制代码
DROP USER '用户名'@'主机名' ;

案例:

sql 复制代码
drop user 'itcast'@'localhost';

权限控制

|-------------------|------------|
| 权限 | 说明 |
| ALL、ALL PRIVLEGES | 所有权限 |
| SELECT | 查询数据 |
| INSERT | 插入数据 |
| UPDATE | 修改数据 |
| ALTER | 修改表 |
| DROP | 删除数据库/表/视图 |
| CREATE | 创建数据库/表 |
| DELETE | 删除数据 |

1.查询权限

sql 复制代码
SHOW GRANTS FOR '用户名'@'主机名' ;

案例:

sql 复制代码
#查询 'heima'@'%' 用户的权限
show grants for 'heima'@'%';

2.授予权限

sql 复制代码
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

案例:

sql 复制代码
#授予 'heima'@'%' 用户itcast数据库所有表的所有操作权限
grant all on itcast.* to 'heima'@'%';

3.撤销权限

sql 复制代码
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

案例:

sql 复制代码
#撤销 'heima'@'%' 用户的itcast数据库的所有权限
revoke all on itcast.* from 'heima'@'%';

函数

1.字符串函数

|--------------------------|----------------------------------|
| 函数 | 功能 |
| CONCAT(S1,S2,...,Sn) | 字符串拼接,将S1,S2,...,Sn拼接成一个字符串 |
| LOWER(str) | 将字符串str全部转为小写 |
| UPPER(str) | 将字符串str全部转换为大写 |
| LPAD(str,n,pad) | 左填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
| RPAD(str,n,pad) | 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
| TRIM(str) | 去掉字符串头部和尾部的空格 |
| SUBSTRING(str,start,len) | 返回从字符串str从start位置起的len个长度的字符串 |

案例:

  • concat:字符串拼接
sql 复制代码
select concat('Hello' , ' MySQL');
  • lower:全部转小写
sql 复制代码
select lower('Hello');
  • upper:全部转大写
sql 复制代码
select upper('Hello');
  • lpad:左填充
sql 复制代码
select lpad('01', 5, '-');
  • rpad:右填充
sql 复制代码
select rpad('01', 5, '-');
  • trim:去除空格
sql 复制代码
select trim(' Hello MySQL ');
  • substring:截取子字符串
sql 复制代码
select substring('Hello MySQL',1,5);

2.数值函数

|------------|--------------------|
| 函数 | 功能 |
| CEIL(x) | 向上取整 |
| FLOOR(x) | 向下取整 |
| MOD(x,y) | 返回x/y的模 |
| RAND() | 返回0-1内的随机数 |
| ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
[常见的数值函数]

  • ceil:向上取整
sql 复制代码
select ceil(1.1);
  • floor:向下取整
sql 复制代码
select floor(1.9);
  • mod:取模
sql 复制代码
select mod(7,4);
  • rand:获得随机数
sql 复制代码
select rand();
  • round:四舍五入
sql 复制代码
select round(2.344,2);

3.日期函数

|------------------------------------|---------------------------------|
| 函数 | 功能 |
| CURDATE() | 返回当前日期 |
| CURTIME() | 返回当前时间 |
| NOW() | 返回当前日期和时间 |
| YEAR(date) | 获取指定 date 的年份 |
| MONTH(date) | 获取指定 date 的月份 |
| DAY(date) | 获取指定 date 的日期 |
| DATE_ADD(date, INTERVAL expr type) | 返回一个日期 / 时间值加上一个时间间隔 expr 后的时间值 |
| DATEDIFF(date1,date2) | 返回起始时间 date1 和 结束时间 date2 之间的天数 |
[常见的日期函数]

  • curdate :当前日期
sql 复制代码
select curdate();
  • curtime :当前时间
sql 复制代码
select curtime();
  • now :当前日期和时间
sql 复制代码
select now();
  • YEAR、MONTH、DAY:当前年、月、日
sql 复制代码
select YEAR(now());
select MONTH(now());
select DAY(now());
  • date_add:增加指定的时间间隔
sql 复制代码
select date_add(now(), INTERVAL 70 YEAR )
  • datediff:获取两个日期相差的天数
sql 复制代码
select datediff('2021-10-01', '2021-12-01');

流程函数

|--------------------------------------------------------------------------|---------------------------------------------------|
| 函数 | 功能 |
| IF(value , t , f) | 如果 value 为 true ,则返回 t ,否则返回 f |
| IFNULL(value1 , value2) | 如果 value1 不为空,返回 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 默认值 |
[常见的流程函数]

  • if
sql 复制代码
select if(false, 'Ok', 'Error');
  • ifnull
sql 复制代码
select ifnull('Ok','Default');
select ifnull('','Default');
select ifnull(null,'Default');
  • case when then else end
sql 复制代码
#需求: 查询emp表的员工姓名和工作地址 (北京/上海-> 一线城市,其他-> 二线城市)
select
name,
( case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end ) as '工作地址' from emp;

约束

|----------------------|-------------------------------|-------------|
| 约束 | 描述 | 关键字 |
| 非空约束 | 限制该字段的所有数据都是唯一,不重复的 | NOT NULL |
| 唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE |
| 主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
| 默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
| 检查约束 (8.0.16 版本 之后 ) | 保证字段值满足某一个条件 | CHECK |
| 外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致 性和完整性 | FOREIGN KEY |
[约束分类]

语法

1.添加外键

sql 复制代码
CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
);
sql 复制代码
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名)
REFERENCES 主表 (主表列名) ;

案例:

sql 复制代码
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id);

2.删除外键

sql 复制代码
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
sql 复制代码
#删除emp表的外键fk_emp_dept_id。
alter table emp drop foreign key fk_emp_dept_id;

3.删除/更新行为

|-------------|-------------------------------------------------------------------------|
| 行为 | 说明 |
| NO ACTION | 当在父表中删除 / 更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/ 更新。 ( 与 RESTRICT 一致 ) 默认行为 |
| RESTRICT | 当在父表中删除 / 更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/ 更新。 ( 与 NO ACTION 一致 ) 默认行为 |
| CASCADE | 当在父表中删除 / 更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/ 更新外键在子表中的记录。 |
| SET NULL | 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null (这就要求该外键允许取 null )。 |
| SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值 (Innodb 不支持 ) |

语法:

sql 复制代码
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
  • CASCADE
sql 复制代码
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id) on update cascade on delete cascade ;
  • SET NULL
sql 复制代码
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id) on update set null on delete set null ;

多表查询

内连接

1.隐式内连接

sql 复制代码
SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;

2.显示内连接

sql 复制代码
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;

外连接

1.左外连接

sql 复制代码
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;

2.右外连接

sql 复制代码
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ; 1

3.自连接

sql 复制代码
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;

4.联合查询

sql 复制代码
SELECT 字段列表 FROM 表A ...
UNION [ ALL ]
SELECT 字段列表 FROM 表B ....;

案例:

sql 复制代码
#将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来
select * from emp where salary < 5000
union all
select * from emp where age > 50;

5.子查询

sql 复制代码
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );

6.列子查询

|--------|-------------------------------|
| 操作符 | 描述 |
| IN | 在指定的集合范围之内,多选一 |
| NOT IN | 不在指定的集合范围之内 |
| ANY | 子查询返回列表中,有任意一个满足即可 |
| SOME | 与 ANY 等同,使用 SOME 的地方都可以使用 ANY |
| ALL | 子查询返回列表的所有值都必须满足 |

存储引擎

1.建表时指定存储引擎

sql 复制代码
CREATE TABLE 表名(
字段1 字段1类型 [ COMMENT 字段1注释 ] ,
......
字段n 字段n类型 [COMMENT 字段n注释 ]
) ENGINE = INNODB [ COMMENT 表注释 ] ;

案例:

sql 复制代码
#创建表 my_myisam , 并指定MyISAM存储引擎
create table my_myisam(
id int,
name varchar(10)
) engine = MyISAM ;

索引

1.创建索引

sql 复制代码
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (
index_col_name,... ) ;

2.查看索引

sql 复制代码
SHOW INDEX FROM table_name ;

3.删除索引

sql 复制代码
DROP INDEX index_name ON table_name ;
相关推荐
C吴新科3 小时前
MySQL入门操作详解
mysql
Ai 编码助手5 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
陈燚_重生之又为程序员5 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle5 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻5 小时前
MySQL排序查询
数据库·mysql
萧鼎5 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^5 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋35 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
荒川之神6 小时前
ORACLE _11G_R2_ASM 常用命令
数据库·oracle
IT培训中心-竺老师6 小时前
Oracle 23AI创建示例库
数据库·oracle