Python攻城师————MySQL数据库(自增、外键、关键字)
今日学习目标
- 正式学习MySQL数据库语句。
文章目录
- 今日学习目标
- 学习内容
- 一、自增特性
- 二、约束条件之外键
- 外键的定义
- 外键约束创建
- 三、查询关键字
- 查询关键字之select与from
- 查询关键字之where筛选
- 查询关键字之group by分组
学习内容
自增特性
约束条件之外键
查询关键字
一、自增特性
自增约束一般都是与主键约束一起使用。
这种方式是使用数据库提供的自增数值型字段作为自增主键,它的优点是:
(1)数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利;
(2)数字型,占用空间小,易排序,在程序中传递也方便;
(3)如果通过非系统增加记录时,可以不用指定该字段,不用担心主键重复问题。
因为是系统自增所以当我们人为打断顺序的话,系统是不会修改的
自增不会随着数据的删除而回退
二、约束条件之外键
外键的定义
如果同一个属性字段X 在表一中是主键,而在表二中不是主键,则字段X称为表二的外键。
创建外键约束,保证数据的完整性和一致性
注意:
- 与外键关联的主表的字段必须设置为主键。
- 要求从表不能是临时表,主从表的字段具备相同的数据类型、字符长度和约束。
外键关系
- 一对多
- 多对多
- 一对一
- 没有关系
外键约束创建
创建外键约束的条件
MySQL数据库外键的创建,需要满足以下四个条件,否则会被MySQL数据库拒绝:
1、创建外键的表和列存在
2、组成外键的列存在索引
3、必须指定数据表的引擎为InnoDB
4、外键字段和关联字段,数据类型必须一致在创建数据表时创建外键约束
在创建数据表时创建外键约束,只需要在创建数据表的create语句后面,使用foreign key关键字指定本表的外键字段,使用reference关键字指定关联表的关联字段,并且明确约束行为即可。
创建外键约束的SQL语句示例如下:create table student (id int primary key auto_increment,name varchar(20),department varchar(20) ,index (id) );create table grade (id int primary key auto_increment,Sid int,Cid int,score int,foreign key (Sid) references student(id) );
foreign key的约束效果
1.创建表的时候 应该先创建被关联表(没有外键字段的表)
2.插入数据的时候 应该先插入被关联表(没有外键字段的表)
外键字段填入的值只能是被关联表中已经存在的值
3.修改、删除被关联表数据都会出现障碍在创建数据表后添加外键约束
同样的,MySQL也支持在创建数据表后再添加外键约束。在上例中,我们先删除grade表,然后再创建grade表,现不创建外键,尝试在创建grade表后添加外键,相关SQL命令如下:create table grade(id int primary key auto_increment,Sid int,Cid int,score int ); alter table grade add index(Sid); alter table grade add foreign key (Sid) references student(id) on delete restrict on update cascade;
级联更新级联删除
概念:当对主键表中的数据进行删除和更新时,数据库会对关联的数据会自动删除和更新。
on update cascade # 级联更新 on delete cascade # 级联删除
语句主要放入设计了外键约束的表里,并且要和外键约束一起
create table student (id int primary key auto_increment,name varchar(20),department varchar(20) ,index (id) );create table grade (id int primary key auto_increment,Sid int,Cid int,score int,foreign key (Sid) references student(id)on update cascade on delete cascade );
多对多关系
以图书与作者表为例
- 先站在图书表的角度
问:一本书籍能否对应多名作者
答:可以 - 再站在作者表的角度
问:一名作者能否对应多本书籍
答:可以
结论:换位思考之后两边都可以 那么就是"多对多"关系
create table book(id int primary key auto_increment,title varchar(32),price float(10,2),author_id int,foreign key(author_id) references author(id) on update cascade on delete cascade ); create table author(id int primary key auto_increment,name varchar(32),gender enum('male','female','others'),book_id int,foreign key(book_id) references book(id) on update cascade on delete cascade );
分析
针对多对多关系 需要单独开设第三张表专门存储关系
create table book(id int primary key auto_increment,title varchar(32),price float(10,2) ); create table author(id int primary key auto_increment,name varchar(32),gender enum('male','female','others') ); create table book2author(id int primary key auto_increment,author_id int,book_id int,foreign key(author_id) references author(id) on update cascade on delete cascade, foreign key(book_id) references book(id) on update cascade on delete cascade );
针对多对多表关系
两张基表内的数据没有在第三张表内绑定关系的情况下随意新增修改删除
- 先站在图书表的角度
一对一关系
针对qq用户表 其实里面的数据可以分成两类
- 热数据:经常需要使用的数据
eg:qq号码 座右铭 个人简介 爱好 - 冷数据:不怎么经常需要使用的数据
eg:邮箱 电话 学校 …
为了节省资源并降低数据库压力 会将表一分为二- 用户表
存使用频率较高的数据字段 - 用户详情表
存使用频率较低的数据字段
- 用户表
1.先站在用户表的角度
问:一个用户数据能否对应多个用户详情数据
答:不可以2.再站在用户详情表的角度
问:一个用户详情数据能否对应多个用户数据
答:不可以结论:换位思考之后两边都不可以 那么关系可能有两种
‘没有关系’:用膝盖都能判断出来
‘一对一关系’
针对’一对一关系’外键字段建在任意一方都可以,但是推荐建在查询频率较高的较好的一方create table User(id int primary key auto_increment,name varchar(32),gender enum('male','female','others'),user_detail_id int unique, foreign key(user_detail_id) references UserDetail(id) on update cascade on delete cascade, ); create table UserDetail(id int primary key auto_increment,phone bigint,age int );
- 热数据:经常需要使用的数据
三、查询关键字
查询关键字之select与from
select用于指定查询的字段
from用于指定查询的表
select 字段名 from 表名;
查询关键字之where筛选
(1)、按条件表达式筛选条件运算符:> < = != <> >= <=(2)、按逻辑表达式筛选逻辑运算符: && || and or not(3)、模糊查询like between and in is null"""
查询条件如果不是很明确的情况下 我们统一称之为'模糊查询'
关键字 like:开启模糊查询的关键字
关键符号%:匹配任意个数的任意字符 _:匹配单个个数的任意字符
"""
用法举例:
select last_name, salary, commission_pct from employees where salary >= 10000 and salary <= 20000;#查询部门编号不是在90和110之间,或者工资高于15000的员工信息。select * from employees where not (department_id >= 90 and department_id <= 110) or salary > 15000;select * from employees where last_name like '%a%'; #%代表任意多个字符#查询员工名中第三个字符为e, 第五个字符为a的员工名和工资
select last_name, salary from employees where last_name like '__e_a%'; #“_”代表任意一个字符#查询员工名中第二个字符为_的员工名
select last_name from employees where last_name like '_/_%'; #“/”代表一个转义字符#between and 包含边界值
select * from employees where employee_id between 100 and 200;#查询员工编号为 IT_DPOG、AD_VP、 AD_PRES中的一个员工名和工种编号————or实现
select last_name,job_id from employees where job_id = 'IT_PROT' or job_id = 'AD_VP' or JOB_ID = 'AD_PRES';#查询员工编号为 IT_DPOG、AD_VP、 AD_PRES中的一个员工名和工种编号————in实现
select last_name,job_id from employees where job_id in ('IT_PROT', 'AD_VP', 'AD_PRES'); #注意此处不支持统配符,相当于“=”,只有like是支持通配符的。#查询没有奖金的员工名和奖金率
select last_name, commission_pct from employees where commission_pct = null; #这样不可以,因为“=”不能判断null值,只能用“is”,还有is not null,注意is只是与null搭配的!!!不能is not 后边跟字符串和数值#安全等与<=>可以同时替代=和is,也即是说它既可以判断null值也可以判断数值
select last_name, commission_pct from employees where commission_pct <=> nul
查询关键字之group by分组
关键字:group by 后面根列名,通常和聚合函数一起使用
- 聚合函数
max(列名) --------统计该列的最大值
min(列名) --------统计该列的最大值
avg(列名) --------统计该列的平均值
sum(列名) --------统计该列的和
count(列名) ------统计该列的行数,如果该列的值是null,不统计在内
count(*) ------统计所有的列,相当于统计行数,不会忽略null
例题:查询每门课的最高分
分两步:
1、按照课程编号分成5部分,即分成5组 ------》group by
2、找出每一个组的最高分 ------》max
SELECT MAX(grade),cid FROM score GROUP BY cid;
例如:
查询考试科目小于3门课的学生
1、使用外连接连接两个表:成绩表、学生表 ,以学生表为主表
2、按sid分组
3、统计行数
4、过滤出行数大于等于3的学生 ------》having
注: 分组以后再过滤,不能用where,要用having
SELECT COUNT(grade),s.sname FROM student s LEFT JOIN score sc ON s.sid = sc.sid GROUP BY s.sid HAVING COUNT(grade) < 3 ;
总结:
语法:select 1个或多个聚合函数,分组的列名 from 表名 group by 列名 having 统计函数 比较运算符 值;
where跟在表名from的后面,是根据列来进行查询数据的 having跟在group
by的后面,是针对分组之后的数据在进行过滤查询,即根据聚合函数来查询数据
Python攻城师————MySQL数据库(自增、外键、关键字)相关推荐
- Python攻城师的成长————MySQL数据库关键字
今日学习目标 熟悉关键字用法,掌握多表查询思路 文章目录 今日学习目标 学习内容 一.查询关键字 查询关键字之having过滤 查询关键字之distinct去重 查询关键字之order by排序 查询 ...
- Python攻城师的成长————ORM查询
今日学习目标 熟悉掌握ORM语法操作 文章目录 今日学习目标 学习内容 一.神奇的双下划线查询 二.orm创建外键关系 三.外键字段的增删改查 四.正反向的概念 五.ORM多表查询 正向查询 反向查询 ...
- mysql数据库的创建外键_Mysql表创建外键报错解决方案
数据库表A: CREATE TABLE task_desc_tab ( id INT(11) PRIMARY KEY NOT NULL COMMENT '自增主键' AUTO_INCREMENT, t ...
- MySQL数据库基础(外键约束、添加索引)
文章目录 一.外键约束 1.外键概念 2.关联约束 3.添加与删除外键 4.集联删除 二.MySQL索引 1.创建唯一索引(三种方法) 2.索引查询 3.全文索引 4.联合索引 5.删除索引 一.外键 ...
- mysql数据库如何添加外键约束_MySQL数据库之外键约束的简单理解
定义 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键.由此可见,外键表示了两个关系之间的相关联系.以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的 ...
- Python攻城师的成长————网络编程(socket套接字、通信循环、链接循环、黏包问题)
今日学习目标 学习什么是socket套接字,并依靠它去处理TCP协议等网络编程问题 文章目录 今日学习目标 学习内容 一. socket套接字 1.什么是socket 2.套接字发展史及分类 3.套接 ...
- Python攻城师的成长————模块突破(collections、time与datetime、random随机数模块)
今日学习目标: 学习并应用collections.time与datetime.random随机数模块知识 今日学习内容: collections模块 time与datetime模块 random随机数 ...
- Python攻城师的成长————Django框架(csrf相关装饰器、基于中间件思想编写项目、auth认证模块)
今日学习目标 逐步掌握csrf相关装饰器.基于中间件思想编写项目.auth认证模块知识点 文章目录 今日学习目标 学习内容 一. csrf相关装饰器 二.基于中间件思想编写项目 三.auth认证模块 ...
- Python攻城师的成长————面向对象的三大特征(继承、多态)
学习目标: 了解继承与多态的概念,重点是要学会运用继承去处理问题 学习内容: 继承 在面对对象程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类,而被继 ...
最新文章
- 绘制电路图风格的纠结
- Android下拉刷新SwipeRefreshLayout简单用法
- Windows Live Writer 配置报407 Proxy Authentication Required错误
- webpack --- [4.x]你能看懂的webpack项目初始化
- Duration(2020多校第二场D)
- C#基础(四)--值类型和引用类型,栈和堆的含义
- 生存在互联网公司是种怎样的体验?
- 零基础轻松学python pdf 小码哥_零基础轻松学Python
- Visual C# 2005 - 如何于DataGridView控件中以跨数据行方式显示数据
- vscode 5500 but failed to open in Browser Preview. Got Browser Preview extension installed?
- 查找你的幸运守护精灵
- cad常青藤插件_做CAD设计,别说你不知道,这些插件有多好用
- 修复漏洞显示连接服务器失败,服务器安全狗漏洞补丁失败怎么办
- url 与 domain
- 002_Python基础学习网站
- 学习笔记三:衍生兄弟——过冲和振铃
- python qq群文件_python 获取qq群成员列表数据
- python交易是什么意思_Py交易是什么意思?Py交易是什么梗?
- Kafka基于Zookeeper搭建高可用集群实战
- linux系统漏洞补丁包,RedHat 5.X、6.X Bash漏洞RPM补丁包下载