python_MySQL数据库
MySQL数据库的特点:
1、是关系型数据库
关系型数据库的特点
1、数据是以行和列的的形式存储的
2、这一系列的行和列称为表
3、表中的每一行叫做记录
4、表中的每一列叫做字段
5、表和表之间的逻辑关联叫做关系
6、关系型数据库的核心内容是:关系 即二维表
示例:
1、关系型数据库存储
表1:学生信息表
姓名 年龄 班级
aa 20 1712
bb 25 1713
表2:班级信息表
班级 班主任
1712 曹操
1713 刘备
说明:要找到学生aa的班主任是谁,需要通过班级字段来找到班主任
2、非关系型数据库存储(是以键值对的形式存储的)
{姓名:“aa”,年龄:20,班级:1712,班主任:“曹操”}
二者之间的比较:
非关系行数据的性能比较高(查找数据的速度)但是会造成数据的冗余
2、跨平台
可以在Unix、Linux、Windows上运行MySQL服务
3、支持多种语言编程语言
4、是基于硬盘的读写
MySQL的安装:
1、Linux系统下安装MySQL服务
1、安装服务端:sudo apt-get install mysql-server
2、安装客户端:sudo apt-get install mysql-client
3、初始的用户名和密码在/etc/mysql/debian.cnf文件中,使用 cd /etc/mysql/ 进去目录,subl debian.cnf 打开查看
启动和连接MySQL服务
1、服务端启动
1、查看MySQL服务的状态:sudo /etc/init.d/mysql status
2、启动MySQL服务:sudo /etc/init.d/mysql start
3、停止MySQL服务:sudo /etc/init.d/mysql stop
4、重启MySQL服务:sudo /etc/init.d/mysql restart
2、客户端链接
1、命令格式:mysql -h主机名 -u用户名 -p密码(-h和-u后面可以添加空格,-p后面不可以)
mysql -h localhost -u debian-sys-maint -pLo0r79JmxvMFNtA
2、本地连接可以省略 -h 选项
mysql -u debian-sys-maint -pLo0r79JmxvMFNtA
3、断开与服务端的连接:exit quit \q
基本的SQL命令:
1、SQL命令的使用规则
1、每条命令必须以分号(;)结尾(说明中文分号无效)
2、SQL命令不区分字母大小写
3、使用\c终止命令的执行
2、库的管理(指定字符集)
1、库的基本操作
1、查看已有的库:show databases;
(有四个默认的库,不要修改或删除:information_schema,mysql,performance_schema,sys)
2、创建库:create database 库名 default charset=utf8;
3、查看创建库的语句:show create database 库名;
( CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */)
4、查看当前所在库:select database();
5、切换库:use 库名;
6、查看库中已有的表:show tables;(如果当前的库为NULL则会报错:ERROR 1046 (3D000): No database selected)
7、删除库:drop database 库名;
2、库的命名规则
1、可以使用数字、字母、_,但是不能是纯数字
2、库名区分字母大小写
3、库名具有唯一性(不能重复)
4、不能使用特殊字符和mysql关键字
3、表的管理:
1、表的基本操作:
1、创建表:
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
....
)
2、查看创建表的语句(字符集):show create table 表名;
3、查看表结构:desc 表名;
4、删除表:drop table 表名;
2、注意:
1、所有的数据都是以文件的形式存储在数据库目录下
2、数据库目录:/var/lib/mysql
4、表记录的管理:
1、在表中插入记录
1、insert into 表名 values(值1,值2),... 说明:值就是每个字段对应的值,
2、insert into 表名(字段名1,字段名2...)values(值1,值2...)说明:给指定的字段添加值
3、insert into 表名 values(一条记录1),(一条记录2)... 说明:可以同时添加多条记录
2、查看表记录
1、select * from 表名;*号代表所有的字段
2、select 字段名1,字段名2,... from 表名;
3、更新表的记录
1、update 表名 set 字段=值,字段=值,...where 条件;
2、注意:update语句后如果不加where子句,表中所有记录该字段的值都会更改
4、删除表记录
1、delete from 表名 where 条件1 and 条件2;
2、注意:delete语句后如果不加where子句,表中的所有记录都会被删除
5、如何更改默认字符集:
1、方法:通过更改Mysql的配置文件实现
2、步骤:
1、获取root权限:sudo -i
2、修改mysql配置文件:vi /etc/mysql/mysql.conf.d/mysqld.cnf
1、点击a键进入编辑状态
2、在[mysqld]下 插入character_set_server = utf8
3、点击Esc键退出编辑状态
4、点击Shift + :
4、输入wq命令写入并退出 (输入q!退出不保存)
3、重启mysql服务:sudo /etc/init.d/mysql restart
说明:更改默认字符集之后,并不影响之前创建好的数据库和数据库中的数据表,要想修改已经创建好的数据库编码和数据表的编码:
数据库:alter database fruit character set utf8;
数据表:alter table user character set utf8;
客户端把数据存储到数据库服务器上的过程(面试会问到)
1、连接到数据库服务器:mysql -h -u -p
2、选择库:use 库名;
3、创建/修改表
4、断开与数据库的连接:exit 、quit、\q
数据类型:
1、数值类型(有符号signed 和 无符号 unsigned)
1、整型
1、int 大整型(占4个字节):
取值范围:0~2**32-1
2、tinyint 微小整型(占1字节)
1、有符号(signed默认)取值范围:-128~127
2、无符号(unsigned) 取值范围:0~2**8-1
3、smallint 小整型(占2字节)
取值范围:0~65535
4、bigint 极大整型(占8字节)
取值范围:0~2**64-1
2、浮点型
1、float(4个字节,最多显示7个有效位)
1、用法:字段名 float(m,n) m代表总位数,n代表小数位位数
float(5,2)取值范围:-999.99~999.99;会根据小数第3位进行四舍五入
说明:m总位数不要超过7位,否则7位之后数字会随机生成。
2、double(8字节,最多显示15个有效位)
用法:字段名 double(m,n)
3、decimal(占M+2个字节,最多显示28个有效位)
用法:decimal(M,D)
说明:浮点型插入整数时会自动补全小数位数;
2、字符类型
1、char(定长)
1、宽度取值范围:1~255
2、不给宽度默认为宽度为1
2、varchar(变长)(输入要的值不能超过变长值,储存空间根据实际输入的数值来确定)
1、取值范围:1~65535
2、注意:
1、varchar没有默认宽度,必须给定一个宽度
2、char和varchar使用时都给宽度,但不能超过各自的范围
3、char 和 varchar 的特点
1、char浪费存储空间但是性能高
2、varchar节省存储空间,性能低(需要计算需要占用的存储空间)
4、字符类型的宽度和数值类型的宽度的区别
1、数值类型的宽度为显示宽度,只用于select查询时使用,和占用存储空间的大小无关,可用zerofill查看效果
2、字符类型的宽度超过则无法存储
3、枚举类型
1、定义:字段值只能在列举的范围内选择
2、enum 单选(最多有65535个不同的值)
字段名 enmu(值1,值2,...)
3、set 多选(最多有64个不同的值)
字段名 set(值1,值2,...),插入值的时候每个值之间用逗号分隔开
4、日期时间类型
1、year: 年 YYYY
2、date:日期 YYYYMMDD
3、time:时间 HHMMSS
4、datetime:日期时间 YYYYMMDDHHMMSS
5、timestamp:时间日期 YYYYMMDDHHMMSS
6、说明:
1、datetime 不给值默认返回NULL
2、timestamp不给值默认返回系统当前时间
表字段的操作:
1、语法:alter table 表名 执行动作
1、添加字段(add):
1、添加到末尾
alter table 表名 add 字段名 数据类型
2、添加到开始
alter table 表名 add 字段名 数据类型 first
3、添加到指定位置
alter table 表名 add 字段名 数据类型 after 已有字段名
2、删除字段(drop):
alter table 表名 drop 字段名
3、修改数据类型(modify):
alter table 表名 modify 字段名 新的数据类型
4、修改字段名
alter table 表名 change 旧名 新名 数据类型
5、修改表名
alter table 表名 rename 新表名
练习:
1、填空题:
1、MySQL中的数据类型有 数值类型、字符类型、枚举类型、日期时间类型
2、关系型数据库的核心内容是 关系 即 二维表
2、简答题:
1、简述客户端把数据存储到数据库服务器上的过程
答:
1、连接MySQL服务器数
2、选择库 use 库名
3、添加\修改表
4、断开与数据库的连接 exit | quit | \q
2、char和varchar的区别?各自的特点
答:
1、char(定长),所占用的内容空间已经由定长决定了,虽然多占用内存,但是效率高
2、varchar(不定长),所占用的内控空间由添加字段的数据本身决定,但是需要计算占用的空间,效率低,省内存
3、操作题:
1、创建一个库school
create database school;
2、在库中创建表students来存储学生信息,字段如下学生(id)要求显示宽度为3位,不够用0填充
姓名(name),年龄(age只能为正数)、成绩(score浮点)、性别(sex单选)、爱好(likes多选)、入学时间(年月日)
use school;
create table students(
id int(3) zerofill,
name char(20),
age tinyint unsigned,
score float(4,1),
sex enum('男','女'),
likes set('打篮球','学习','购物','打游戏','打仗'),
go_school_time date
)default charset = utf8;
3、查看students的表结构
desc students;
4、在students表中增加一个字段id,加在第一列
alter table students add kid int first;
5、在表中任意插入5条记录
insert into students values(1,1,'曹操',60,80,'男','打仗,打游戏',20000912);
insert into students values(2,2,'刘备',50,90,'男','打仗,打游戏',20000912);
insert into students values(3,3,'关羽',45,70,'男','打仗,打游戏',20000912);
insert into students values(4,4,'张飞',40,60,'男','打仗,打游戏',20000912);
insert into students values(5,5,'小乔',20,100,'女','学习,购物',20000912);
6、查看所有学生的姓名、成绩、和入学时间
select name,score,go_school_time from students;
名词介绍
1、DB(Database)
DB就是数据库,存储数据库的仓库
2、DBMS(Database Management System)
数据库管理系统
数据库管理的软件有MySQL、Oracle....
3、DBS(Database System)
数据库系统
DBS = DB(存储)+DBMS(数据库软件)+数据库应用(财务管理系统、人事管理系统)+用户
where 条件子句(配合查、改、删操作)
1、语法格式:
select * from 表名 where 条件;
运算符操作(配合查询、修改、删除操作)
1、数值比较&字符比较:
1、数值比较运算符:= != > >= < <=
2、字符比较运算符:= !=
3、语法格式:
查询:select * from 表名 where 字段名 运算符 数字/字符;
修改:update 表名 set 字段名=值,...where 字段名 运算符 数字/字符;
删除:delete from 表名 where 字段名 运算符 数字/字符;
2、逻辑比较:
1、运算符:
and(多个条件同时满足)
or(多个条件有一个条件满足就可以)
3、范围内比较:
1、运算符:between and 、 in 、not in
2、语法格式
字段名 between 值1 and 值2(包括值1和值2)
字段名 in(值1,值2,...)
字段名 not in (值1,值2,...)
4、匹配空、非空
1、空:is null
2、非空:is not null
3、注意:
1、null:空值,必须用is 或者is not 去匹配
2、‘’:空字符串,用 = 或者 != 去匹配
5、模糊比较
1、语法格式:字段名 like 表达式
2、表达式
1、_:匹配单个字符
2、%:匹配0到多个字符,不能是NULL
SQL查询:
1、总结(执行顺序)
完整的语句:select ...聚合函数 from ... where ... group by...having ... order by ...limit...;
上面语句的执行顺序:1、where 2、group by 3、select...聚合函数 from 4、having 5、order by 6、limit
2、order by
1、作用:对查询的结果进行排序
2、语法格式:order by 字段名 排序方式;
3、排序方式:
1、ASC(默认):升序
2、DESC:降序
3、说明:这个排序方式不区分大小写(asc,desc)
3、limit (永远放在SQL语句的最后面)
1、作用:限制显示查询记录的条数
2、用法
1、limit n :显示n条记录
2、limit m n :从m+1条记录开始显示,n表示显示显示几条记录
示例:limit 1,3 :显示2,3,4三条记录
3、练习
1、查找防御值倒数第二名至倒数第四名的蜀国英雄记录
select * from sanguo where country='蜀国' order by fangyu asc limit 1,3;
2、查找攻击值前三名且名字不为空值的蜀国英雄的姓名,攻击值和国家
select name,gongji,country from sanguo where country='蜀国' and name is not NULL order by gongji desc limit 3;
4、聚合函数:
1、分类
1、avg(字段名):求字段的平均值
2、sum(字段名):求字段的和
3、max(字段名):求字段的最大值
4、min(字段名):求字段的最小值
5、count(字段名)统计该字段记录的个数(空值NULL不会被统计,‘’可以被统计)
2、练习:
1、攻击力最强值
select max(gongji) from sanguo;(默认的将max(gongji)做为字段名,可以通过as 来修改)
2、统计一下表中id,name字段分别有多少条记录
select count(id) as,c_id count(name) as c_name from sanguo;
3、计算蜀国英雄的总攻击力
select sum(gongji) from sanguo where country='蜀国';
4、统计蜀国英雄中攻击力大于200的英雄数量
select count(*) from sanguo where country='蜀国' and gongji >200;
5、group by
1、作用:给查询的结果进行分组
2、练习
1、查询sanguo表中一共有几个国家
select country from sanguo group by country;
2、计算所有国家的平均攻击力
select country,avg(gongji)from sanguo group by country;
3、查找所有国家中 英雄数量最多的 前2名 的国家的名称和英雄数量
select country,count(*) from sanguo group by country order by count(*) desc limit 2;
3、注意:
1、group by之后的字段必须要为select之后的字段
2、如果select之后的字段和group by之后的字段不一致,则必须要对select之后的该字段做聚合处理
6、having
1、作用:对查询的结果进行进一步的筛选
2、练习
1、找出平均攻击力大于105的国家的前两名,显示国家名和平均攻击力
select country,avg(gongji) from sanguo group by country having avg(gongji)>105 order by avg(gongji) desc limit 2;
3、注意:
1、having语句通常与group by 语句联合使用,用来过滤由group by语句返回的记录集
2、having语句的存在弥补了where关键字不能与聚合函数联合使用的不足,having操作聚合函数生成的显示列
3、where只能操作表中实际存在的字段,having可以操作聚合函数生成的显示列
7、distinct
1、作用:不显示字段的重复值
2、练习:
1、sanguo表中一共有多少个国家
select distinct country from sanguo;
2、计算蜀国一共有多少个英雄
select count(distinct id) from sanguo where country='蜀国';
3、注意
1、distinct处理的是distinct和from之间的所有字段,所有字段值必须全部相同才能去重
2、distinct不能对任何字段做聚合处理
8、在查询表记录时做数学运算
1、运算符: + - * / %
2、练习:
1、查询时显示所有英雄的防御力+5
select id,name,fangyu+5 from sanguo;
约束
1、作用:为了保证数据的完整性、一致性、有效性
2、约束分类
1、默认约束(default)
1、作用:在插入记录时,如果不给字段赋值,则使用默认值
2、格式:字段名 数据类型 default 默认值
2、非空约束(not null)
1、作用:不允许将该字段设置为null
2、格式:字段名 数据类型 not null
索引
1、定义:对数据库中表的一列或者多列的值进行排序的一种结构(MySQL中用Btree方式(二叉树))
2、优点:加快数据的检索速度
3、缺点
1、当对表中的数据进行增加、删除或修改的时候,索引也要动态维护,降低了数据的维护速度
2、索引需要占用物理空间
4、索引分类
1、普通索引(index)
1、使用规则:
1、一个表中可以有多个index字段
2、字段的值可以有重复,且可以为null值
3、经常把做查询条件的字段设置为index字段
4、index字段的key标志是MUL
2、创建index
1、创建表时创建:index (字段名1),index(字段名2)
create table t2(
id int,
name char(15),
age tinyint unsigned,
index(id),inedx(name));
2、在已有表中创建index
1、语法:
create index 索引名 on 表名(字段名)
create index age on t2(age);
2、注意:
索引名一般和字段名一样
3、查看普通索引
1、通过desc 表名 -----→查看key标志
2、show index from 表名;
4、删除普通索引
drop index 索引名 on 表名;
2、唯一索引(unique key)
1、使用规则
1、一个表中可以有多个unique字段
2、unique字段的值不允许重复,但可以为空
3、unique的key标志是UNI
2、创建唯一索引
1、创建表的时候创建
方法1、unique (字段名1),unique(字段名2)
方法2、字段名 数据类型 unique
2、在已有表中创建
create unique index 索引名 on 表名(字段名);
示例:create unique index name on user(name);
3、删除唯一索引
drop index 索引名 on 表名;
注意:index unique在删除时只能一个一个删
3、主键索引(primary key)
1、使用规则
1、一个表中只能有一个主键字段
2、对应字段的值不能重复,且不能为空
3、主键字段的key标志为PRI
4、把表中能够唯一标识一个一条记录的字段设置为主键,通常把表中记录编号的字段设置为主键
2、创建主键(primary key)
1、在创建表时
1、字段名 数据类型 primary key ;
2、primary key (字段名)
3、primary key (字段名1,字段名2):复合主键,当字段1,2的值都相同时才算相同,一般不用
2、在已有表中创建
1、alter table 表名 add primary key(字段名)
3、删除
1、alter table 表名 drop primary key
说明:删除主键后把不能重复的特性删掉了,但是不能为空的特性还在
4、自增长属性(auto_increment)
1、作用:通常和主键字段一起配合使用
2、创建
1、在创建表的时候创建
字段名 数据类型 primary key auto_increment
2、在已有表中创建
alter table 表名 modify 字段名 数据类型 primary key auto_increment;
3、说明:有自增长属性的字段在插入记录时可以用0来补位,值从1开始逐一递增,如果字段填入的值比表中最后一个的值大
那么他们之间的值将不存在。
5、删除主键及自增长属性
1、alter table 表名 modify 字段名 数据类型 ;(先删除自增长属性)
2、alter table 表名 drop primary key;
4、外键索引(foreign key)
1、定义:让当前表的字段值在另一张表的范围内选择
2、语法格式:
foreign key (参考字段名) reference 被参考表名(被参考字段名) on delete 级联动作 on update 级联动作
3、案例:
表1:缴费信息表(财务)
学号 姓名 班级 缴费金额
1 唐伯虎 1712 20000
2 秋香 1712 19000
表2:学生信息表(班主任)
学号 姓名 缴费金额
1 唐伯虎 20000
create table jftab(
id int primary key,
name char(20),
class char(7),
money int
)default charset=utf8;
create table bjtab(
-> stu_id int,
-> name varchar(15),
-> money int,
-> foreign key(stu_id) references jftab(id) on delete cascade on update cascade
-> )default charset=utf8;
4、删除外键
1、语法格式:
alter table 表名 drop foreign key 外键名(bjtab_ibfk_1);
2、注意
查看外键的方式:
show create table 表名;(查看 CONSTRAINT `bjtab_ibfk_1`)
5、在已有表中添加外键
alter table 表名 add foreign key(参考字段名)references 被参考表名(被参考字段名)on delete 级联动作 on update 级联动作
说明:在已有表中添加外键时,会受到表中原有数据的限制
6、级联动作
1、cascade:数据级联更新
1、当主表删除记录时,如果从表有相关联记录则级联删除
2、当主表更新被参考字段值时,从表级联更新参考字段值
2、restrict(默认)
1、当主表删除记录时,如果从表中有相关联记录,则不允许主表删除
2、当主表更新被参考字段值时,如果自从表有参考字段,则不允许更新
3、set null
1、当主表删除记录时,从表中相关联记录外键字段值变为null
2、update同理
4、no action
同restrict一样,都是立即检查外键限制
7、使用规则
1、两张表被参考字段和参考字段的数据类型要一致
2、被参考字段必须是key的一种,通常是primary key
5、在哪些字段上面适合添加索引
1、在较为频繁的作为查询条件的字段应该创建索引
2、唯一性太差的字段不适合单独创建索引,比如性别
3、更新太频繁的字段不适合创建索引
4、不会出现在where子句中的字段不适合创建索引
6、注意事项
1、创建一个复合索引后,查询只用到了其中的一个字段则不会使用索引
创建复合索引:create index fangyu_country on sanguo(fangyu,country);
explain可以帮助我们在不真正执行某个SQL语句的时候,就可以分析sql语句
mysql> explain select * from sanguo where country="蜀国"\G
*************************** 1. row ***************************
id: 1 #查询序列
select_type: SIMPLE #查询类型
table: sanguo #查询表名
partitions: NULL
type: ALL #扫描方式,ALL表示全表扫描
possible_keys: NULL #可能使用到的索引
key: NULL #实际使用到的索引
key_len: NULL #使用索引的个数
ref: NULL
rows: 8 #SQL语句扫描的行数
filtered: 12.50
Extra: Using where
1 row in set, 1 warning (0.00 sec)
2、使用模糊查询时不会使用到索引
3、如果查询语句中使用了or只要其中一个条件没有索引,则查询时则不会使用索引
数据导入
1、作用:将文件系统的内容导入到数据库中
2、语法格式:
1、load data infile '文件名' into table 表名 fields terminated by '分隔符' lines terminated by '分隔符';
说明:文件为绝对路径
3、xdl: x: 1000:1000:xdl,,,:/home/xdl:/bin/bash(使用cat /etc/passwd | grep "xdl";命令查看)
用户名:密码:UID:GID: 描述: 家目录: 登录权限
4、把/ect/passwd/ 导入到MySQL数据库中
5、操作步骤:
1、在数据库中创建对应的表:
create table userinfo(
-> username char(20),
-> password char(1),
-> uid int,
-> gid int,
-> comment varchar(50),
-> homedir varchar(50),
-> shell varchar(50)
-> );
2、查看数据库的默认搜索路径:
show variables like 'secure_file_priv';
3、将系统文件拷贝到数据库的默认搜索路径中
sudo cp /etc/passwd /var/lib/mysql-files
4、将数据导入表中
load data infile '/var/lib/mysql-files/passwd'
-> into table userinfo
-> fields terminated by ':'
-> lines terminated by '\n';
数据导出
1、作用:将数据库中表的记录保存到系统文件中
2、语法格式:
select ... from 表名 into outfile '文件名' fields terminated by '分隔符' lines teriminated by '分隔符'
3、练习:
1、把userinfo 表中的用户名,密码,和uid号三个字段导出到userinfo.txt中
select username,password,uid from userinfo
-> into outfile '/var/lib/mysql-files/userinfo.txt'
-> fields terminated by ' '
-> lines terminated by '\n';
2、将库名为mysql库中的user表中的User,Host两个字段的值导出到user2.txt
select User,Host from user
-> into outfile '/var/lib/mysql-files/user2.txt'
-> fields terminated by ' '
-> lines terminated by '\n';
4、注意:
1、导出的内容由SQL查询语句决定
2、执行导出命令时路径必须指定在对应的数据库目录下
3、show variables like 'secuer_file_priv';查询路径
表的复制
1、表的复制
1、语法格式
create table 表名 select 查询命令;
2、练习
1、复制userinfo表中的数据到userinfo2表中
create table userinfo2 select * from userinfo;
2、复制userinfo表的前10行记录到uesrinfo3中
create table userinfo3 select * from userinfo limit 10;
3、复制userinfo表的用户名、密码、uid三个字段的2~10条记录到userinfo4中
create table userinfo4 select username,password,uid from userinfo limit 1,9;
2、只复制表结构
1、语法格式
create table 表名 select...where false;
3、注意复制表的时候不会把原有表的 键 属性赋值过来
嵌套查询
1、定义:把内层的查询结果作为外层查询的条件
2、语法格式:
select 查询语句 where 条件 (select 查询语句)
3、练习:
1、把uid的值小于这个字段的平均值的用户和uid显示出来
方法1:select avg(uid) from userinfo;
select ussername,uid from userinfo where uid < 第一条查询的结果
方法2:
select username,uid from userinfo where uid < (select avg(uid) as vag_uid from userinfo);
2、查找userinfo表中用户名在mysql库下的user表中Host值为localhost并且User值为root的 用户名
select username from userinfo where username in (select User from mysql.user where Host='localhost' and User='root')
多表查询
1、两种方式:
1、select 字段名列表 from 表名列表;(笛卡尔积)
select * from tt2,tt3;
2、select 字段名列表 from 表名列表 where 条件
select * from tt2,tt3 where tt2.uid = tt3.uid;
2、练习
1、显示省和市的信息
select sheng.S_name,city.C_name from sheng,city where sheng.S_ID = city.CFather_ID;
2、显示省、市、县的信息
select sheng.S_name,city.C_name,xian.X_name from sheng,city,xian where sheng.S_ID=city.CFather_ID and city.C_ID=xian.XFather_ID;
连接查询
1、内连接
1、定义:从表中删除与其他被连接表中没有匹配到的行
2、语法格式
select 字段名列表 from 表1 inner join 表2 on 条件
3、练习
1、显示省、市信息
select sheng.S_name,city.C_name from sheng inner join city on sheng.S_ID = city.CFather_ID;
2、显示省、市、县的信息
select sheng.S_name,city.C_name,xian.X_name from sheng inner join city on sheng.S_ID = city.CFather_ID inner join xian on city.C_ID=xian.XFather_ID;
2、外连接
1、左连接
1、定义:以左表为主显示查询结果
2、语法:
select 字段名列表 from 表1 left join 表2 on 条件
3、练习:
1、显示省市信息
select sheng.S_name,city.C_name from sheng left join city on sheng.S_ID = city.CFather_ID;
2、右连接
1、定义:以右表为主显示查询结果
2、语法:
select 字段名列表 from 表1 right join 表2 on 条件
3、练习
1、显示省市信息
select sheng.S_name,city.C_name from sheng right join city on sheng.S_ID = city.CFather_ID;
2、显示省市县的信息,要求市全部显示
select sheng.S_name,city.C_name,xian.X_name from sheng right join city on sheng.S_ID = city.CFather_ID left join xian on city.C_ID=xian.XFather_ID;
数据备份(在linux终端下操作)
1、命令格式:
mysqldump -u用户名 -p 源库名 > 路径/xxx.sql:
2、源库名的表示方式
--all-database 备份所有库
库名 备份单个库
-B 库1 库2 ... 备份多个库
库名 表1 表2 备份指定库的指定表
3、练习
1、备份所有库为all_mysql.sql放到主目录下mydata目录中
mysqldump -u debian-sys-maint -p --all-databases > ~/mydata/all_mysql.sql
2、备份三个库,放到mydata目录中
mysqldump -u debian-sys-maint -p -B db1 db2 db3 > ~/mydata/db1_db2_db3.sql
3、备份省市县的三张表
mysqldump -u debian-sys-maint -p db3 sheng city xian > ~/mydata/sheng_city_xian.sql
数据恢复(在linux终端下操作)
1、命令格式
mysql -u用户名 -p 目标库名 < 路径/xxx.sql
2、从所有备份文件中恢复指定库(--one-database)
mysql -u用户名 -p --one-database 目标库 < 路径/xxx.sql
说明:目标库必须是所有备份中存在的库名
3、练习
1、先备份db3库,删除省市县三张表,
drop table sheng,city,xian;
2、在db3库中创建一张新表t88888
create table t88888(id int);
3、恢复db3库
4、注意
1、恢复时如果恢复到原有库会将表中数据覆盖,新增的表不会被删除
2、在恢复时如果恢复的库不存在,则先要创建空库
ER模型&ER图
1、定义:ER模型就是实体——关系模型,ER图就是实体-关系图
2、三个概念
1、实体
1、定义:现实世界中任何可以被认知、区分的实物
2、示例
1、学校:学生、教师、课程、班主任...
2、企业:职工、产品...
2、属性
1、定义:实体所具有的特性
2、示例
1、学生属性:学号、姓名、年龄、性别、专业...
2、产品属性:产品编号、产品名称、规格...
3、关系
1、定义:实体之间的关系
2、分类
1、一对一关系(1:1):班级和班长
2、一对多关系(1:n):公司和职工、班级和学生
3、多对多关系(m:n):学生和课程、商店和顾客
4、ER图的绘制
1、矩形框代表实体、菱形框代表关系、椭圆形代表属性。
2、示例:
学生选课系统
workbench(图形化界面操作数据库)
事务&事务回滚
1、事务定义:一件事从开始到结束的整个过程
2、属性
1、原子性:
一个事务是不可分割的工作单位,事务中各个操作要么都做,要么都不做
2、一致性:
事务必须从一个一致性状态到另一个一致性状态
3、隔离性:
一个事务的执行不能被其他并发事务干扰
4、持久性:
一个事物一旦提交,它对数据的改变是永久性的
3、事务及事务回滚的应用:
1、mysql中默认sql语句会自动commit到数据库
show variables like ‘autocommit’;
2、事务应用
1、开启事务:
mysql> start transaction;#此时autocommit被禁用,SQL语句不会对数据库中数据做修改
2、终止事务;
1、mysql> commit;
2、mysql> rollback;
3、注意:
事务和事务回滚只针对对表记录的操作:增加、删除、修改,对创建库、创建表、查询表记录是无效的
python数据库编程
1、python数据库接口(Python DB-API)
1、定义:为开发人员提供的数据库应用编程接口
2、python支持的数据库服务软件
MySQL、Oracle、SQL_Server、Sybase、Mogodb
3、Python提供的操作MySQL的模块
模块名:pymysql
4、pymysql的使用流程
1、先建立数据库连接
2、创建游标对象
3、使用游标对象的方法和SQL语句操作mysql数据库
4、提交commit
5、关闭游标
6、关闭数据库连接
import pymysql
#打开数据库连接
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2',charset='utf8')
#创建一个游标对象
cur = db.cursor()
#创建一个库
cur.execute('create database if not exists python;')
#切换库
cur.execute('use python;')
#创建一个表
cur.execute('create table if not exists t1(id int primary key,name varchar(20),score tinyint unsigned)default charset=utf8;')
#插入5条记录
cur.execute("insert into t1 values(1,'貂蝉',88),(2,'赵子龙',100),(3,'诸葛亮',80),(4,'张飞',60),(5,'司马懿',99);")
#提交
db.commit()
#关闭游标
cur.close()
#关闭数据库连接
db.close()
5、需要安装pymysql模块
1、安装pip3:sudo apt install python3-pip
2、安装pymysql:pip3 install pymysql
6、建立数据库连接:
1、语法格式:
对象名=pymysql.connect('主机名','用户名','密码','库名',port=3306,charset='utf8')
2、connect对象(db)的方法
1、cursor() 创建一个游标对象:db.cursor()
2、commit() 提交到数据库 db.commit()
3、rollback() 回滚 db.rollback()
4、close() 关闭与数据库的连接 db.close()
3、cursor游标对象(cur)的方法
1、execute() 执行sql命令
2、fetchone() 取得结果集的第一条记录
import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8') cur = db.cursor() sql_select = 'select * from t1;' cur.execute(sql_select) data = cur.fetchone() print('fetchone的结果为:',data) #fetchone的结果为: (1, '貂蝉', 88) db.commit()
cur.close()
db.close()
3、fetchmany(数字) 取得结果集的第几条记录
import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8') cur = db.cursor() sql_select = 'select * from t1;' cur.execute(sql_select) data = cur.fetchmany(3)
all_data = cur.fetchall() print('fetchmany的结果为:',data)#fetchmany的结果为: ((1, '貂蝉', 88), (2, '赵子龙', 100), (3, '诸葛亮', 80))
print('fetchall的结果为:',all_data)
db.commit()
cur.close()
db.close()
4、fetchall() 取得结果集的所有行
5、close() 关闭游标对象
属性:rowcount : 返回命令执行影响的条数
import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8') cur = db.cursor() sql_select = 'select * from t1;'
print('命令影响的条数:',cur.rowcount) cur.execute(sql_select)
all_data = cur.fetchall() print('fetchall的结果为:',all_data)#fetchall的结果为: ((1, '貂蝉', 88), (2, '赵子龙', 100), (3, '诸葛亮', 80), (4, '张飞', 60), (5, '司马懿', 99)) db.commit()
cur.close()
db.close()
#rollback.py
import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','db3',charset='utf8')
cur = db.cursor() try:
cur.execute("update CCB set money = 95000 where name='转钱';")
cur.execute("update ICBC set money = 7000 where name= '借钱';") db.commit()
print('ok') except Exception as e:
db.rollback()
print("出现错误已经回滚")
cur.close()
db.close()
from pymysql import * class MysqlPython: def __init__(self,host,user,password,db,port,charset='utf8'):
self.host = host
self.user = user
self.pwd = password
self.db = db
self.port = port
self.charset = charset def open(self):
'''创建与数据库的连接'''
self.conn = connect(self.host,self.user,self.pwd,self.db,self.port,charset=self.charset)
#创建游标
self.cur = self.conn.cursor() def close(self):
'''关闭游标、关闭与数据库的连接'''
self.cur.close()
self.conn.close() def myexecute(self,sql):
'''执行SQL命令'''
self.open()
try:
self.cur.execute(sql)
self.conn.commit()
print('操作成功')
except Exception as e:
self.conn.rollback()
print('出现错误,已经回滚:',e) def myFetchone(self,sql):
'''得到一条记录'''
try:
self.open()
self.cur.execute(sql)
data = self.cur.fetchone()
return data
except Exception as e:
print('出现错误:',e) def myFetchmany(self,sql,n):
'''得到多条记录'''
try:
self.open()
self.cur.execute(sql)
data = self.cur.fetchmany(n)
return data
except Exception as e:
print('出现错误:',e) def myFetchall(self,sql):
'''得到全部记录'''
try:
self.open()
self.cur.execute(sql)
data = self.cur.fetchall()
return data
except Exception as e:
print('出现错误:',e)
#test.py from MysqlPython import MysqlPython # name = input("请输入要修改成绩的学生姓名:")
# score = int(input("请输入新的成绩:")) # sql = "update t1 set score=%s where name='%s';"%(score,name)
# mp = MysqlPython('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',3306) # mp.myexecute(sql)
# mp.close() sql = "select * from t1"
mp = MysqlPython('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',3306)
data = mp.myFetchone(sql)
print(data)
mp.close() data = mp.myFetchmany(sql,3)
print(data) data = mp.myFetchall(sql)
print(data)
select user_id,count(*) from comment group by user_id order by count(*) desc limit 10;
思路:首先找到所有的用户,按用户分组,按评论的文章计数然后降序,取前10条记录
TCL(事务控制语言)
1.事务Transaction:要么一起成功,要么一起失败.
2.事务的开始
一个事务的结束,就是下一个事务的开始
3.事务的结束
DDL(数据定义语言)语句能够自动提交事务:create, drop, alter
DML(数据操纵语言)语句不会自动提交事务:insert, delete,update,select
4.commit:提交
5.rollback:回滚
python_MySQL数据库的更多相关文章
- python_MySQL 数据库操作
Python中的mysql操作可以使用MySQLdb模块来完成.它符合Python社区设计的Python Database API SpecificationV2.0标准,所以与其他的数据库操作的AP ...
- Python_MySQL数据库的写入与读取
[需求]1. 在数据库中创建表,且能按时间自动创建新表 2. 数据写入数据库 3. 从数据库读取数据 1. 创建表,并自动更新 def Creat_Table(InitMySQL,tabel_name ...
- JSP应用开发 -------- 电纸书(未完待续)
http://www.educity.cn/jiaocheng/j9415.html JSP程序员常用的技术 第1章 JSP及其相关技术导航 [本章专家知识导学] JSP是一种编程语言,也是一种动 ...
- django数据库设计
1 知识点 主要是分析设计数据库的数据表和数据表字段,然后使用Navicat Data Modeler创建模 将sqlite数据库修改成mysql数据库,同步数据 2 模型 2.1 数据表所有的数据列 ...
- Linux下使用Python操作MySQL数据库
安装mysql-python 1.下载mysql-python 打开终端: cd /usr/local sudo wget http://nchc.dl.sourceforge.net/sourcef ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- Java MyBatis 插入数据库返回主键
最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...
随机推荐
- CDQ分治学习笔记(三维偏序题解)
首先肯定是要膜拜CDQ大佬的. 题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai.b_ibi.c_ ...
- IoTClient开发4 - ModBusTcp协议服务端模拟
前言 上篇我们实现了ModBusTcp协议的客户端读写,可是在很多时候编写业务代码之前是没有现场环境的.总不能在客户现场去写代码,或是蒙着眼睛写然后求神拜佛不出错,又或是在办公室部署一套硬件环境.怎么 ...
- python 类内部装饰器的实现 与 参数解构学习
学习了函数的装饰器的写法,然后想到如果要在类中初始化或获取信息时能用装饰器做过滤和验证应该怎么写呢, 在网上查了下相关信息,感觉这样也是可以的,不知道会不会有什么问题class Ctj(): clas ...
- printf的实现原理
printf的声明 int _cdecl printf(const char* format, …); _cdecl是C和C++程序的缺省调用方式 _CDEDL调用约定: 1.参数从 ...
- python手册学习笔记1
笔记1 > http://www.pythondoc.com/pythontutorial3/controlflow.html 参数传递 Python中sys.argv的用法 调用解释器时,脚本 ...
- php 5.5使用 array_column的方法
<pre>php 5.5使用 array_column的方法</pre> <pre> public function array_column($input, $c ...
- Project Euler 60: Prime pair sets
素数3, 7, 109, 673很有意思,从中任取两个素数以任意顺序拼接起来形成的仍然是素数.例如,取出7和109,7109和1097都是素数.这四个素数的和是792,是具有这样性质的四个素数的最小的 ...
- 关于MXNet
关于人工智能,机器学习,深度学习 三者关系:从宏观到微观. 机器学习是人工智能的一部分,深度学习是机器学习的一部分. 基础:大数据. 关于深度学习 深度学习基于神经网络, 关于神经网络:通过叠加网络层 ...
- SpEL + AOP实现注解的动态赋值
一.自定义注解 先聊聊这个需求,我需要根据用户的权限对数据进行一些处理,但是痛点在哪里呢?用户的权限是在请求的时候知道的,我怎么把用户的权限传递给处理规则呢?想了以下几种方案: Mybatis 拦截器 ...
- Django 基本使用
Django 基本使用 Django 安装 pip install django Django 创建项目 django-admin startproject 项目名称 Django 创建应用 pyth ...