MySql数据库

MySql数据库,第1张

目录

一.数据库介绍

数据库介绍

数据库存储数据特点

数据库的分类

二.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]))

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/716922.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存