约束条件

  • 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、一个作者可以有多个书吗?

    ​ 可以

    上面这样只要一个可以,另一个也可以,那么它们就是多对多的关系。

  • 一对一

    例:

    1. 一个作者可以有多个作者详情吗?

      不可以
    2. 一个作者详情可以有多个作者吗?

      不可以

    两个都不可以,那么可以判断它们就是一对一的关系。

    一对一关系外键建在任何一个表中都可以,但是推荐建在查询频率高的一个表。

SQL语句实现表关系

  • 一对多

    1. 先创建基表
    2. 再添加外键关系 ,一对多表关系,外键字段建在多的一方
    3. 录数据的时候也必须先录被关联表
    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约束条件 表关系建立 查询数据的更多相关文章

  1. MySQL将表a中查询的数据插入到表b中

    MySQL将表a中查询的数据插入到表b中 假设表b存在 insert into b select * from a; 假设表b不存在 create table b as select * from a ...

  2. Mysql多表关系

    mysql多表关系 多表关系是关系型数据库特有的 三种关系 一对一关系 一对多关系 多对多关系 总结 一对一 例子:用户和用户信息 外键设置在用户上,外键字段唯一非空 添加 无级联:先增加被关联表记录 ...

  3. MYSQl 全表扫描以及查询性能

    MYSQl 全表扫描以及查询性能 -- 本文章仅用于学习,记录 一. Mysql在一些情况下全表检索比索引查询更快: 1.表格数据很少,使用全表检索会比使用索引检索更快.一般当表格总数据小于10行并且 ...

  4. mysql多表多字段查询并去重

    mysql多表多字段查询并去重 - MySQL-ChinaUnix.nethttp://bbs.chinaunix.net/forum.php?mod=viewthread&tid=42549 ...

  5. mysql分表,批量生成数据

    一.mysql的分表策略 根据经验,Mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉: 1,水平分割: 水平(横向)拆分:将同一个表的数据进行分块保存到不同的 ...

  6. MySQL之表关系

    MySQL表关系 一对多关系 一对多与多对一是一个概念,指的是一个实体的某个数据与另外一个实体的多个数据有关联关系. 举例,学校中一个学.院可以有很多的学生,而一个学生只属于某一个学院(通常情况下), ...

  7. MySQL之表关系与范式

    关系: 所有的关系都是指表与表之间的关系. 将实体与实体的关系,反应到最终数据库表的设计上来,可以将关系分成三种:一对一,一对多(多对一)和多对多. 一对一: 一张表的一条记录一定只能与另外一张表的记 ...

  8. MySQL 入门(九)—— 查询数据

    查询数据就是从数据库中获取所须要的数据. 1.基本查询语句 即Select语句 当中.属性列表表示要查询的字段名.表名和视图列表表示从此处指定的表或者视图中查询数据.能够有多个:条件表达式1制定了查询 ...

  9. nodejs 在MYSQL 数据库中插入和查询数据

    插入前的数据库: 插入后的数据库: 输出结果: demo var mysql = require('mysql'); var connection = mysql.createConnection({ ...

随机推荐

  1. MySQL中的字段拼接 concat() concat_ws() group_concat()函数

    1.concat()函数 2.concat_ws()函数 3.group_concat()函数 操作的table select * from test_concat order by id limit ...

  2. leetcode TOP100 两数相加

    两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  3. 【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码逐步最终源端

    问题描述 在使用Azure Function App的SendGrid Binging功能,调用SendGrid服务器发送邮件功能时,有时候遇见间歇性,偶发性异常.在重新触发SendGrid部分的Fu ...

  4. Oracle如何以逗号分隔的字符串拆分为多行数据

    近期在工作中遇到某表某字段是可扩展数据内容,信息以逗号分隔生成的,现需求要根据此字段数据在其它表查询相关的内容展现出来,第一想法是切割数据,以逗号作为切割符,以下为总结的实现方法,以供大家参考.指教. ...

  5. 63. Unique Paths II 动态规划

    description: https://leetcode.com/problems/unique-paths/ 机器人从一堆方格的左上角走到右下角,只能往右或者往下走 ,问有几种走法,这个加了难度, ...

  6. Ubuntu命令总结

    sudo apt-get update 系统更新 shutdown -h now 关闭服务器 shutdown -r now 重启服务器 uname -a ubuntu中查看内核版本的命令 gedit ...

  7. 管理员的基本防范措施 Linux系统安全及应用

    系统安全及应用一.账号安全基本措施① 系统账号清理② 密码安全控制③ 命令历史限制④ 终端自动注销二.SU命令切换用户① 用途及用法② 验证密码③ 限制使用su命令的用户④ 查看su操作记录补充三.L ...

  8. 使用deepin系统自带命令切割视频使用lossless免费软件切割

    1,使用ffmpeg命令:ffmpeg -ss 00:00:10 -i gaodengshuxue.mp4 -vcodec copy -acodec copy -t 00:00:20 output.m ...

  9. robotframework - PO设计

    1.添加新建好的资源 2.测试用例原始代码如下(未做任何分离的数据) *** Settings ***Library SeleniumLibraryResource UI分层一.txtResource ...

  10. Beam Search快速理解及代码解析(下)

    Beam Search的问题 先解释一下什么要对Beam Search进行改进.因为Beam Search虽然比贪心强了不少,但还是会生成出空洞.重复.前后矛盾的文本.如果你有文本生成经验,一定对这些 ...