程序笔记   发布时间:2022-07-16  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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、一个作者可以有多个书吗? ​ 可以

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

  • 一对一

    例:

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

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

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

sql语句实现表关系

表的查询

表准备

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约束条件 表关系建立 查询数据所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。