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 ...
随机推荐
- ArcGIS Server的安装
1.双击ArcGIS Server安装目录下的Setup.exe. 2.点击“Next”. 3.选择“I accept the license agreement”,点击“Next”. 4.点击“Ch ...
- iOS提审笔记
查看苹果各大系统的服务状态:中国区服务:https://www.apple.com/cn/support/systemstatus/美国区服务:https://developer.apple.com/ ...
- RuntimeError: PyTorch was compiled without NumPy support
原因:Pytorch和Numpy版本不匹配 查看自己Pytorch和Numpy版本 (1)执行[pip show torch]和[pip show numpy]查看版本信息(可通过[pip -h]查看 ...
- [vijos1844]遭遇战<SPFA>
题目链接:https://vijos.org/p/1404 我在二分查找区找到这道题的,没错这就是一道摆在二分区但是可以用SPFA做的一道题(当然我后来去看了下分区,貌似这题的方法很多) 这一题还是比 ...
- dp例题01. 任务价值最大化
题目Description: 大凯有n项任务可选择去做, 分别对应有开始时间, 结束时间以及任务报酬, 同一时间内最多做一件任务, 现在大凯想知道最多能得到多少报酬, 于是把求解任务交给了你. 输入: ...
- 性能优化之三:将Dottrace过程加入持续集成
之前分享过一篇如何做接口性能分析的文章,但是整个分析过程有点繁琐,需要写一个控制台程序调用被测接口,再预热.启动dottrace追踪,最后才能得到我们想要的性能分析报告.如果有办法一键生成性能分析报告 ...
- html字体大小与颜色设置
代码架构:<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> //浏览器识 ...
- LARAVEL快速入门
一.查询 $map = []; $map[] = ['u.store_id','=',0]; $map[] = ['u.reg_time','<',time()]; $map[] = ['u.u ...
- 正则表达式 regex
正则表达式存在于String api下的matches方法 常用正常表达式: 字符 x 字符 x \\ 反斜线字符 字符类 [abc] a.b 或 c(简单类) [^abc] 任何字符,除了 a.b ...
- "为文本添加下划线"组件:<u> —— 快应用组件库H-UI
 <import name="u" src="../Common/ui/h-ui/text/c_tag_underline"></impor ...

