1. MySQL
MySQL是一种广泛使用的关系型数据库管理系统(RDBMS),由瑞典的MySQL AB公司开发,目前属于甲骨文公司(Oracle Corporation)。
MySQL使用结构化查询语言(SQL)进行数据库管理,这是一种用于添加、访问和处理数据库内容的标准编程语言。MySQL被广泛应用于各种场景,包括网站建设、网络应用、数据存储和日志记录等。
MySQL级别组织:数据库管理系统DBMS——数据库DB——表Table——行Row——列Column
2. MySQL的安装
(1)使用custom自定义安装,默认使用TCP/IP协议,MySQL默认端口号为3306。
(2)配置用户及密码:默认使用root用户,输入密码;也可以自定义用户。
(3)配置服务,开机启动。不想开机启动的话,也可在任务管理器手动启动MySQL服务。
(4)配置环境变量:高级设置->环境变量->mysql所在位置bin目录(默认存放位置为C:\Program Files\MySQL\MySQL Server 5.7\bin)->确定->确定->确定,按如上步骤操作,可配置成功。
(5)测试是否安装成功:按住win+r键,输入cmd回车,在弹出的黑窗口输入以下代码,回车输入密码,若显示以下图片极为安装成功。
mysql -uroot -p
(6)通过黑窗口连接数据库时,输入代码
-u后加用户名,可以是系统用户,也可以是自己创建的用户,
-p后输入密码,
-P后输入端口号3306,
-h后输入IP地址,远程访问需要权限。
mysql -uroot -p;
3. MySQL使用客户端
(1)可以使用黑窗口操作,如上标题2所示操作进行连接
(2)可以使用workbentch,MySQL自带的客户端
(3)navicat软件(我使用的该软件)
4. SQL结构化查询数据库
4.1 数据库相关
(1)展示所有数据库
如下图所示,其中红色框选的为系统自带,初学者不要进行随意修改。
show databases;
(2)查看当前使用数据库
未选择数据库时会显示NULL。
select database();
(3)创建一个数据库
如下三种方法创建,创建时指定字符编码utf8,适用中文。
create database 数据库名 charset = utf8;
create database 数据库名 character set utf8;
create database if not exists 数据库名 charset = utf8;
(4)使用数据库
use 数据库名;
(5)删除数据库
drop database 数据库名;
4.2 表相关
(1)查询所有表
show tables;
(2)创建表
create table 表名 ( 列名 约束信息, 列名 约束信息);
# 例如以下语句创建teacher表
Create table teacher (id int primary key not null auto_increment, name varchar(20) not null)
(3)查看表信息
describe 表名
# 如:
desc teacher;
(4)删除表
desc 表名
desc teacher;
(5)修改表名
rename Table 原始表名 to 新表名
(6)操作表中的列信息
①添加列
add table 表名 列名 类型 约束
add table teacher add age int default 20;
②删除列
drop 列名
Add table teacher drop sex;
③修改列
change 原始列名 新列名 类型 约束
Add table teacher change age age int default 18;
4.3 数据相关
(1)查询数据
# 查询所有数据
Select * from 表名
# 查询某列数据
Select (列1, 列2... ) from 表名
# 查询满足某个条件的数据
Select * from 表名 where 条件;
(2)插入数据
①全列插入:包含所有列,需要给每一列赋值
# 插入单行:
Insert into 表名 values (列1,列2,列3)
# 插入多行:
insert into 表名 values () , () , ()...
②缺省插入:
a.需要指定列指定值,有默认值的可以忽略
Insert into 表名 ( 列1, 列2) values (值1,值2)
b.直接设置某列等于某个值
insert into 表名 set 列1 = 值1,列2 = 值2
(3)修改数据
# (如果不带条件则会修改整个表)
update 表名 set 列=值,列2=值2,where 条件
(4)删除数据
#(如果不带条件则会修改整个表)
delete from 表名 where 条件;
5. MySQL列的约束
(1)主键:primary key
一个表中必须有一列是主键;
主键列默认不能重复,一般是有一个独立的列id;
定义方法:可以在列类型之后使用primary key;在定义完所有列之后单独使用primary key
(2)非空:not null
(3)自增长:auto_increment
(4)唯一:unique
(5)默认:default
(6)外键:foreign key
6. MySQL的数据类型
(1)数字
Int | 整数 | 4个字节 |
bigint | 整数 | 8个字节 |
float | 浮点数,单精度 | 4个字节 |
double | 双精度 | 8个字节 |
decimal | 高精度 | 须指明小数位数及精度 |
(2)字符串
char | 长度 |
varchar | 可变长度 |
text | 长文本 |
(3)布尔 bool
0 | 假、False |
1 | 真、True |
(4)时间日期datetime
date | 日期 |
time | 时间 |
datetime | 时间日期 |
timestamp | 时间戳 |
(5)枚举Enum 罗列所有可能
7. 数据库的外键
(1)添加外键
①创建表时添加
Create table 表名( 列名 类型 列约束 , 列名 类型 列约束 , 列名 类型 列约束constraint 外键名 foreign key(列名) references 外键所属表名on update 外键修饰on delete 外键修饰);
# 例:
Create table teacher ( id int primary key not null auto_increment , name varchar(20) not null , sid int not null constraint fk_sid foreign key(sid) references student on update cascade on delete cascade);
②表创建完成之后添加
Alter table teacher add constraint 外键名 foreign key(列名) references 外键所属表名on update 外键修饰on delete 外键修饰);
# 例:
Alter table teacher add constraint fk_sid foreign key(sid) references student on update cascade on delete cascade;
(2)创建外键时,该外键在其主表中必须存在
(3)删除外键
alter table 表名 drop foreign key
(4)外键的修饰选项
①Restrict 拒绝,假如有外键使用到主表中的主键,修改时会被拒绝
②Cascade 级联,删除修改主表时,外键对应的内容同步操作
8.进阶查询
(1)普通查询
# 查询所有行的所有列
Select * from teacher;
# 查询所有行的部分(name,age)列
Select name,age form teacher;
# 查询部分行的条件列
Select name, age from teacher where id < 5;
(2)通过起别名来区分呈现不同表的同名的列
Select 列名 as 别名,列名 as 别名 from 表名 where 条件
Select name as 姓名 , age as 年龄 from teacher where id < 5;
(3)条件查询
比较运算符 | =、 !=、 <> 、< 、 <= 、 >、>= |
多个条件 | and 并且、or 或者 |
成员 | in 在其中一个、not in |
范围比较 | between and |
模糊查询 | like,(%代表n个字符,_代表一个字符) |
判空 | is null 空,is not null 不是空(空字符串不是null) |
9.函数
(1)系统函数
# 当前用户
Select user();
# 当前数据库版本
Select versioin();
# 当前使用数据库
Select database();
# 当前日期
Select current_date();
# 当前时间
Select current_time();
# 当前日期时间
Select current_timestamp();
(2)聚合函数
# 最大值
Max(列名)
# 最小值
Min(列名)
#平均值
Avg(列名)
# 求和
Sum(列名)
# 统计行数
Count(列名)
Select count(age) from teacher;
10. 常用技术
(1)排序:order
asc——默认升序、desc——降序
Select * from 表名 order by 列名 排序方式,列名 排序方式
(2)分页:limit
Select * from 表名 limit n 显示前n个
Select * from 表名 limit m,n 从索引m开始显示前n个
Select * from 表名 limit (page - 1)* size , size 显示page页每页size个
(3)分组:group by
针对查询结果进行分组
select count(*) from 表名 where 条件
Select sex,count(*) from teacher where id > 2 group by sex having sex = ‘女’
(4)去重:distinct去重某一列
Select distinct (age ) from teacher;
11.关联查询
(1)嵌套查询:一个查询的结果作为另一个查询的内容
Select * from student where tid = (select id from teacher where name=’t1’)
(2)笛卡尔连接:组合表中所有数据,
一个有m行,另一个n行,查询结果共m*n行
Select * from teacher, student
(3)内连接:inner join on 条件
Select student.name , teacher.name from teacher inner join student on student.tid = teacher.id
(4)左外连接:内连接结果+左表内容(右侧补null)
Select student.name , teacher.name from teacher left join student on student.tid = teacher.id
(5)右外连接:内连接结果+右表内容(左侧补null)
Select student.name , teacher.name from teacher right join student on student.tid = teacher.id
(6)全连接:左外连接 union 右外连接
Select student.name , teacher.name from teacher left join student on student.tid = teacher.id union Select student.name , teacher.name from teacher right join student on student.tid = teacher.id
12.用户与授权
(1)创建用户:
create user ‘temp1’@’%’ identified by ‘123456’
(2)分配权限:
# 分配所有权限:
grant all on *.* to ‘temp1’@’%’ ;
# 分配部分权限:
grant select,insert on 数据库名.* to ‘temp1’@’%’
(3)删除用户:
drop user ‘temp1’@’%’
(4)刷新权限:
flush privileges(刷新之后才能生效)
13.视图
视图就是一张虚拟的表,方便查询;修改视图内容就等于修改表内容;可以隐藏真实表结构,显示出需要的行列。
创建视图:可以直接在navicat工具里交互式创建。
使用视图:相当于使用表。
14.函数与存储过程
(1)函数经过计算返回一个结果,需要指定形参,制定返回值。
函数与存储过程都是存储在服务器上的,可以提升数据的安全。
创建函数:交互式创建,
调用函数:
select 函数名(参数); Select my_add(5, 10);
(2)存储过程:一套SQL操作,没有返回值。
BEGIN
SELECT * FROM student_teacher_view LIMIT n;
SELECT * FROM student LIMIT n;
SELECT * FROM teacher LIMIT n;
END
执行过程:
call 过程名(参数);
call my_select(5);
15.索引
索引是一种查询优化技术,可以提升查询效率,本质是要预先存储一些额外数据,牺牲存储空间,提升查询效率
索引类型:
主键索引:主键自带索引
唯一索引:unique
普通索引:formal
何时定义索引:索引不是创建越多越好,如果表的修改频率较高,不适合创建索引;如果表的查询频率较高,几乎不修改,就适合创建索引。
索引方法:
BTREE适合大数据量,适用于范围比较;
HASH适合小数据量,适用于精准的等值比较。
16.事务
Mysql存储引擎默认innoDB支持事务。
事务就是mysql数据库中对应的一系列操作,要么全部执行成功然后提交,要么全部失败回滚。
Mysql终端默认自动提交,
# 设置自动提交:
set autocommit = 1;
# 取消自动提交:
set autocommit = 0;
事务相关:
(1)开启事务:
# 默认不会自动提交
start transaction;
(2)结束事务:
# 成功提交
commit;
# 失败回滚
rollback;
事务特性:ACID原则
原子性atomicity:不可再分的单元,要么全部成功,要么全部失败
一致性consistency:执行前后数据要保持一致
隔离性isolation:多个事务互不影响
持久性durability:一旦提交,则执行完毕,永久改变
17.存储引擎
存储引擎是数据库存储的实现方式,不同的存储引擎适合不同的场景。
关键字:
create table 表名() engine = 引擎名;
常用存储引擎:
(1)InnoDB:mysql默认存储引擎
特点:支持外键;支持事务;支持行级别锁定与阻塞;综合能力强,适用于大多数场景,使用后缀为ibd文件存储内容
(2)MyISAM特点:查询、排序速度非常快,但不支持外键。
(3)Memory特点:读写内存速度快,但是不能持久化,即不能在本地保存。一旦数据库断开连接数据全部清空。
(4)CSV特点:使用逗号分隔,便于导入导出操作
18.数据库的备份与恢复
数据库备份,将数据库信息转储为sql文件,文件名.sql
数据库恢复,手动创建数据库之后,右键、执行sql文件,将文件导入即可。
19.使用pycharm连接数据库
导入pymysql模块:
pip install pymysql
步骤:
(1)导入pymysql模块
(2)构建一个链接
(3)通过连接构建一个游标实例
(4)通过游标实例执行sql语句; 获取游标中所有内容
(5)释放游标与连接
# 1.导入pymysql模块
import pymysql
# 2.构建一个链接
con = pymysql.connect(host="localhost", port=3306, user="root", password="123456")
# 2.1 使用数据库
con.select_db("ly")
# 3.通过连接构建一个游标实例
cur = con.cursor()
# 4.通过游标实例执行sql语句
sql = "select * from teacher"
line = cur.execute(sql)
print(f"影响行数{line}")
# 4.1获取游标中所有内容
# datas = cur.fetchall()
# for data in datas:
# print(data)
# 4.2 改变游标位置
cur.scroll(1)
data = cur.fetchone()
print(data)
print("--------------------")
datas = cur.fetchmany(3)
for data in datas:
print(data)
print("--------------------")
datas = cur.fetchall()
for data in datas:
print(data)
# 相对改变
print("*****************************")
cur.scroll(-1, mode="relative")
data = cur.fetchone()
print(data)
# 绝对改变
print("*****************************")
cur.scroll(0, mode="absolute")
data = cur.fetchone()
print(data)
# 5.释放游标与连接
cur.close()
con.close()
20.pycharm有关MySQL方法使用
(1)Fetchone:获取游标执行完sql语句之后的一行内容
(2)Fetchall:获取游标执行完sql语句之后的所有内容
(3)Fetchmany(size):获取游标执行完sql语句之后的size行内容
(4)Scroll:改变游标位置,默认relative,可以变为absolute
(5)Execute:执行一行sql语句函数
(6)Executemany:执行多行SQL语句