MySQL之唯一索引、外键的变种、SQL语句数据行操作补充
0、唯一索引
unique对num进行唯一限制,表示num是独一无二的,uql是唯一索引名称
上面为联合索引:num和xx不能完全一样
1、外键的变种
a. 用户表和部门表
用户:
1 alex 1
2 root 1
3 egon 2
4 laoyao 3
部门:
1 服务
2 保安
3 公关
===》 一对多
b. 用户表和博客表
用户表:
1 alex
2 root
3 egon
4 laoyao
博客表:
FK() + 唯一
1 /yuanchenqi/ 4
2 /alex3714/ 1
3 /asdfasdf/ 3
4 /ffffffff/ 2
===> 一对一
程序代码:
create table userinfo1(
id int auto_increment primary key,
name char(10),
gender char(10),
email varchar(64)
)engine=innodb default charset=utf8;
create table admin(
id int not null auto_increment primary key,
username varchar(64) not null,
password VARCHAR(64) not null,
user_id int not null,
unique uq_u1 (user_id),
CONSTRAINT fk_admin_u1 FOREIGN key (user_id) REFERENCES userinfo1(id)
)engine=innodb default charset=utf8;
c.多对多
create table userinfo2(
id int auto_increment primary key,
name char(10),
gender char(10),
email varchar(64)
)engine=innodb default charset=utf8; create table host(
id int auto_increment primary key,
hostname char(64)
)engine=innodb default charset=utf8; create table user2host(
id int auto_increment primary key,
userid int not null,
hostid int not null,
unique uq_user_host (userid,hostid),
CONSTRAINT fk_u2h_user FOREIGN key (userid) REFERENCES userinfo2(id),
CONSTRAINT fk_u2h_host FOREIGN key (hostid) REFERENCES host(id)
)engine=innodb default charset=utf8;
3、SQL语句数据行操作补充
3.1 增
insert into tb11(name,age) values('alex',12); #往tb11中插入一条数据
insert into tb11(name,age) values('alex',12),('root',18); #往tb11中插入多条数据
insert into tb12(name,age) select name,age from tb11; #把tb11中的数据复制到tb12中![]()
3.2 删
delete from tb12;
delete from tb12 where id !=2
delete from tb12 where id =2
delete from tb12 where id > 2
delete from tb12 where id >=2
delete from tb12 where id >=2 or name='alex'
3.3 改
update tb12 set name='alex' where id>12 and name='xx'
update tb12 set name='alex',age=19 where id>12 and name='xx'
3.4 查
select * from tb12;
select id,name from tb12;
select id,name from tb12 where id > 10 or name ='xxx';
select name as cname,age from tb12; #查数据,并把表头的name改为cname
select id,name as cname from tb12 where id > 10 or name ='xxx';
select name,age,11 from tb12; #多出一列,数据全部为11
其他:
select * from tb12 where id != 1
select * from tb12 where id in (1,5,12); #取id为1、5、12的数据
select * from tb12 where id not in (1,5,12); #取id不为1、5、12的数据
select * from tb12 where id in (select id from tb11) #先把tb11的id取出来,作为tb12要查的id
select * from tb12 where id between 5 and 12; #取id为5到12的数据(闭区间)
通配符:
select * from tb12 where name like "a%" #查name以a为开头的数据
select * from tb12 where name like "%a%" #查name中带a的数据
select * from tb12 where name like "a_" #查name以a开头,后面只带一位的数据,比如 ab、ag
分页:
select * from tb12 limit 10; #查看前10条
select * from tb12 limit 0,10; #从第0行开始读取,读取10行;
select * from tb12 limit 10,10; #从第10行开始读取,读取10行;
select * from tb12 limit 20,10; #从第20行开始读取,读取10行;
select * from tb12 limit 10 offset 20; #从第20行开始读取,读取10行; #结合Python分页:
page = input('请输入要查看的页码')
page = int(page)
(page-1) * 10
select * from tb12 limit 0,10; #查看第1页数据
select * from tb12 limit 10,10;2 #查看第2页数据
排序:
select * from tb12 order by id desc; #id从大到小排
select * from tb12 order by id asc; #id从小到大排
select * from tb12 order by age desc,id desc; #age从大到小排,id从大到小排(如果age数相同,就按照id从大到小排)
select * from tb12 order by id desc limit 10; #取后10条数据
创建部门与员工表:
create table department5(
id int auto_increment primary key,
title varchar(32)
)engine=innodb default charset=utf8;
insert into department5(title) values('经理'),('销售'),('管理'),('财务');![]()
create table userinfo5(
id int auto_increment primary key,
name varchar(32),
part_id int,
CONSTRAINT fk_user_part FOREIGN key (part_id) REFERENCES department5(id)
)engine=innodb default charset=utf8;
insert into userinfo5(name,part_id) values('杨涵',2),('大波',1),('高月',2),('送气',3),('小白',4);
分组:
max:
#按par_id进行分类,如果part_id相同,就取id最大的那个进行分类 count:
此外还有min、sum、avg 如果对于聚合函数结果进行二次筛选时?必须使用having
例如果想筛选出id大于1的part_id:![]()
也可以用where,但后面不能加聚合函数![]()
连表操作:
做法:select * from userinfo5,department5 where userinfo5.part_id = department5.id
推荐下面写法:
(1)select * from userinfo5 left join department5 on userinfo5.part_id = department5.id; #userinfo5左边全部显示,因为userinfo5中没有对应department5中的刘洋,所以不显示刘洋
(2) select * from userinfo5 right join department5 on userinfo5.part_id = department5.id; #department5右边全部显示
(3)select * from userinfo5 innder join department5 on userinfo5.part_id = department5.id; #将出现null时的一行隐藏
(4)select count(id) from userinfo5; #统计userinfo5中的数据个数
cmd中导出现有数据库数据:
mysqldump -u用户名 -p密码 数据库名称 >导出文件路径 #结构+数据
mysqldump -u用户名 -p密码 -d数据库名称 >导出文件路径 #结构
导出现有数据库数据:
mysqldump -u用户名 -p密码 数据库名称 <文件路径
4、相关知识
1、临时表:把查出来的数据用()括起来,加上as+名称就能生成临时表
select * from (select * from tb where id<10) as B; #这里 (select * from tb where id<10) as B 就是一个临时表,名称为B
2、指定映射:
select id,name,1,sum(x)/count()
3、条件:
case when id>8 then xx else xx end
4、三元运算:
if(isnull(xx),0,1) #如果xx为空取0,否则取1
5、union
join执行的是左右连表,union执行的是上下连表
# 自动去重
select id,name from tb1
union
select num,sname from tb2 # 不去重
select sid,sname from student
UNION ALL
select sid,sname from student
注:group by,having语句中可以存在where,但where要放到group by, having的前面,表示先进行一次筛选,在筛选出的结果中再执行group by,having
作业练习:http://www.cnblogs.com/wupeiqi/articles/5729934.html
参考答案:https://www.cnblogs.com/wupeiqi/p/5748496.html
MySQL之唯一索引、外键的变种、SQL语句数据行操作补充的更多相关文章
- mysql更新(五) 完整性约束 外键的变种 三种关系 数据的增删改
11-数据的增删改 本节重点: 插入数据 INSERT 更新数据 UPDATE 删除数据 DELETE 再来回顾一下之前我们练过的一些操作,相信大家都对插入数据.更新数据.删除数据有了全面的认识. ...
- 2-16 MySQL字段约束-索引-外键
一:字段修饰符 1:null和not null修饰符 我们通过这个例子来看看 mysql> create table worker(id int not null,name varchar(8) ...
- mysql字段约束-索引-外键---3
本节所讲内容: 字段修饰符 清空表记录 索引 外键 视图 一:字段修饰符 (约束) 1:null和not null修饰符 我们通过这个例子来看看 mysql> create table wo ...
- Python9-MySQL索引-外键-day43
1.以ATM引出DBMS2.MySQL -服务端 -客户端3.通信交流 -授权 -SQL语句 -数据库 create database db1 default charset=utf8; drop d ...
- MySQL数据库(3)- 完整性约束、外键的变种、单表查询
一.完整性约束 在创建表时候,约束条件和数据类型的宽度都是可选参数. 作用:用于保证数据的完整性和一致性. 1.not null(不可空)与default 示例一:插入一个空值,如下: mysql&g ...
- python 全栈开发,Day62(外键的变种(三种关系),数据的增删改,单表查询,多表查询)
一.外键的变种(三种关系) 本节重点: 如何找出两张表之间的关系 表的三种关系 一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出 ...
- (原)未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值与DATEADD
SQLServer2014,查询分析器中 这样的脚本是没有问题的:AND TPO.CREATEON <= DATEADD(DAY, 1, '2017/3/3 0:00:00') 但.NET D ...
- MySQL 创建唯一索引忽略对已经重复数据的检查
MySQL 创建唯一索引忽略对已经重复数据的检查 在创建唯一索引的基础上加上关键字"IGNORE "即可.(注意,经测试,在5.7版本已经不再支持该参数) # 重复数据 mysql ...
- mysql(1)—— 详解一条sql语句的执行过程
SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL ...
随机推荐
- [tyvj2032]升降梯上<dp&spfa>
题目背景 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄. 题目描述 Nescafe 之 ...
- redis 练习
redis-server启动服务 redis-cli 进入redis redis 常用的keys键操作: exists key ---检查key是否存在 del key1 key2 ---删除指定的 ...
- Bug2020011601,在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现
在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现. 加上少的双引号,解决了.
- captcha-killer burp验证码识别插件体验
0x01 使用背景 在渗透测试和src挖洞碰到验证码不可绕过时,就会需要对存在验证码的登录表单进行爆破,以前一直使用PKav HTTP Fuzzer和伏羲验证码识别来爆破,但是两者都有缺点PKav H ...
- python class类的属性应用及init初始化实践 ---勇者斗恶龙
最近在熟悉python的基础语法,刚好老师布置了个课后作业感觉挺有意思的,就记录下来了学习过程. 题目如下: 刚拿到题目就想到了init 初始化属性,还列了下思路:(ps:notepad++写的比较糙 ...
- K:leetcode 5381.查询带键的排列 这题简单,但我还能优化。精益求精,才是算法的乐趣所在!
前言: 本题来自leetcode第184场周赛的第二小题.以前参加过周赛,觉得很有趣.苦于最近一段时间比较忙就没坚持参加了(实际上是借口来着....),由于昨晚思考一些事情,导致睡不着,所以起得有点早 ...
- 模板继承和UImodul 和 UImethods
模板继承和UImodul 和 UImethods 模板的继承 {% extends path %} path为templates下的相对路径 {% block block_name %}conten ...
- Spring XML Bean 定义的加载和注册
前言 本篇文章主要介绍 Spring IoC 容器怎么加载 bean 的定义元信息. 下图是一个大致的流程图: 第一次画图,画的有点烂.
- Gradle系列之初识Gradle
原文首发于微信公众号:躬行之(jzman-blog) 学习 Android 有一段时间了,开发中经常使用到 Gradle ,但是不知道 Gradle 构建项目的原理,计划花一点时间学习一下 Gradl ...
- Python常见数据结构-推导式
推导式是一种重要的Python特性,是一种简单精炼创建Python数据结构的方式. 列表推导式,详细参考https://www.jianshu.com/p/0a269715a742 基本格式为:[表达 ...