9人参与 • 2026-08-02 • Mysql

sql(structured query language)是结构化查询语言的简称,是一种数据库查询和程序设计语言,用于读取数据,以及查询、更新和管理关系数据库

show databases;
create {database | schema} [if not exists] db_name [create_option] ...
create_option: [default] {
character set [=] charset_name
| collate [=] collation_name
| encryption [=] {'y' | 'n'}
}show charset;
show collation;
show create database db_name
alter {database | schema} [db_name]
alter_option ...
alter_option: {
[default] character set [=] charset_name
| [default] collate [=] collation_name
| [default] encryption [=] {'y' | 'n'}
| read only [=] {default | 0 | 1}
} drop {database | schema} [if exists] db_name


char为固定长度的字符串,取值范围比较小
varchar为可变长度字符串,取值范围较大
数据确定长度一样就使用char,如果长度有变化,就使用varchar
char类型比较浪费磁盘空间,但效率高,varchar则相反

show tables;
create [temporary] table [if not exists] tbl_name field datatype [约束] [comment '注解内容'] [, field datatype [约束] [comment '注解内容']] ... ) [engine 存储引擎] [character set 字符集] [collate 排序规则];
desc 表名;
alter table tbl_name [alter_option [, alter_option] ...];
alter_option: {
table_options
| add [column] col_name column_definition [first | after col_name]
| modify [column] col_name column_definition [first | after col_name]
| drop [column] col_name
| rename column old_col_name to new_col_name
| rename [to | as] new_tbl_namedrop [temporary] table [if exists] tbl_name [, tbl_name] ...
insert [into] table_name [(column [, column] ...)] values (value_list) [, (value_list)] ... value_list: value, [, value] ...
select
[distinct]
select_expr [, select_expr] ...
[from table_references]
[where where_condition]
[group by {col_name | expr}, ...]
[having where_condition]
[order by {col_name | expr } [asc | desc], ... ]
[limit {[offset,] row_count | row_count offset offset}]select column [as] alias_name [, ...] from table_name;
在结果集中去除重复记录,可以使⽤distinct
去重时,要求所有列都是相同的,才会判定为重复
查询时不加限制条件会返回表中所有结果
select
select_expr [, select_expr] ... [from table_references]
where where_condition
比较运算符


-- asc 为升序(从⼩到⼤)
-- desc 为降序(从⼤到⼩)
-- 默认为 asc
select ... from table_name [where ...] order by {col_name | expr } [asc |
desc], ... ;-- 起始下标为 0 -- 从 0 开始,筛选 num 条结果 select ... from table_name [where ...] [order by ...] limit num; -- 从 start 开始,筛选 num 条结果 select ... from table_name [where ...] [order by ...] limit start, num; -- 从 start 开始,筛选 num 条结果,⽐第⼆种⽤法更明确,建议使⽤ select ... from table_name [where ...] [order by ...] limit num offset start;
update [low_priority] [ignore] table_reference set assignment [, assignment] ... [where where_condition] [order by ...] [limit row_count]
delete from tbl_name [where where_condition] [order by ...] [limit row_count]
truncate [table] tbl_name
insert into table_name [(column [, column ...])] select ...

group by 子句的作用是通过一定的规则将一个数据集划分成若干的小的分组,然后针对若干个分组进行数据处理
select {col_name | expr} ,... ,aggregate_function (aggregate_expr)
from table_references
group by {col_name | expr}, ...
[having where_condition]使用group by对结果进行分组处理之后,对分组的结果进行过滤时,不能使用where子句,而是要使用having子句
数据库约束是指对数据库表中的数据所施加的规则或条件,用于确保数据的准确性和可靠性。这些约束可以是基于数据类型、值范围、唯一性、非空等规则,以确保数据的正确性和相容性

加了非空约束的列不能为null值,如果预见某个列不可能为空,则强烈建议加非空约束
default约束用于向列中插入默认值,如果没有为列设置值,则将会将默认值设置到该列
指定了唯一约束的列,该列的值在所有记录中不能重复,如果确定当前列是唯一列,则强烈建议加唯一约束
可以应用于一个或多个列,由于限制列中可接受的数据值,从而确保数据的完整性和准确性
数据库的范式是一组规则,不同的规范要求被称为是不同的范式
关系数据库一共有六种范式,一般只需要满足第三范式即可
1.1.1 定义
1.1.2 实例
定义一个学生表,需要记录学生信息和学校信息
1.1.3 反例
学校是一个对象,可以继续进行拆分,所以不满足第一范式
在关系型数据库中,每一列都可以用基本数据类型表示,就天然满足第一范式
1.2.1 定义
1.2.2 示例
需求:学生可以选修课程,课程有对应的学分,学生考试后会产生相应的成绩
1.2.3 反例
用一张表记录所有的信息,包括学号、姓名、年龄、性别、课程名、学分、成绩
1.2.4 不满足第二范式时可能出现的问题
1.3.1 定义
在满足第二范式的基础上,不存在非关键字段,对任意候选键的传递依赖
1.3.2 反例
在一个表中出现了两个强相关的关系,而且这两个强相关的关系又存在传递现象,这种传递现象称为传递依赖,应该针对需求设计不同的表



在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询一个数据的完整信息,就要从多个表中获取数据,这是就需要使用联合查询,这里的联合指的是多个表的组合
1 select 字段 from 表1 别名1, 表2 别名2 where 连接条件 and 其他条件; 2 select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 where 其他条件;
-- 左外连接,表1完全显⽰ select 字段名 from 表名1 left join 表名2 on 连接条件; -- 右外连接,表2完全显⽰ select 字段 from 表名1 right join 表名2 on 连接条件;
自连接是自己与自己取笛卡尔积,可以把行转换为列,在查询的时候可以使用where条件对结果过滤,或者说实现行与行之间的比较,在做表连接时为表起不同的别名
# 不为表指定别名 mysql> select * from score, score; error 1066 (42000): not unique table/alias: 'score' # 指定别名 mysql> select * from score s1, score s2;
子查询是把一个select语句的结果当作另一个select语句的条件,也较嵌套查询
select * from table1 where col_name1 {= | in} (
select col_name1 from table2 where col_name2 {= | in} [(
select ...)
] ...
)嵌套的查询中只返回一行数据
嵌套的查询中返回多行数据,使用[not] in 关键字
单行子查询和多行子查询都只返回一列数据,多列子查询可以返回多个列的数据,外层查询与嵌套的内层查询的列要匹配
当一个查询结果产生时,mysql自动创建一个临时表,然后把结果集放在这个临时表中,最终返回给用户,在from子句中也可以使用临时表进行子查询或表连接操作
在实际应用中,为了合并多个select操作返回的结果,可以使用集合操作符union,union all
该操作符用于取得两个结果集的并集,当使用该操作符时,会自动去掉结果集中的重复行
该操作符用于取得两个结果集的并集,使用该操作符时,不会去掉结果集中的重复行
insert into table_name [(column [, column ...])] select ..
视图是一个虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。视图本身不存储数据,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询,更新和管理。视图本身并不占用物理储存空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据
# 语法 create view view_name [(column_list)] as select_statement
视图是一张虚拟表,可能通过调用视图方便的获取想要的数据,视图可以理解为把一个复杂的sql进行了包装,视图可以与真实表进行表关联查询
以下视图不可更新
# 语法 drop view view_name;

mysql的用户信息保存在mysql系统数据库的user表中,可以通过select语句查看

2.2.1 语法
create user [if not exists] 'user_name'@'host_name' identified by 'auth_string';
2.2.2 注意事项
# 为指定⽤⼾设置密码 【推荐】 alter user 'user_name'@'host_name' identified by 'auth_string'; # 为指定⽤⼾设置密码 set password for 'user_name'@'host_name' = 'auth_string'; # 为当前登录⽤⼾设置密码 set password = 'auth_string';
drop user [if exists] 'user_name'@'host_name'[, ...];
一次可以删除多个用户

所有权限都会被赋予,是管理员
grant priv_type[, priv_type ...] on priv_level to 'user_name'@'host_name' [with grant option]
revoke [if exists] priv_type[, priv_type] ... on priv_level from 'user_name'@'host_name' [, 'user_name'@'host_name'] ...
mysql的索引是一种数据结构,是为了提升数据库的查询效率、更新表中的数据
时间复杂度为o(1),查询速度很快,但是不支持范围查找
最坏情况下时间复杂度为o(n)
节点个数过多无法保证树高
在.idb文件中最重要的结构体就是页,页是内存与磁盘交互的最小单元,默认大小为16kb,每次内存与磁盘的交互至少读取一页,所以在磁盘中每个页内部的地址都是连续的,之所以这样,是因为在使用数据的过程中,根据局部性原理,将来要使用的数据大概率与当前访问的数据在空间上是连续的,所以一次从磁盘中读取一页的数据放入内存中,下次查询时还在这个页中就可以直接查询,从而减少磁盘i/o提高性能

5.2.1 主键索引
# 方式一,创建表时创建主键 create table t_test_pk ( id bigint primary key auto_increment, name varchar(20) ); # ⽅式⼆,创建表时单独指定主键列 create table t_test_pk1 ( id bigint auto_increment, name varchar(20), primary key (id) ); # ⽅式三,修改表中的列为主键索引 create table t_test_pk2 ( id bigint, name varchar(20) ); alter table t_test_pk2 add primary key (id) ; alter table t_test_pk2 modify id bigint auto_increment;
5.2.2 唯一索引
# ⽅式⼀,创建表时创建唯⼀键 create table t_test_uk ( id bigint primary key auto_increment, name varchar(20) unique ); # ⽅式⼆,创建表时单独指定唯⼀列 create table t_test_uk1 ( id bigint primary key auto_increment, name varchar(20), unique (name) ); # ⽅式三,修改表中的列为唯⼀索引 create table t_test_uk2 ( id bigint primary key auto_increment, name varchar(20) ); alter table t_test_uk2 add unique (name) ;
5.2.3 普通索引
# 方式一,创建表时指定索引列 create table t_test_index ( id bigint primary key auto_increment, name varchar(20) unique sno varchar(10), index(sno) ); # ⽅式⼆,修改表中的列为普通索引 create table t_test_index1 ( id bigint primary key auto_increment, name varchar(20), sno varchar(10) ); alter table t_test_index1 add index (sno) ; # ⽅式三,单独创建索引并指定索引名 create table t_test_index2 ( id bigint primary key auto_increment, name varchar(20), sno varchar(10) ); create index index_name on t_test_index2(sno);
# ⽅式⼀ show keys from 表名 # ⽅式⼆ show index from t_test_index6; # ⽅式三,简要信息:desc 表名; desc t_test_index6;
5.5.1 主键索引
# 语法 alter table 表名 drop primary key;
5.5.2 其他索引
# 语法 alter table 表名 drop index 索引名;

事务是把一组sql语句打包成为一个整体,在这组sql执行过程中,要么全部成功,要么全部失败,这组sql语句可以是一条也可以是多条。
事物的acid特性指的是atomicity(原子性)、consistency(一致性)、isolation(隔离性)和durability(持久性)。
事务具备的acid特性,是使用事务的原因,支持事务的数据库能够简化我们的编程模型,不需要考虑其他的错误和并发问题,我们接触的事务本质上是数据库对acid模型的一个实现,是为应用层服务的

通过以下语句可以完成对事物的控制
# 开始⼀个新的事务 start transaction; # 或 begin; # 提交当前事务,并对更改持久化保存 commit; # 回滚当前事务,取消其更改 rollback;
在事务执行的过程中设置保存点,回滚时指定保存点可以把数据恢复到保存点的状态
# 开启事务 mysql> start transaction; # 设置保存点 mysql> savepoint savepoint1; # 设置第⼆个保存点 mysql> savepoint savepoint2; # 回滚到第⼆个保存点 mysql> rollback to savepoint2; # 回滚到第⼀个保存点 mysql> rollback to savepoint1; # 回滚时不指定保存点,直接回滚到事务开始时的原始状态,事务关闭 mysql> rollback;
mysql> show variables like 'autocommit'; +---------------+-------+ | variable_name | value | +---------------+-------+ | autocommit | on | # on 表⽰⾃动提交开启 +---------------+-------+
# 设置事务⾃动提交 mysql> set autocommit=1; # ⽅式⼀ mysql> set autocommit=on; # ⽅式⼆ # 设置事务⼿动提交 mysql> set autocommit=0; # ⽅式⼀ mysql> set autocommit=off; # ⽅式⼆
mysql服务可以同时被多个客户端访问,每个客户端执行的dml语句以事务为基本单位,那么不同的客户端在对同一张表的同一条数据进行修改的时候就可能出现相互影响的情况,为了保证不同的事务之间在执行的过程中不受影响,那么事务之间就需要相互隔离,这种特性就是隔离性
事务间不同程度的隔离,称为事务的隔离级别;不同的隔离级别在性能和安全性方面做了取舍,在mysql的innodb引擎中事务的隔离级别有四种,分别是:

在事务中,事务a对数据进行了修改,事务b可以访问到,事务b访问到了事务a还没有提交的数据(可能发生回滚),这个现象叫做“脏读”
事务a在一个事务对同一条记录查询了两次,在两次查询之间事务b对数据进行了修改并且提交了事务,当a第二次查询数据的时候,发现与第一次查到的结果不一样,这个现象叫“不可重复读”
事务a第一次查询到的结果集,与第二次查询到的结果不一样,这个现象叫“幻读”
在innodb引擎中,使用了next-key锁,锁住了目标行与之前的间隙,解决了部分的幻读问题
可以解决所有的数据安全问题,所有的事物是一个接一个的执行,一个事务必须等待上一个事务执行完成后才能执行

# 全局作⽤域 select @@global.transaction_isolation; # 会话作⽤域 select @@session.transaction_isolation; # 可以看到默认的事务隔离级别是repeatable-read(可重复读) +---------------------------------+ | @@session.transaction_isolation | +---------------------------------+ | repeatable-read | # 默认是可重复读 +---------------------------------+ 1 row in set (0.00 sec)



到此这篇关于mysql数据库从入门到精通超详细版本的文章就介绍到这了,更多相关mysql从入门到精通内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论