Mysql 基础使用
(声明:本教程仅供本人学习使用,如有人使用该技术触犯法律与本人无关)
(如果有错误,还希望指出。共同进步)
Mysql 登录
mysql -h <Ip> -P <端口(3306)> -u <用户名> -p <密码>
SQL命令
SQL全称呼为Structure Query Language(结构化查询语言)。主要分为3类。
- DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、 数据库、表、列、索引等数据库对象的定义。
- DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。
- DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和 访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。
- DQL(Data QueryLanguage)语句:数据查询语言
# DQL
————
显示当前正在操作的数据库
select database();
显示当前用户
select user();
整体使用
select * from <表名> where <条件> group by <条件> (having <条件>) order by <条件> limit <条件> offset <条件>;
查询所有
select * from <表名>;
指定字段查询
select <字段名1>,<字段名2>,… from <表名>;
去除重复字段查询
select distinct <字段名1>,<字段名2> from <表名>;
条件查询
select * from <表名> where <条件>;
结果集排序
(asc—ascending升序,desc—descending降序)
select 字段名 from 表名 order by 字段名 desc;
多字段排序
select <字段名> from <表名> order by <字段名1> asc|desc,<字段名2> asc|desc,…;
限制查询的结果集
# 查询第<数字>条及之前的数据
select <字段名> from <表名> limit <数字>;
# 查询第<数字1>条开始<数字2>条数据
select <字段名> from <表名> limit <数字1>,<数字2>;
# 等价于上面
select <字段名> from <表名> limit <数字1> offset <数字2>;
分组统计
# 常用的统计函数
# 求和
sum()
# 最大值
max()
# 最小值
min()
# 次数
count()
# 平均值
avg()
【注】分组之后,前面的字段只能写分组的字段,或者统计信息,写其它没有意义
select count(<分组字段名>) from students group by <分组字段名>;
【注】可以给字段起别名,as起别名
select count(<分组字段>) as <别名1>,<字段名1> as <字段名2> from <表名> group by <分组字段>;
# 结果集过滤
select () from <表名> group by <字段> having <条件>;
正则
# 匹配
REGEXP_LIKE(<字段名>, '正则表达式')
# 包含
REGEXP_INSTR (<字段名>, '正则表达式')
# 替换
REGEXP_REPLACE(<字段名>, '正则表达式')
# 提取
REGEXP_SUBSTR(<字段名>, '正则表达式')
# 例子匹配13/15开头的手机号(逻辑不太严谨)
select * from <表名> where regexp_like(<字段名>, '^[1]{1}[35]{1}[[:digit:]]{9}$');
# 同匹配
rlike '正则表达式'
# 例子正则匹配 user_name 以k开头,k出现一次以上
select * from user where user_name rlike '^k+';
# DDL
————
查看
# 查看mysql版本
status;
# 查看最大连接数
show global status like 'Max_used_connections';
# 查看进程的连接
show full processlist;
# 查看所有的引擎
show engines;
# 查看库
show databases;
# 查看指定数据库创建语句
show create database <数据库名>;
# 查看所有表
show tables;
# 查看表字段(describe:描述)
desc <表名>;
# 查看表创建语句
show create table <表名>;
# 查看索引
show index from <表名>;
创建
# 创建库
create database <数据库名>;
# 创建表指定引擎和字符集
create table <表名>(
'<字段1>' <字符类型>,
'<字段2>' <字符类型>,
...,
primary key(<指定主键字段>),
/*声明索引*/
)engine=<引擎> default charset='<字符集>';
# 【*】 引擎有innoDB、 MyISAM两种
# 复制表(as和like的区别)
# as
create table <需要复制的表名> as select * from <被复制的表名>;
# like
create table <需要复制的表名> like <被复制的表名>;
----------------------------------------------------------
- as用来创建相同表结构并复制源表数据
- like用来创建完整表结构和全部索引
【*】:as复制的表,表结构相同,索引信息没了,包括主键(主键也是一种索引,并且不能为空),有数据;like复制的表,没有数据,表结构相同,有索引信息。
MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。
修改
# 修改数据库字符集
alter database <数据库名> default character set <字符集>;
# 修改表的字符集
alter table <表名> default character set <字符集>;
# 修改表字段类型
alter table <表名> modify <字段名> <字段类型>;
# 增加表字段
alter table <表名> add <字段名> <字段类型>;
# 增加字段时控制顺序
# 添加在指定字段名后/首位
alter table <表名> add <字段名> <字段类型> after/first <字段名>;
# 删除表字段
alter table <表名> drop <字段名>;
# 表字段改名
alter table <表名> change <字段原名> <字段新名> <字段类型>;
# 修改表名
alter table <旧表名> rename <新的表名>;
# 添加索引
# 普通索引
alter table <表名> add index(<字段名>);
# 唯一索引
alter table <表名> add unique(<字段名>);
# 主键索引
alter table <表名> add primary key(<字段名>);
# 全文索引
alter table <表名> add fulltext(<字段名>);
# 删除索引
alter table <表名> drop index(<字段名>);
删除
# 删除数据库
drop database <数据库名>;
# 删除表
drop table <数据表名>;
# DML
————
插入数据
# 格式一,所有字段都插入
insert into <表名> values(<字段信息1>,<字段信息2>,...)
# 格式二,指定字段插入
insert into <表名>(<需要插入的字段名,一个或多个>) values(<信息>);/(<信息>),(<信息>),...
删除数据
# 符合条件的都被删除
delete from <表名> where <条件>;
【*】:不加条件为全部删除
# 清空表记录
delete from <表名>;
- delete:删除所有数据,重新添加,id从原有基础上增加
truncate table <表名>;
- truncate: 删除所有数据,重新添加,id从1开始
修改数据
# 符合条件的修改
update <表名> set <字段名1>=<内容>,<字段名2>=<内容> where <条件>;
【*】:不加条件为全部修改
# DCL
————
创建用户
# 默认只能本机的客户端登录本机的mysql,远端的客户端不能登录本机的mysql
create user '用户名'@'用户地址' identified by '密码';
授予权限
# 【*.*】 : .左边可以指定数据库,右边指定数据表
grant <权限> on *.* to '用户名'@'用户地址';
# 权限可参照链接地址
# 【https://www.php.cn/mysql-tutorials-415708.html】
剥夺权限
# 【*.*】 : .左边可以指定数据库,右边指定数据表
revoke <权限> on *.* from '用户名'@'用户地址'
删除用户
drop user '用户名'@'用户地址';
刷新权限
flush privileges;
【补充】:多表联合查询(DQL)
———————————————
隐式内连接
# 不写条件,默认的连接方式是笛卡尔乘积
select * from <表名1> as <别名1>,<表名2> as <别名2> where <别名1>.<字段名>=<别名2>.<字段名>;
【*】:表起别名之后,sql语句中,原名不能使用,只能使用别名
显式内连接
select <表名1>.<字段名>, <表名2>.<字段名>, ... from <表名1> join <表名2> on <条件>;
外连接之【左连接】——>一个新表
在内连接的基础上,将左边表的数据都写出来,右边对不上全部写null
外连接之【右连接】——>一个新表
在内连接的基础上,将右边表的数据都写出来,右边对不上全部写null
三表连接
# 将表1和表2通过条件连接成一个新表后与表3通过连接条件成为一个新表
select * from <表1> join <表2> on <条件> join <表3> on <条件> where <条件>;
子查询(嵌套连接)
# 条件可以为另一条select语句
select <字段> from <表名> where <字段> in (条件)
记录联合
# 【all为全部显式,不加all为添加distace(去重)的功能】
select <语句1> union[all] select <语句2>;