Mysql
Luo zerone 菜菜子

MySQL

数据库

数据库是存储数据库的仓库,而数据库管理系统(Database management system)和数据库并不相同。Mysql和MongoDB等都是管理系统,而不是数据库。==SQL==是数据库管理系统用来操作关系型数据库的编程语言。

关系型数据库管理系统(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库

SQL语句分类

SQL可以分为四类语句,它们分别是DDL(data definition language)、DML(data manipulation language)、DQL(data query language)、DCL(data control language)

这四类语句的作用分别是:

​ DDL:定义数据库对象(即数据库,表,字段)

​ DML:数据增删改等操作

​ DQL:数据查找操作

​ DCL:控制数据库用户,以及对数据库的访问权限等


使用Mysql

  1. 启动/停止MySQL服务(设置了自启动,就不需要执行了)
1
2
net stop  MySQL80
net start MySQL80
  1. 登录MySQL
1
2
mysql  -uroot  -p19980527    # 这是显式用户、密码的登录方式,可能不安全,-uroot:表示user是root
mysql -uroot -p # 直接回车,会等待输入,而不是显式的输入密码了
  1. 退出MySQL
1
exit;
  1. 注释

单行注释既可以用 # 也可以用双中横 – ;多行注释符号和C语言一样 /**注释内容**/

1
2
3
4
5
6
7
8
/*
这是一段

多行注释内容
*/
-- 这是单行注释
# 这也是单行注释
select id from tb1; #

DDL

DDL:操作数据库

  1. 展示数据库的信息
1
2
3
4
5
6
7
8
# 使用此命令可以查看当前mysql中有多少的数据库
show databases;

# 使用此命令可以查看有多少数据表
show tables;
# MySQL是存在多个数据库的,你可以为学生的信息做一个库,同时为教师也做一个数据库
# 在一个库中存在多张表,
# 在一个表中就是具体的数据信息了,就是和excel表格类似的东西
  1. ==创建==、进入、删除数据库
1
2
3
4
5
6
7
8
9
10
11
# 创建一个叫做studentDatabase的数据库
create database studentDatabase;

# 使用数据库,和anaconda里的conda activate env命令有点相似,用来指定要操作的数据库
# 如果下条指令操作的是另外一个数据库中的数据,那么你就需要使用该命令来切换数据库
use databaseName;

# 删除某个数据库
drop database databaseName;

-- 注意drop database是一条完整的指令

一个database有多张table,所以如果想处理某张table的数据内容需要先进入该数据库,再进入该table

注意:SQL命令应该以分号结尾

DDL:操作表

Description:这里对表的操作并不是操作具体的数据内容,而是对字段,也就是具体数据的索引进行修改

1. 查询当前数据库中的表信息
1
2
show tables;
# 1.这个指令可以查看当前数据库中有多少表
2.查询表的详细信息
1
2
3
4
5
6
desc  tableName;
# 1.这条指令会详细展示指定表的内容
# 2.不要弄混了这个指令,这个指令和show tables指令,是由区别的,这个指令可以查看某个表的具体信息,而show tables是查看数据库中有多少张表;

show create table tableName;
# 这个指令会展示该表的DDL信息,也就是创建时使用的指令内容,以及一些额外的信息

image-20230817090145344

image-20230817090455050

3.==创建表==

创建表的指令可以记为,

​ 1.做什么操作:创建表 – create table,

​ 2.创建表的名字是什么:tableName

​ 3.表的字段是什么:(字段1 字段1的类型[comment ‘字段1的描述’], 字段2 字段2的类型[comment ‘字段2的描述’], … )

1
2
3
4
5
6
7
8
9
10
# 这里说的创建表其实是创建一个初始化的表,也就是先声明表的列索引,姓名,学号,年龄等这些 
-- 描述是可选项目,所以我用括号括起来了。这里的中括号并不需要输入进去。
create table tableName(
字段1 字段1的类型[comment ‘字段1的描述’],
字段2 字段2的类型[comment ‘字段2的描述’],
...
)[comment 对于表的描述];
# 需要注意的是最后一个表项后面不需要接逗号了


Example:

1
2
3
4
5
6
7
8
9
 create table studentInfo(
number int comment 'students Number',
name varchar(50),
age int comment '年龄'
) comment 'students Infomation';

# 千万别忘了最后一个表项不需要逗号,以及最后的分号和每行的逗号
-- 在这段指令中,name定义的是字符型,长度为50
-- mysql有很多的数据类型,其中类型默认都是 有符号 的。

image-20230817085835380

​ 1.1 数据类型

下面只列举了一部分的类型,还有很多没有列举,更详细的可以访问菜鸟教程

类型 大小 有符号类型数值范围 无符号数值范围 描述
TINYINT 1 byte字节 (-128,127) (0,255) 小整数,各整数的差别在于数值的范围不同
SMALLINT 2 byte (-32768,32767) (0,65535) 整数
MEDIUMINT 3 byte (-8388608,8388607) (0,16777215) 整数
INT 或 INTEGER 4 byte (-2^16^, 2^16^-1) (0,2^32^-1) 整数
FLOAT 4 byte 0和(-3.402 823 466 E+38,-1.175 494 351 E-38), 0 ,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
浮点数值
DOUBLE(len,保留几位小数) 8 byte (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
浮点数值
4.修改表

需要注意的是,这里说的修改表,并不是修改表中的具体内容,而是修改表的字段内容

4.1 为表增加字段

增加操作可以记为:

​ 1.做什么操作:修改表 – ALTER TABLE

​ 2.修改哪个表呢: studentInfo

​ 3.修改的具体操作是增加、删除、还是修改呢:ADD

​ 4.增加字段的具体内容是:gender int COMMENT ‘性别’

1
2
ALTER TABLE studentInfo ADD  gender int COMMENT  '性别';
# 这个命令可以为名称为studentInfo的表增加一个名为gender的字段

4.2 修改表的字段

4.2.1 修改字段的数据类型

1
2
3
ALTER TABLE studentInfo MODIFY gender char COMMENT 'gender';
# 1.这里的第一个参数是需要修改数据类型的字段名 第二参数是修改后的数据类型
# 2.这个指令感觉和创建指令没有什么区别了,相当于重新创建了一个相同名字的表, 只是在创建的过程中修改了数据类型

4.2.2 修改字段

1
2
3
4
5
6
7
ALTER TABLE studentInfo CHANGE gender xingbie int COMMENT '性别';
# 1.这里的第一个参数是需要修改字段的字段名,也就是命令中的gender 第二参数是修改后的数据字段名,以及该字段的类型和描述
# 2.好奇这个指令是不是可以实现4.2.1中的功能,感觉4.2.1有点多此一举。
# 所以这里的这条指令的结果是,将原来的gender字段修改为性别,同时指定数据类型是整形。

# 删除字段
ALTER TABLE studentInfo DROP gender
5.删除表
1
2
DROP TABLE table_name;
# 这个指令和删除数据库相似

DML

INSERT INTO 表名(字段1名,字段2名,…) VALUES(值1,值2,…)

​ 字段名和值应该一一对应

1
2
3
4
5
6
7
8
9
# 1.给自定字段添加数据      注意不要忘了单引号,字符串和日期型数据应该包含在引号内
insert into tablename (id,name,gender) values (10,'li ming','man');

# 2.给全部的字段添加数据,可以直接省略字段
INSERT INTO tableName VALUES(10, 'li ming', 'man');

# 3.批量添加数据,也就是一次添加好几行的数据
INSERT INTO tableName(id,name,gender) VALUES(10, 'li ming', 'man'),(11, 'zhang hua', 'man') # 添加两行的数据,数据是在id,name,gender三个字段赋值
INSERT INTO tableName VALUES(10, 'li ming', 'man'),(11, 'zhang hua', 'man')

UPDATE 表名 SET 字段1名=值1, 字段2名=值2,…….. [WHERE 条件]

修改表数据,这里的重点是条件,可能你会修改多条语句,那么where就变的重要了, 这个where是个可选的参数,可有可无

1
2
update tablename  set number=1,name='ha ha'  where id=2;
# 令tableName表中的,id等于2的行中的, number字段等于1,name字段等于'ha ha'

DELETE FROM 表的名字 where 条件

这里的条件可以有,也可以不设置条件,但是如果没有条件,那么就是删除整张表的值

DELETE语句并不能删除某一个字段的值,这句话的意思是说DELETE删除是以行为基本对象,只能按行删除,而不能删除某一列的值

1
delete from tablename where id=1;

DQL

SELECT 字段1, 字段2, 字段3… from 表名 where 查找判断条件

1
2
3
4
5
6
SELECT  后面可以接很多的可选参数,包括where,group by , having , order by , limit
1.where 用于设置查找的条件
2.group by
3.order by 用于设置排序的方式
4.limit 用于分页展示
5.group by

这个命令的解释就是从某个表中查找字段1,2,3的数据,但是这些有限定条件,比如说number<10的数据

1.基本查询

1
2
3
4
5
# 查询所有的字段数据
select * from tablename; # 这里的*星号是通配符的含义,就是选择所有字段的数据

# 查询指定值段数据
select id,username from tablename; # 返回字段id和字段username的结果

2.条件查询

1
select id,username from tablename where id!=3;

条件:

比较运算符 功能
like 占位符
其中_占一个字符,%占
模糊匹配,用于检测字段或字符串是否包含某些指定的字符串
!= 或者 <> 不等于
>= 大于等于
between….and… 值在某个区间
is null 值为NULL
in(….) 在in之后的列表中的值,多选一
逻辑运算符 功能
AND 或者 && 逻辑与
OR 或者 || 逻辑或
NOT 或者 ! 逻辑非

EX:

1
2
3
4
5
6
7
8
9
10
11
# 查询身份证号最后一位是X的员工的信息
select from tableName where idcard like "%X";

# 查询年龄等于18,或者20,或者40 的员工
select * from tableName where age in(18,20,40) # 只要满足一个就输出
select * from tableName where age=18 or age=20 or age=40;

# 查询年龄在18到24的员工
select * from tableName where age between 18 and 24;
以下是错误的查找,between的取值范围必须前面是小值后面是大值
select * from tableName where age betweeen 24 and 18;

3.去重查询

1
2
select distinct  id,username  from  tablename;    
# 在表格中重复的数据只打印一次,类似于将返回的结果去重

4.查询结果排序

order支持多字段排序,如果是多字段排序的话,命令会先对所有的数据按照第一个字段进行排序,排好序后,如果存在排序字段值相同的情况下,接着按照下一个排序字段进行排序

1
2
3
4
5
select * from tablename order by username asc|desc;    
# 将查询结果结果对username字段按照升序/降序排列, 默认排序方式是升序,所以可以asc省略

select * from tablename order by age asc,number desc;
# 这个先对数据按照年龄升序排序,如果某个年龄存在多个人,这时候这几个具有相同年龄的人就会继续再按照number的降序进行排序来决定先后

5.联合查询

联合查询就是使用多个select指令进行查询,相当于一次执行多个查询指令

使用联合查询的时候,每个select查询的字段必须一致,条件可以不一样

1
select  id,username  from  tablename  where  id=3  union select id,username from tablename where id=5;

6.聚合查询

null值不参与所有聚合函数运算,也就是说如果某列中有一个值是null,那么当你使用count的时候,并不会把该null统计进去

1
2
3
4
select  count(*) from studentinfo;    # 统计学生的数量,如果存在


select avg(age) from studentinfo;
函数 功能
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和

7.分组查询

分组查询的意思是

执行顺序:where>聚合函数>having

分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义,就是说如果查询语句以性别为分组的话,那么select查询的字段只能是函数以及性别

1
2
3
4
5
6
7
8
9
select gender,count(*)  from studentinfo  group by gender; 
# 根据性别分组,统计男性和女性的数量
# 前面的字段好想不能用其他字段,只能使用函数,也就是count等函数,以及组条件gender

select gender,count(*) from studentinfo where age>18 group by gender;
# 组查询可以和where结合使用,查询年龄大于18的人中统计男性和女性的数量

select count(*) from studentinfo where age>18 group by gender having count(*)>2;
# having的作用就是在分组之后的基础上再进一步进行条件判断筛选

image-20230912022815041

DQL的执行顺序

代码顺序

1
select  /  from  /  where /  group by / having /  order  by  /  limit

代码执行顺序

1
from  /  where  /  group by  /  having  /  select  /  order by  /  limit

DCL

InnoDB引擎

MySQL5.5,

原子一致隔离持久ACID

  • 本文标题:Mysql
  • 本文作者:Luo zerone
  • 创建时间:2023-09-12 15:06:42
  • 本文链接:http://zer-one.github.io/2023/09/12/Mysql/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!