目录
(2)手动开启事务:begin 以及 事务回滚:rollback
先分别创建两个表text和text2,并向两个表中写入一些数据
一、连接查询
1、内连接
(1)无条件连接:inner join
- inner join 中只链接两个表中具有相同字段的行,不相同的字段会被省略
- text是主表;text2是从表。
例:select * from text inner join text2;
- 主表中的每一条数据都会和从表里面的所有数据匹配
(2)有条件连接:on 条件
- on 后面是连接条件
例:select * from text inner join text2 on text.id=text2.id;
- 将两个表中id相同的连接在一起
2、外连接
(1)左连接:left join
- 以左表为基础,左表内容全部显示,右表没有的以null值显示
例:select * from text left join text2 on text.id=text2.id;
- 将相同的两表相同的id连接,以左表为基础,左表全部显示,右表中和左表相同的id显示,不相同的id则用null值显示。
(2)右连接:right join
- 以右表为基础,右表内容全部显示,左表没有的以null值显示
例:select * from text right join text2 on text.id=text2.id;
- 将相同的两表相同的id连接,以右表为基础,右表全部显示,左表中和右表相同的id显示,不相同的id则用null值显示。
二、表结构的修改--alter
1、修改表名
alter table 原名 rename to 新名;
- 将text表的名字修改为new_table
2、修改字段名
alter table 表名 change 原名 新名 类型;
注意:类型一定要写,且只能对同一类型进行修改,如果将一个字段类型是int型的修改为char型则会报错。
- 查看表结构可以看到字段的类型
- 将score改成math_score
3、修改字段类型--modify
语法:alter table 表名 modify 字段名 类型;
4、添加字段
alter table 表名 add 字段名 类型;
-
(1)添加日期字段:datetime
alter table 表名 add 字段名 datetime;
- 向日期字段中写入信息
- 通过now()获取当前时间
-
(2)enum字段
alter table 表名 add 字段名 enum('F', 'M'); (F和M是固定值,自己可以设置)
当在类型为enum的字段sex中写入数据时,数据必须是F或M,否则就会报错
5、删除字段
alter table 表名 drop 字段名;
三、约束条件
1、默认:default
例:create table 表名(id int default 2);
演示如下:
- (1)创建一个名为new_one的表,并设置默认值:default 2
- (2)当不写id值时,则默认id值为2
- 当写入id值时,就会按写入的id值写入
2、非空:not null
例:create table 表名(id int not null); (意思是设置id为非空值,表示写入id时不能为空)
演示如下:
3、唯一:unique key
例: create table 表名(id int unique key); (表示的意思是id中不能有重复的值,只能由唯一的值)
演示如下:
- 创建一个具有唯一性的表
- 在表中写入两个相同的id值,报错
4、主键:primary key
- primary key :非空+唯一,每张表只允许由一个主键
例:create table 表名(id int primary key, name varchar(20));
5、自增长:auto_increment
例:create table 表名(id int auto_increment,name varchar(20), primary key(id));
primary key(id):设置id为主键
演示如下:
- (1)创建一个名为four_one的表
- 向表中写入几个空的数据,id的值会自动从1向上增长
6、设定初始值
例:create table 表名(id int auto_increment, primart key(id))auto_increment=10;
auto_increment=10:id的值从10开始向上增长
演示如下:
- (1)创建一个名为one的表
- 向表中写入几个空的数据,id的值会自动从10向上增长
7、外键:foreign key
假设某一个字段是某个表的外键时,那么该字段必须是主键。
外键的作用:使两张表关联,保证数据的一致性和实现一级联操作。
演示如下:
-
(1)创建一个A表
create table A(id int primary key, name varchar(20));
-
(2)创建一个B表
create table B(B_id int primary key, age int, foreign key(B_id) references A(id));
foreign key(B_id):B_id是外键,有外键的是从表
references 表名(字段名):关联的是表名和字段
-
(3)外键里能够插入的数据一定是主键里面有的数据
添加字段:先操作主表,再去从表添加
删除数据:先删除从表,再去主表删除
8、删除主外键约束
(1)删除外键约束
先获取外键名再去删除外键约束
-
查看表创建语句
show create table 表名;
-
找到键名后,删除外键约束
alter table 表名 drop foreign key 外键名;
(2)删除主键约束
alter table 表名 A drop primary key;
如果A表还跟其他表有关联,要先删除从表的外键,再删除主表的主键。
(3)主外键的区别
主键:唯一标识,不能有重复,不能为空。
外键:是另一个表的主键。
四、Mysql与python交互
需要下载的模块:pip install pymysql
1、数据准备
创建一个名为First的数据库,并在其中创建一个名为students的表,然后向表中写入一些数据。
2、在py文件中写入代码
import pymysql
# 连接数据库
db_config = {
"host":'localhost', # 本地用户
'port':3306, # 规定是3306
'user':'root',
'password':'', # 登录mysql的密码
'db':'First' # 使用First数据库
}
# 建立连接的对象
conn = pymysql.connect(**db_config)
# 建立游标对象
cur = conn.cursor()
# 执行sql语句
sql = cur.execute('select * from students')
print(sql) # 打印接受到的数据个数
print(cur.fetchall())
# 关闭游标
cur.close()
# 关闭连接
conn.close()
以上代码的运行结果:
3、事务
事物的特性:原子性,一致性,隔离性,持久性
(1)提交事务:commit()
提交事务——直正插入和修改数据,如果没有提交事务,插入和修改的数据只是临时保存,并不能存到数据库中。
演示未提交事务时出现的情况:
向数据库中写入信息
写入信息后在数据库中查看
演示提交事务时的情况:
附上源码:
import pymysql
# 连接数据库
db_config = {
"host":'localhost', # 本地用户
'port':3306, # 规定是3306
'user':'root',
'password':'', # 登录mysql的密码
'db':'First' # 使用First数据库
}
# 建立连接的对象
conn = pymysql.connect(**db_config)
# 建立游标对象
cur = conn.cursor()
# 执行sql语句
sql = cur.execute('insert into students(name,age) values("孙大圣",500)')
# 提交事务
conn.commit()
# 关闭游标
cur.close()
# 关闭连接
conn.close()
(2)手动开启事务:begin 以及 事务回滚:rollback
事务回滚:返回上一步对数据进行的增、删、改等操作
演示如下:
- (1)查询看事务是否开启
show variables like 'autocommit';
ON:表示事务是关闭状态,每次执行增删改查都会自动提交所操作的语句。
- (2)查看数据
- (3)开启事务
- (4)插入数据并查看
- (5)回滚数据,再次查看数据
注意!!!一次手动开启事务,只能用一次回滚,第二次回滚无效
为了解决每次使用begin的麻烦,可以输入以下命令
开启事务:set autocommit=off;