目录
一.数据库介绍
数据库介绍
数据库存储数据特点
数据库的分类
二.MySql介绍与安装
MySql介绍
MySql由来
MySql介绍
MySql安装
MySql直接安装
PhPStudy安装
图形界面管理工具
三.语法基础
SQL
SQL介绍
SQL语句主要分为
数据完整性
数据类型
常用数据类型
数值类型
字符串类型
枚举类型
日期类型
约束
四.SQL语句
*** 作数据库(DDL)
连接数据库
退出数据库
查看已经创建的数据库
查看数据库版本
创建数据库
查看当前使用的数据库
使用切换数据库
删除数据库
*** 作数据表
查看当前数据库中所有表
创建表
查看表的创建语句
查看表描述信息
添加表字段
修改表字段
删除表字段
删除表
*** 作数据
新增数据
修改数据
删除数据
查询数据
where子句
比较运算符
逻辑运算符
模糊查询
范围查询
空判断
常用聚合函数
分组与分组之后的筛选
分组
group_concat(...)
分组后的筛选 having
排序
限制
表连接
内连接
左连接
右连接
子查询
自关联
外键
外键介绍
配置外键设置
创建表时设置外键约束
在修改表时添加外键约束
删除外键约束
五.Mysql与Python交互
准备数据
分表
商品分类表
安装pymysql
Python *** 作Mysql步骤
Connection对象
对象的方法
Cursor对象
对象的方法
使用python连接数据库
一.数据库介绍 数据库介绍 数据库(database)简称DB,实际上就是⼀个⽂件集合,是⼀个存储数据的仓库,本质就是⼀个⽂ 件系统,数据库是按照特定的格式把数据存储起来,⽤户可以对存储的数据进行增删改查等 *** 作。 数据库存储数据特点 ● 持久化存储 ● 读写速度极⾼ ● 保证数据的有效性 ● 对程序⽀持⾮常好,容易扩展 数据库的分类 ● 关系型数据库:可以保存现实⽣活中的各种关系数据,数据库中存储数据以表为单位;主流 关系型数据库:MySQL,Oracle,SQLServer等 ● ⾮关系型数据库:通常⽤来解决某些特定的需求,⽐如⾼并发访问。主流⾮关系型数据库: Redis,Mongodb,memacache等 二.MySql介绍与安装 MySql介绍 MySql由来 MySql介绍 MySQL是⼀种开放源代码的关系型数据库管理系统(RDBMS),使⽤最常⽤的数据库管理语⾔ ——结构化查询语⾔(SQL)进⾏数据库管理。MySQL因为其速度、可靠性和适应性⽽备受关 注。⼤多数⼈都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。 MySql安装
网盘链接:https://pan.baidu.com/s/1Ao475w7lXNL5SSiyK0VeZg
提取码:zpaa
MySql直接安装下载地址:http://www.mysql.com/downloads
1.
2.
3.下载之后可参考 MySQL 5.7 版本的安装及简单使用(图文教程)_Mysql_脚本之家 (jb51.net)https://www.jb51.net/article/99626.htm
PhPStudy安装PhPStudy非常适合用来搭建网站,是一个集成开发环境。(可以使用轻量级MySql)
● 注意:安装后,需要启动MySQL服务,才能连接到数据库。
如果使用的是PhPStudy使用MySql,如果想在命令行启动MySql需要将:F:\phpstudy_pro\Extensions\MySQL5.7.26\bin添加到环境变量(这里是我的地址)
图形界面管理工具常用工具:
SQLyog介绍
SQLyog 是⼀个快速⽽简洁的图形化管理MYSQL数据库的⼯具,它能够在任何地点有效地管理数 据库,由业界著名的Webyog公司出品。也是⼀个开源软件。 开源软件(open source software),简称为OSS,公开源代码的软件。因此开源软件具备可以 免费使⽤和公布源代码的特征。 注意:SQLyog只是⼀个连接数据库的⼯具,并不是数据库 SQLyog使用 ● 使⽤SQLyog连接MySQL● SQLyog界⾯
● 创建数据库 ○ 第⼀步○ 第二步
● 创建表 ○ 第⼀步
○ 第⼆步
● 为表添加数据
三.语法基础 SQL SQL介绍 SQL是结构化查询语⾔,是⼀种⽤来 *** 作RDBMS(关系型数据库管理系统)的数据库语⾔,当前关 系型数据库都⽀持使⽤SQL语⾔进⾏ *** 作,也就是说可以通过SQL *** 作oracle,sql server,mysql 等关系型数据库。 SQL语句主要分为 ● DDL语句 : 数据定义语⾔,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。 ● DML语句:数据 *** 纵语句,⽤于添加、删除、更新、和查询数据库记录,并检查数据完整性 ● DCL语句:数据控制语句,⽤于控制不同数据段直接许可和访问级别的语句。 数据完整性 在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加⼀些强 制性的验证,包括数据字段的类型、约束。 数据类型 常用数据类型 ● 数值类型 ● ⽇期时间类型 ● 字符串类型 数值类型 字符串类型 枚举类型 枚举类型英⽂为ENUM,对 1 ~ 255 个成员的枚举需要 1 个字节存储;对于 255 ~ 65535 个成员,需要 2 个字节存储。最多允许 65535 个成员。创建⽅式:enum("M","F"); 日期类型 注意: (1)decimal表示定点⼩数,如decimal( 5 , 2 )表示共存 5 位数,⼩数占 2 位。不写则默认为 decimal( 10 , 0 ); (2)char表示固定⻓度的字符串,如char( 3 ),如果填充'ab'时会补⼀个空格为'ab '; (3)varchar表示可变⻓度的字符串,如varchar( 3 ),填充'ab'时就会存储'ab'; (4)对于图⽚、⾳频、视频等⽂件,不存储在数据库中,⽽是上传到某个服务器上,然后在表中 存储这个⽂件的保存路径; (5)枚举类型不区分大小写; 约束 (1)主键约束(primary key):它能够唯一确定表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得字段不重复且不为空; (2)自增约束(auto_increment) (3)唯一约束(unique):此字段的值不允许重复; (4)非空约束(not null):此字段不允许填写空值; (5)默认约束(default):当不填写此值时会使用默认值,如果填写时以填写为准; (6)外键约束(foreign key):对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败抛出异常。 四.SQL语句 *** 作数据库(DDL) 连接数据库mysql -u 用户名 -p
enter password:密码
退出数据库exit;
quit;
注意:(1)mysql不严格区分大小写;
(2)分号作为结束符,必须写;
查看已经创建的数据库show databases;
查看数据库版本select version();
创建数据库create database 数据库名;
create database 数据库名 charset=utf8;
注意:charset:指定编码为utf8
查看当前使用的数据库select database();
使用切换数据库use 数据库名;
删除数据库drop database 数据库名;
*** 作数据表 查看当前数据库中所有表show tables;
创建表create table 数据库名(字段 类型 约束[,字段 类型 约束])
查看表的创建语句show create table 数据表名;
查看表描述信息desc 数据表名;
添加表字段alter table 数据表名 add 字段 类型及约束;
修改表字段alter table 数据表名 modify 字段 类型及约束; ——不重命名
alter table 数据表名 change 原字段名 新字段名 类型及约束; ——将字段重命名
删除表字段alter table 数据表名 drop 字段;
删除表drop table 表名;
回顾练习:
-- 显示数据库
SHOW DATABASES;
-- 查看数据库的版本号,选中,按F9运行
SELECT VERSION();
-- 查看当前的时间
SELECT NOW();
-- 创建数据库,如果有用到特殊符号,tab上~,切换成英文输入法
CREATE DATABASE `mytest-01`;
-- 指定编码
CREATE DATABASE `mytest-02` CHARSET='utf8';
-- 查看创建的数据库
SHOW CREATE DATABASE `mytest-01`;
-- 想在mytest-01这个库中创建一张表
-- 查看当前的数据库
SELECT DATABASE();
-- 使用mytest-01
USE `mytest-01`;
-- 删除mytest-02
DROP DATABASE `mytest-02`;
-- 判断数据库是否存在,不存在才创建
CREATE DATABASE IF NOT EXISTS `mytest-01`;
-- 查看表,显示当前数据库的表
SHOW TABLES;
-- 创建表
CREATE TABLE mytable1 (id INT,NAME VARCHAR(20));
-- 添加相关的约束 PRIMARY KEY_主键,NOT NULL_不为空,AUTO_INCREMENT_自增
CREATE TABLE mytable2 (id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,NAME VARCHAR(20));
-- 查看表结构
DESC mytable2;
-- 创建表
CREATE TABLE students(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age TINYINT UNSIGNED DEFAULT 18,
high DECIMAL(5,2),
gender ENUM('男','女','保密') DEFAULT '保密',
cls_id INT
);
-- 课堂表
CREATE TABLE classes(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
-- 添加一个字段,birthday
ALTER TABLE students ADD birthday DATE;
-- 添加默认值,不修改字段
ALTER TABLE students MODIFY birthday DATE DEFAULT '2002-01-01';
-- 修改字段名
ALTER TABLE students CHANGE birthday birth DATE DEFAULT '2002-01-01';
-- 删除high字段
ALTER TABLE students DROP high;
*** 作数据
新增数据
整行插入
insert into 数据表名 values(值1,值2,值3...)
指定列中插入数据
insert into 数据表名(字段1,字段2...) values(值1,值2...)
修改数据update 数据表名 set 字段1=新值,字段2=新值 where 条件
删除数据delete from 数据表名 where 条件
查询数据查询整个表的数据
select * from 数据表名
查询指定字段数据
select 字段1 字段2 from 数据表名
查询指定字段,并给字段起别名
select 字段1 as 别名,字段2 as 别名 from 数据表名
查询指定字段并去重
select distinct 字段1 from 数据表名
where子句where字句通常结合增删改查使用,用于做筛选的条件。
比如,查询当id = 1的数据
select * from student where id=1
不仅如此,经常结合运算符使用
比较运算符 逻辑运算符 模糊查询like关键字用来进行模糊查询,并且结合%以及_使用。
(1)% 表示任意多个字符;
(2)_ 表示一个任意字符;
范围查询 空判断 常用聚合函数(1)count(*) 总数;
(2)max() 最大值;
(3)min() 最小值;
(4)sum() 求和;
(5)avg() 平均值;
练习:
-- 求students总人数
SELECT COUNT(*) FROM students;
-- 求男性的人数
SELECT COUNT(*) FROM students WHERE gender='男';
-- 求最大年龄
SELECT MAX(age) FROM students;
-- 女性的最大id
SELECT MAX(id) FROM students WHERE gender=2;
SELECT MAX(age) AS '最大年龄' FROM students;
-- 查询为删除的学生的最小编号
SELECT MIN(id) FROM students WHERE is_del=0;
-- 男生的年龄和
SELECT SUM(age) FROM students WHERE gender=1;
-- 查询未删除女生的年龄的平均值
SELECT AVG(age) FROM students WHERE is_del=0 AND gender=2;
-- 计算男性的平均年龄,保留2位小数,round(数据,保留几位小数)
SELECT ROUND(AVG(age), 2) FROM students WHERE is_del=0 AND gender=1;
回顾练习:
-- 添加数据
INSERT INTO students VALUES('qianan', 18);
-- 整行添加
INSERT INTO students VALUES(1,'qianan', 18, '男', 1, '2003-01-01');
-- 指定字段添加
INSERT INTO students (NAME, cls_id) VALUES('ljl',1);
-- 一定用小括号包裹起来
INSERT INTO students (NAME) VALUES('linqiang');
-- 添加性别
INSERT INTO students (NAME,gender) VALUES('fanmiao', '女')
-- 枚举可以通过索引取,从1开始
INSERT INTO students (NAME,gender) VALUES('fanmiao', 1);
-- 添加多条数据
INSERT INTO students (NAME,gender) VALUES('yjw', 1),('wjb', 2),('zxs', 1);
-- 修改数据
-- 将姓名全部改为jack
UPDATE students SET NAME='jack';
-- 将性别为女改为rose
UPDATE students SET NAME='rose' WHERE gender='女';
-- 将id为3的年龄修改为22,并且性别改为男
UPDATE students SET age=22,gender='男' WHERE id=3;
-- 删除数据
-- id为8的删除_物理删除
DELETE FROM students WHERE id=8;
-- 逻辑删除 is_del 0未删除 1已删除
ALTER TABLE students ADD is_del INT DEFAULT 0;
-- id 为6删除掉,修改is_del=1
UPDATE students SET is_del=1 WHERE id=6
-- 查询
-- 查询整个表数据
SELECT * FROM students;
-- 姓名,性别数据
SELECT NAME,gender FROM students;
SELECT NAME AS '姓名',gender AS '性别' FROM students;
-- s相当于strduents
SELECT s.gender FROM students AS s;
-- 对name字段值进行去重
SELECT DISTINCT NAME FROM students;
-- 多个字段时,一行一行去比较,去重
SELECT DISTINCT NAME,age FROM students;
-- 条件查询
-- id>3的数据
SELECT * FROM students WHERE id>3;
-- 年龄大于18的信息
SELECT * FROM students WHERE age>18;
-- 姓名不是qianan的数据
SELECT * FROM students WHERE NAME!='qianan';
-- 18-22之间的年龄
SELECT * FROM students WHERE age>=18 AND age <22
-- id>3的女同学
SELECT * FROM students WHERE id>3 AND gender='女';
-- id<2 id>4
SELECT * FROM students WHERE id<2 OR id>4;
-- 查询年龄不是18的女同学
SELECT * FROM students WHERE NOT age=18 AND gender='女';
-- 模糊查询
-- 查询名字以r开头的学生信息
SELECT * FROM students WHERE NAME LIKE 'r%';
-- 查询名字含有a
SELECT * FROM students WHERE NAME LIKE '%a%';
-- 查询名字仅有2个字符
SELECT * FROM students WHERE NAME LIKE '__';
-- 名字至少含有2个字符
SELECT * FROM students WHERE NAME LIKE '__%';
-- id为1或者4或者6的学生信息
SELECT * FROM students WHERE id IN (1, 4, 6);
-- 年龄不是18或者20
SELECT * FROM students WHERE NOT age IN (18, 20);
-- id2-4
SELECT * FROM students WHERE id BETWEEN 2 AND 4;
-- 查询id是3-5的男同学信息
SELECT * FROM students WHERE id (BETWEEN 3 AND 5) AND gender=1;
-- 判断cls_id数据不为空的显示
SELECT * FROM students WHERE cls_id IS NOT NULL;
-- 求students总人数
SELECT COUNT(*) FROM students;
-- 求男性的人数
SELECT COUNT(*) FROM students WHERE gender='男';
-- 求最大年龄
SELECT MAX(age) FROM students;
-- 女性的最大id
SELECT MAX(id) FROM students WHERE gender=2;
SELECT MAX(age) AS '最大年龄' FROM students;
-- 查询为删除的学生的最小编号
SELECT MIN(id) FROM students WHERE is_del=0;
-- 男生的年龄和
SELECT SUM(age) FROM students WHERE gender=1;
-- 查询未删除女生的年龄的平均值
SELECT AVG(age) FROM students WHERE is_del=0 AND gender=2;
-- 计算男性的平均年龄,保留2位小数,round(数据,保留几位小数)
SELECT ROUND(AVG(age), 2) FROM students WHERE is_del=0 AND gender=1;
分组与分组之后的筛选
分组
在数据库里,group_by 将查询结果按照1个或多个字段进行分组,字段值相同的为一组。
select 显示的字段或内容 from 表名 group_by 需要分组的字段
group_concat(...)我们通过 group_concat(...) 查看每组的详细信息;
分组后的筛选 having
排序
order by 字段 默认升序
order by 字段 asc 指定升序
order by 字段 desc 指定降序
限制limit start,count
(1)start为偏移量,默认为0;
(2)count为条数;
注意:
(1)limit不能写数学公式;
(2)limit只能写在末尾;
表连接当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,在选择合适的列返回mysql。这时我们就需要使用表连接。
分类:内连接,外连接,左连接,右连接;
内连接内连接仅选出两张表中互相匹配的记录
select * from 表1 inner join 表2 on 表1.列 = 表2.列;
左连接
查询的结果为两个表匹配到的数据,左表持有的数据,对于右表中不存在的数据使用null填充;
select * from 表1 left join 表2 on 表1.列 = 表2.列;
右连接查询的结果为两个表匹配到的数据,右表持有的数据,对于左表中不存在的数据使用null填充;
select * from 表1 right join 表2 on 表1.列 = 表2.列;
子查询某些情况下,当进行查询的时候,需要的条件是另外一个select语句时,这个时候,就要用到子查询。
例如:
-- 查询最高的男生信息
SELECT * FROM students WHERE hight=1.89;
-- 并不确定最高身高
SELECT MAX(hight) FROM students WHERE gender=1;
-- 显示最高身高对应的姓名,name跟hight没有关联
SELECT NAME,MAX(hight) FROM students WHERE gender=1;
-- 首先拿到最高身高,子查询
SELECT NAME,hight FROM students WHERE hight=(SELECT MAX(hight) FROM students WHERE gender=1);
-- 查询高于平均身高的学生信息,首先计算平均身高
SELECT AVG(hight) FROM students;
SELECT * FROM students WHERE hight>(SELECT AVG(hight) FROM students);
-- 最大年龄的女性id
SELECT * FROM students WHERE gender=2 AND age=(SELECT MAX(age) FROM students WHERE gender=2);
自关联
可以简单的理解为自己与自己进行连接查询。
比如:
一张areas表里面有省,市,区,我们需要通过这一张表查询某省对应的所有城市。
SELECT * FROM areas AS p INNER JOIN areas AS c ON p.`id`=c.`pid` HAVING
p.name="湖南";
练习代码:
-- 计算男生与女生,保密的人数
SELECT COUNT(*) FROM students GROUP BY gender;
-- 将对应姓名显示出来
SELECT gender, NAME, COUNT(*) FROM students GROUP BY gender; -- name字段信息不能完全显示
-- group_concat:显示每组详细信息
SELECT gender, GROUP_CONCAT(NAME), COUNT(*) FROM students GROUP BY gender;
-- 分组后,查看总人数
SELECT gender,COUNT(*) FROM students GROUP BY gender WITH ROLLUP;
-- ifnull,如果第一个参数的表达式为null,返回第二个参数的备用值
SELECT IFNULL(gender, '总计') AS '性别',COUNT(*) FROM students GROUP BY gender WITH ROLLUP;
-- 查询男生女生 条件:总数大于2
SELECT gender, COUNT(*) FROM students GROUP BY gender HAVING COUNT(*)>2;
SELECT gender, COUNT(*), GROUP_CONCAT(NAME) FROM students GROUP BY gender HAVING COUNT(*)>2;
-- 查询男生女生平均年龄超过18岁的性别,以及姓名
SELECT gender,AVG(age),GROUP_CONCAT(NAME) FROM students GROUP BY gender HAVING AVG(age)>18 AND (gender=1 OR gender=2);
-- 查询年龄在18到26之间的男同学,按照年龄从小到大排序 ,默认是升序
SELECT * FROM students WHERE gender=1 AND (age BETWEEN 18 AND 26) ORDER BY age;
-- 查询年龄在18到20岁之间的女同学,id从高到低排序
SELECT * FROM students WHERE gender=2 AND (age BETWEEN 18 AND 20) ORDER BY id DESC;
-- 查询年龄在18-23岁之间的女性,年龄从高到低降序,当年龄相同时,按照身高从低到高升序。
SELECT gender,NAME,hight,age FROM students WHERE (age BETWEEN 18 AND 23) AND gender=2 ORDER BY age DESC,hight ASC;
-- 分页显示
SELECT * FROM students LIMIT 2;
-- 显示id2为3,4,5 2,4
SELECT * FROM students LIMIT 2,3;
-- 每页显示三条数据,一页多少条记录*(当前第几页-1),不支持公式计算,只能写在后面
SELECT * FROM students LIMIT 0,3;
SELECT * FROM students LIMIT 3,3;
SELECT * FROM students LIMIT 3*(3-1),3;
--
SELECT * FROM students INNER JOIN classes;
-- 当s.cls_id = c.id相等时才显示
SELECT * FROM students s INNER JOIN classes c ON s.cls_id = c.id;
-- 显示学生的所有信息,但只显示班级名称
SELECT s.*,c.`NAME` FROM students s INNER JOIN classes c ON s.cls_id = c.id;
-- 查询 有能够对应班级的学生以及班级信息,按照班级进行排序
SELECT * FROM students s INNER JOIN classes c ON s.cls_id = c.id ORDER BY s.`cls_id`;
-- 当同一个班级时,按照学生的id进行从大到小排序
SELECT * FROM students s INNER JOIN classes c ON s.cls_id = c.id ORDER BY s.`cls_id`, s.`id` DESC;
-- 左连接——以左表为主,右表填充为null
SELECT * FROM students s LEFT JOIN classes c ON s.cls_id = c.id;
-- students表左连接classes表 并查看班级为null的数据
SELECT * FROM students s LEFT JOIN classes c ON s.cls_id = c.id WHERE c.`id` IS NULL;
-- 左连接 并且 查询 s.is_del=1 并且 s.name="qianan" 的数据
SELECT * FROM students s LEFT JOIN classes c ON s.cls_id = c.id WHERE s.`is_del`=1 AND s.`NAME`='qianan';
-- 查询最高的男生信息
SELECT * FROM students WHERE hight=1.89;
-- 并不确定最高身高
SELECT MAX(hight) FROM students WHERE gender=1;
-- 显示最高身高对应的姓名,name跟hight没有关联
SELECT NAME,MAX(hight) FROM students WHERE gender=1;
-- 首先拿到最高身高,子查询
SELECT NAME,hight FROM students WHERE hight=(SELECT MAX(hight) FROM students WHERE gender=1);
-- 查询高于平均身高的学生信息,首先计算平均身高
SELECT AVG(hight) FROM students;
SELECT * FROM students WHERE hight>(SELECT AVG(hight) FROM students);
-- 最大年龄的女性id
SELECT * FROM students WHERE gender=2 AND age=(SELECT MAX(age) FROM students);
SELECT * FROM students WHERE age=(SELECT MAX(age) FROM students WHERE gender=2);
`areas``cities`
USE `python-03`;
-- 查询湖南省所有的市
-- 查询湖南省对应的provinceid
SELECT * FROM provinces WHERE province='湖南省';
-- 通过provinceid 在cities表对应的市
SELECT * FROM cities WHERE provinceid=430000;
-- 一个语句查询湖南省所有市
SELECT * FROM cities WHERE provinceid=(SELECT provinceid FROM provinces WHERE province='湖南省');
-- 内连接
SELECT * FROM provinces p INNER JOIN cities c ON p.`provinceid` = c.`provinceid` WHERE p.`province`='湖南省';
-- 自关联
-- 查询湖南省下的所有市
-- 1. 湖南省的id
SELECT * FROM areas WHERE NAME='湖南';
-- 再查询pid为湖南省的id数据
SELECT * FROM areas WHERE pid=(SELECT id FROM areas WHERE NAME='湖南');
-- 长沙市下面的区
SELECT * FROM areas WHERE pid=(SELECT id FROM areas WHERE NAME='长沙');
-- 连接查询实现
SELECT * FROM areas p INNER JOIN areas c ON p.`id`=c.`pid` WHERE p.`name`='湖南';
-- 长沙市下面的区
SELECT * FROM areas p INNER JOIN areas c ON p.`id`=c.`pid` WHERE p.`name`='长沙';
外键
外键介绍
Mysql的外键约束(foreign key)是表的一个特殊字段。对于两个具有关联关系的表而言,相关联字段中的主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
注意:主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
配置外键设置-- 默认引擎MyISAM,不支持外键,更改引擎,改成InnoDB
-- 1.找到mysql安装路径,打开my.ini,default-storage-engine=InnoDB
-- 2.停止phpstudy服务,找到mysql安装路径下的data文件,删除ib_logfile0/1
-- 3.重启服务
SHOW ENGINES;
创建表时设置外键约束
语法:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…] REFERENCES <主表名> 主 键列1 [,主键列2,…]
实现:
班级表:
学生表:
-- 创建班级表
CREATE TABLE classes(
id INT(4) NOT NULL PRIMARY KEY,
NAME VARCHAR(36)
);
-- 创建学⽣表
CREATE TABLE student(
sid INT(4) NOT NULL PRIMARY KEY,
sname VARCHAR(30),
cid INT(4) NOT NULL,
CONSTRAINT cs_id FOREIGN KEY(cid) REFERENCES classes(id)
);
在创建student表时将其cid设置为外键。
在修改表时添加外键约束alter table 表名 add constraint 外键名字 foreign key(外键字段名) references
外表表名(主键字段名);
例:
-- 创建班级表
CREATE TABLE classes(
id INT(4) NOT NULL PRIMARY KEY,
NAME VARCHAR(36)
);
-- 创建学⽣表
CREATE TABLE student(
sid INT(4) NOT NULL PRIMARY KEY,
sname VARCHAR(30),
cid INT(4) NOT NULL
);
ALTER TABLE student ADD CONSTRAINT cs_id FOREIGN KEY(cid) REFERENCES classes(id);
删除外键约束
ALTER TABLE student DROP FOREIGN KEY fk_cid;
五.Mysql与Python交互
准备数据
(1)创建数据表
-- 创建⼀个商品 goods 数据表
CREATE TABLE goods(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
NAME VARCHAR(150) NOT NULL,
cate_name VARCHAR(40) NOT NULL,
brand_name VARCHAR(40) NOT NULL,
price DECIMAL(10,3) NOT NULL DEFAULT 0,
is_show TINYINT NOT NULL DEFAULT 1,
is_saleoff TINYINT NOT NULL DEFAULT 0
);
(2)插入数据
-- 插⼊数据
INSERT INTO goods VALUES(0,'r510vc 15.6英⼨笔记本','笔记本','华 硕','3399',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'y400n 14.0英⼨笔记本电脑','笔记本','联 想','4999',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'g150th 15.6英⼨游戏本','游戏本','雷 神','8499',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'x550cc 15.6英⼨笔记本','笔记本','华 硕','2799',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'x240 超极本','超级本','联 想','4880',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'u330p 13.3英⼨超极本','超级本','联 想','4299',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'svp13226scb 触控超极本','超级本','索 尼','7999',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'ipad mini 7.9英⼨平板电脑','平板电脑','苹 果','1998',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'ipad air 9.7英⼨平板电脑','平板电脑','苹 果','3388',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'ipad mini 配备 retina 显示屏','平板电脑','苹 果','2788',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'ideacentre c340 20英⼨⼀体电脑 ','台式机','联 想','3499',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'vostro 3800-r1206 台式电脑','台式机','戴 尔','2899',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'imac me086ch/a 21.5英⼨⼀体电脑','台式机','苹 果','9188',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'at7-7414lp 台式电脑 linux )','台式机','宏 碁','3699',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'z220sff f4f06pa⼯作站','服务器/⼯作站','惠 普','4288',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'poweredge ii服务器','服务器/⼯作站','戴 尔','5388',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'mac pro专业级台式电脑','服务器/⼯作站','苹 果','28888',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'hmz-t3w 头戴显示设备','笔记本配件','索 尼','6999',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'商务双肩背包','笔记本配件','索 尼','99',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'x3250 m4机架式服务器','服务器/⼯作 站','ibm','6888',DEFAULT,DEFAULT);
INSERT INTO goods VALUES(0,'商务双肩背包','笔记本配件','索 尼','99',DEFAULT,DEFAULT);
分表
分表是因为当一张表的数据量比较多时,但是我们只需要查询其中的某个字段数据,就会导致查询效率低,所以我们此处使用到分表。
商品分类表创建商品分类表
create table goods_cates(
id int unsigned primary key auto_increment not null,
name varchar(40) not null
);
将商品表中的商品种类查询并入到商品分类中
insert into goods_cates (name) select cate_name from goods group by
cate_name;
将商品表中的商品种类更改为商品表分类表对应的id
update goods as g inner join goods_cates as c on g.cate_name=c.name set
g.cate_name=c.id;
安装pymysql
在Windows *** 作系统上安装
Python
3
:
pip install pymysql
Python
2
:
pip install MySQLdb
Ubuntu安装:
https://www.jianshu.com/p/d
84
cdb
5
e
6273
Python *** 作Mysql步骤
Connection对象
用于建立与数据库连接
创建对象:调用 connect()方法
conn=connect(参数列表)
"""
参数host:连接的mysql主机,如果本机是'localhost'
参数port:连接的mysql主机的端⼝,默认是3306
参数database:数据库的名称 参数user:连接的⽤户名 参数password:连接的密码 参数charset:通信采⽤的编码⽅式,推荐使⽤utf8
"""
import pymysql
con = pymysql.connect(host = 'localhost',port=3306,database='python-
01',user='root',password = 'root',charset = 'utf8')
from pymysql import *
conn = connect(host = 'localhost',port=3306,database='python-
01',user='root',password = 'root',charset = 'utf8')
对象的方法
(1)close()关闭连接;
(2)commit()提交;
(4)cursor()返回Cursor对象,用来执行sql语句并获取结果;
Cursor对象(1)用来执行sql语句,使用频度最高的语句为select,insert,update,delete;
(2)获取Cursor对象:调用Connection对象的cursor方法;
cs1=conn.cursor()
对象的方法
close()关闭 先关闭游标,在关闭链接
execute(operation [, parameters ])执⾏语句,返回受影响的⾏数,主要⽤于执⾏insert、
update、delete语句,也可以执⾏create、alter、drop等语句
fetchone()执⾏查询语句时,获取查询结果集的第⼀个⾏数据,返回⼀个元组
fetchmany()可以选择获取几个;
fetchall()执⾏查询时,获取结果集的所有⾏,⼀⾏构成⼀个元组,再将这些元组装⼊⼀个元
组返回
使用python连接数据库
from pymysql import *
try:
conn = connect(
host = "localhost",
port = 3306,
user = "root",
passwd = "root",
db = 'logic_web',
charset = 'utf8'
)
cursor = conn.cursor()
cursor.execute('select * from users_banner')
result = cursor.fetchone()
cursor.close()
conn.close()
except Exception as e:
print("Error %d:%s"%(e.args[0],e.args[1]))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)