目录
一.数据库介绍
数据库介绍
数据库存储数据特点
数据库的分类
二.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介绍?
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]))
|