MySQL约束条件 表关系建立 查询数据
约束条件
unsigned 无符号
即为非负数,用此类型可以增加数据长度
例如 tinyint最大范围是127,那tinyint unsigned 最大就可以到 127 * 2
通常用在不会出现符号的字段当中
需要注意的是 浮点型不可以使用unsigned
colum_name tinyint zerofill;
zerofill 零填充
在数字长度不够的数据不够的int数据类型前面填充0,以达到设定长度
colum_name int(8) zerofill;
not null 非空
将列的值强制为非NULL值
column_name data_type not null;
default 默认值
提供一个默认值,当insert into 语句不提供特定值时,例如性别字段的枚举时,可以讲默认性别设置为其他
gender eum('female','male','others')default 'others';
unique 唯一
将该字段设置只允许有一个相同的值
unique分为单列唯一和多列唯一 unique也相当于索引
# 单列唯一
create table table_name(colum_name type_name unique);
# 多列唯一
# 这里用IP和Port来举例 IP和Port都可以单列相同,但不可以两列都相同 create table t8 (
id int,
host varchar(32),
port int,
unique(host, port)
);
primary key 主键
从约束角度来说,主键相当于非空且唯一
# 从限制角度上来说
id int primary key == id int not null unique
# 语法
create table table_name(id int primary key)
InnoDB储存引擎规定一张表必须有且只有一个主键,但是我们发现,创建表没有指定主键也可以创建成功,InnoDB引擎会在底层用一个隐藏字段创建一个主键,隐藏意味着看不到,也不能用。
主键能让我们的查询速度更快,主键本质上也是一种索引。
auto_increment 自增
一般用来为主键使用,每次新建不传值会自增1
create table t13 (
id int primary key auto_increment,
name varchar(16)
)
清空表数据
1.delete from table_name;
# 如果表主键为自增那么清空操作完成之后后续的写入会延续之前的数字
+----+------+
| id | name |
+----+------+
| 1 | NULL |
| 3 | NULL |
+----+------+
delete from test1; # 清空该表
insert into test1(name) values ('jesse'); # 写入数据
select * from test1; # 查看会发现该条数据延续之前的id
+----+-------+
| id | name |
+----+-------+
| 4 | jesse |
+----+-------+
2.truncate from table_name;
# truncate 删除之后的操作不会延续
# 推荐使用truncate 便于binlog恢复数据
表关系判断
一对一
例:1、判断一个员工可以有多个部门吗?
不可以
2、一个部门可以有多个员工吗?
可以
上面这样只要一个可以,一个不可以,那么就可以判断它们是一对多的关系。
多对多
例:1、一个图书可以有多个作者吗?
可以 2、一个作者可以有多个书吗?
可以上面这样只要一个可以,另一个也可以,那么它们就是多对多的关系。
一对一
例:
- 一个作者可以有多个作者详情吗?
不可以 - 一个作者详情可以有多个作者吗?
不可以
两个都不可以,那么可以判断它们就是一对一的关系。
一对一关系外键建在任何一个表中都可以,但是推荐建在查询频率高的一个表。
- 一个作者可以有多个作者详情吗?
SQL语句实现表关系
一对多
- 先创建基表
- 再添加外键关系 ,一对多表关系,外键字段建在多的一方
- 录数据的时候也必须先录被关联表
create table dep(
id int primary key auto_increment,
dep_name varchar(16) unique,
descript varchar(64)
); # 创建部门表 create table emp(
id int primary key auto_increment,
name varchar(16),
gender enum('male','female')default'female',
age int,
foreign key (dep_id) references dep(id)
on update cascade # 级联更新
on delete cascade # 级联删除
);
多对多
create table book(
id int primary key auto_increment,
title varchar(16),
price int
) create table author(
id int primary key auto_increment,
name varchar(16),
phone int
) # 多对多一定要先创建第三张表 create table book2author(
id int primary key auto_increment,
book_id int,
author_id int,
foreign key (book_id) references author(id)
on update cascade # 级联更新
on delete cascade, # 级联删除 foreign key (author_id) references book(id)
on update cascade # 级联更新
on delete cascade # 级联删除
)
一对一
create table author_detail(
id int primary key auto_increment,
title varchar(16),
price int
) create table author_2(
id int primary key auto_increment,
name varchar(16),
phone int,
author_detail_id int unique,
foreign key (author_detail_id) references author_detail(id)
on update cascade # 级联更新
on delete cascade # 级联删除
)
表的查询
表准备
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', #大部分是男的
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, #一个部门一个屋子
depart_id int
);
#插入记录
#三个部门:教学,销售,运营
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('tom','male',78,'20150302','teacher',1000000.31,401,1),
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','male',48,'20101111','teacher',10000,401,1),
('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('西西','female',18,'20110312','sale',1000.37,402,2),
('乐乐','female',18,'20160513','sale',3000.29,402,2),
('拉拉','female',28,'20170127','sale',4000.33,402,2),
('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);
1.select
用来指定表的字段数据
select * from emp;
select id,name from emp;
2.from
后面跟需要查询的表名即可
3.where
筛选数据
查询关键字之where
# 1.查询id大于等于3小于等于6的数据
select id,name from emp where id >= 3 and id <= 6;
select * from emp where id between 3 and 6;
# 2.查询薪资是20000或者18000或者17000的数据
select * from emp where salary = 20000 or salary = 18000 or salary = 17000;
select * from emp where salary in (20000,18000,17000); # 简写
"""
模糊查询
关键字
like
关键符号
%:匹配任意个数的任意字符
_:匹配单个个数的任意字符
show variables like '%mode%';
""" elasticsearch
# 3.查询姓名中带有字母o的员工姓名和薪资
select name,salary from emp where name like '%o%';
# 4.查询姓名由四个字符组成的员工姓名和薪资
select name,salary from emp where name like '____';
select name,salary from emp where char_length(name) =4;
# 5.查询id小于3或者大于6的数据
select * from emp where id not between 3 and 6;
# 6.查询薪资不在20000,18000,17000范围的数据
not in 不走索引
select * from emp where salary not in (20000,18000,17000);
# 7.查询岗位描述为空的员工名与岗位名 针对null不能用等号,只能用is
select name,post from emp where post_comment = NULL; # 查询为空!
select name,post from emp where post_comment is NULL;
select name,post from emp where post_comment is not NULL;
查询关键字之group by分组
分组
将单个单个的个体按照指定的条件分成一个个整体
"""
分组之后默认只能直接获取到分组的依据
其他字段无法再直接获取(可以间接获取)
"""
# 严格模式
set global sql_mode='STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH,only_full_group_by'
# 1.每个部门的最高薪资
select post,max(salary) from emp group by post;
# 2.每个部门的最低薪资
select post,min(salary) from emp group by post;
# 3.每个部门的平均薪资
select post,avg(salary) from emp group by post;
# 4.每个部门的人数
select post,count(id) from emp group by post;
# 5.每个部门的月工资总和
select post,sum(salary) from emp group by post;
"""
可以给字段起别名(as还可以给表起别名)
select post as '部门',sum(salary) as '总和' from emp group by post;
"""
# 查询分组之后的部门名称和每个部门下所有的员工姓名
"""
group_concat() 获取分组以外的字段数据 并且支持拼接操作
select post,group_concat(name) from emp group by post;
select post,group_concat(name,':',salary) from emp group by post;
concat() 未分组之前使用的拼接功能
select concat(name,':',sex) from emp;
concat_ws()
select concat_ws(':',name,sex,salary,age) from emp;
"""
聚合函数
分组之后频繁需要使用的
max 最大值
min 最小值
sum 求和
count 计数
avg 平均值
作业
1.书籍表与出版社表
2.课程表与老师表
3.班级表与学生表
4.作者表与作者详情表
"""
书写出完整的判断过程
并且写上对应的SQL语句
"""
book
publish
图书和出版社是一对多关系
author
书和作者是多对多关系
author_detail
作者和作者详情一对一
MySQL约束条件 表关系建立 查询数据的更多相关文章
- MySQL将表a中查询的数据插入到表b中
MySQL将表a中查询的数据插入到表b中 假设表b存在 insert into b select * from a; 假设表b不存在 create table b as select * from a ...
- Mysql多表关系
mysql多表关系 多表关系是关系型数据库特有的 三种关系 一对一关系 一对多关系 多对多关系 总结 一对一 例子:用户和用户信息 外键设置在用户上,外键字段唯一非空 添加 无级联:先增加被关联表记录 ...
- MYSQl 全表扫描以及查询性能
MYSQl 全表扫描以及查询性能 -- 本文章仅用于学习,记录 一. Mysql在一些情况下全表检索比索引查询更快: 1.表格数据很少,使用全表检索会比使用索引检索更快.一般当表格总数据小于10行并且 ...
- mysql多表多字段查询并去重
mysql多表多字段查询并去重 - MySQL-ChinaUnix.nethttp://bbs.chinaunix.net/forum.php?mod=viewthread&tid=42549 ...
- mysql分表,批量生成数据
一.mysql的分表策略 根据经验,Mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉: 1,水平分割: 水平(横向)拆分:将同一个表的数据进行分块保存到不同的 ...
- MySQL之表关系
MySQL表关系 一对多关系 一对多与多对一是一个概念,指的是一个实体的某个数据与另外一个实体的多个数据有关联关系. 举例,学校中一个学.院可以有很多的学生,而一个学生只属于某一个学院(通常情况下), ...
- MySQL之表关系与范式
关系: 所有的关系都是指表与表之间的关系. 将实体与实体的关系,反应到最终数据库表的设计上来,可以将关系分成三种:一对一,一对多(多对一)和多对多. 一对一: 一张表的一条记录一定只能与另外一张表的记 ...
- MySQL 入门(九)—— 查询数据
查询数据就是从数据库中获取所须要的数据. 1.基本查询语句 即Select语句 当中.属性列表表示要查询的字段名.表名和视图列表表示从此处指定的表或者视图中查询数据.能够有多个:条件表达式1制定了查询 ...
- nodejs 在MYSQL 数据库中插入和查询数据
插入前的数据库: 插入后的数据库: 输出结果: demo var mysql = require('mysql'); var connection = mysql.createConnection({ ...
随机推荐
- Leetcode547 朋友圈解题报告 (DFS
题目描述: 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋 ...
- CG-CTF single
一.拖入ida,先静态分析一下 发现有三个函数,点击进去看看 a1为0时,当a2[i]为0时,将自身的值赋值到该位置,a1为0时,就不需要动. 这三个函数都是在暗示这东西是个数独,每行每列,都有1到9 ...
- SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!
大家好,我是飘渺. 今天我们来聊一聊在基于SpringBoot前后端分离开发模式下,如何友好的返回统一的标准格式以及如何优雅的处理全局异常. 首先我们来看看为什么要返回统一的标准格式? 为什么要对Sp ...
- ES异地双活方案
对于单机房而言,只要参考Elastic Search 官方文档,搭建一个集群即可,示意图如下: 原理类似分布式选举那一套,当一个master节点宕机时,剩下2个投票选出1个新老大,整个集群可以继续服务 ...
- servlet核心技术2
一.Servet 与 JDBC 在Servlet中可以使用JDBC技术访问数据库,查询DB数据,然后生成显示页面,接收请求参数,然后对DB操作 为了方便重用和便于维护等目的,经常会采用DAO(Data ...
- 你觉得我的这段Java代码还有优化的空间吗?
上周,因为要测试一个方法的在并发场景下的结果是不是符合预期,我写了一段单元测试的代码.写完之后截了个图发了一个朋友圈,很多人表示短短的几行代码,涉及到好几个知识点. 还有人给出了一些优化的建议.那么, ...
- C语言:int -32768-32767
c语言中int的表示范围是-32768~32767!这得从二进制的原码说起:如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767最小为111111111 ...
- C++中dynamic_cast与static_cast浅析与实例演示
1. static_cast 1.1 static_cast语法 static_cast< new_type >(expression) 备注:new_type为目标数据类型,expres ...
- 【贪心+排序】凌乱的yyy / 线段覆盖 luogu-1803
题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加几个比赛. 由于yyy是蒟蒻,如果要参加 ...
- PostgreSQL-WITH AS短语
WITH提供了一种方式来书写在一个大型查询中使用的辅助语句.这些语句通常被称为公共表表达式或CTE,它们可以被看成是定义只在一个查询中存在的临时表.在WITH子句中的每一个辅助语句可以是一个SELEC ...