精华内容
下载资源
问答
  • mySQL重复外键
    2021-01-19 19:42:36

    这些情况的教科书解决方案是使用联结或映射表. Werknemer应该包含有关船员,Jobfunctie的有关工作描述的信息,并且您需要第三个表来分配船员工作:

    CREATE TABLE Werknemer (

    personeelsnummer INT(4) NOT NULL,

    voornaam VARCHAR(10) NOT NULL,

    achternaam VARCHAR(10) NOT NULL,

    adres VARCHAR(30) NOT NULL,

    telefoon VARCHAR(10) NOT NULL,

    PRIMARY KEY (personeelsnummer)

    );

    CREATE TABLE Jobfunctie (

    jobnumber INT(4) NOT NULL

    jobfunctie VARCHAR(15) NOT NULL,

    salaris_in_euro INT(10) NOT NULL,

    PRIMARY KEY (jobnumber)

    );

    -- The new junction table

    CREATE TABLE Werknemer_Jobfunctie (

    personeelsnummer INT(4) NOT NULL,

    jobnumber INT(4) NOT NULL,

    PRIMARY KEY (personeelsnummer, jobnumber),

    FOREIGN KEY (personeelsnummer) references Werknemer (personeelsnummer),

    FOREIGN KEY (jobnumber) references Jobfunctie (jobnumber),

    )

    -- Insert crewmen

    INSERT INTO Werknemer VALUES

    (0100, 'firstname', 'lastname', 'adress', 'telephone');

    INSERT INTO Werknemer VALUES

    (0101, 'firstname2', 'lastname2', 'adress', 'telephone');

    -- Insert a job description

    INSERT INTO Jobfunctie VALUES

    (1, 'Arbeider', 1500);

    -- Assign this job to both crewmen

    INSERT INTO Werknemer_Jobfunctie VALUES

    (0100, 1);

    INSERT INTO Werknemer_Jobfunctie VALUES

    (0101, 1);

    更多相关内容
  • MySQL-外键对应关系

    2021-01-19 05:38:01
    前言:当我们用mysql数据库建表时,如果所有信息都记录在一张表中会出现哪些问题?1.表的结构不清晰,2.浪费硬盘空间3.表的扩展性极差(无法忽略的缺点)所以出现表的拆分,这样就涉及到表与表之间的关联性一、表与表...

    前言:

    当我们用mysql数据库建表时,如果所有信息都记录在一张表中会出现哪些问题?

    1.表的结构不清晰,

    2.浪费硬盘空间

    3.表的扩展性极差(无法忽略的缺点)

    所以

    出现表的拆分,这样就涉及到表与表之间的关联性

    一、表与表之间建关系

    如何让两种表有代码层面上真正的关联,就必须使用外键了

    外键就是让表与表有硬性层面上的关系。

    对应方式:

    一对多

    多对多  (三张表)

    一对一

    外键约束(foreign key(关联id) reference  关联表名(id))

    1.在创建表的时候,必须先创建被关联表

    2.插入数据的时候,也必须先插入被关联表的数据

    二、同步更新、删除

    on update cascade(添加外键约束后,一起为一行)

    on delete cascade

    三、关系举例

    判断表关系的最简单的语句

    图书与出版社

    一本书是否可有多个出版社——否

    一个出版社是否可出版多本书——是

    即一对多的关系

    图书与作者表

    一本书是否可有多个作者——是

    一个作者是否可出多本书——是

    即多对多的关系

    作者与作者详情

    一个作者是否可有多个详情——否

    一个作者详情是否可有多个作者——否

    即一对一关系或没有任何关系

    四、修改完整语句

    1. 修改表名

    ALTER TABLE 表名

    RENAME 新表名;

    2. 增加字段

    ALTER TABLE 表名

    ADD 字段名 数据类型 [完整性约束条件…],

    ADD 字段名 数据类型 [完整性约束条件…];

    ALTER TABLE 表名

    ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 直接移到最前面

    ALTER TABLE 表名

    ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 寻找插哪个字段的后面

    3. 删除字段

    ALTER TABLE 表名

    DROP 字段名;

    4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!

    ALTER TABLE 表名

    MODIFY 字段名 数据类型 [完整性约束条件…];

    ALTER TABLE 表名

    CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    #查询语句执行的结果也是一张表,可以看成虚拟表

    #复制表结构+记录 (key不会复制: 主键、外键和索引)

    create table new_service select * fromservice;#只复制表结构

    select * from service where 1=2; //条件为假,查不到任何记录

    create table new1_service select* from service where 1=2;

    create table t4 like employees;

    复制表

    展开全文
  • 外键"""把所有数据都存放与一张表的弊端:1.组织结构不清晰2.浪费硬盘空间3.扩展性极差"""# 上述弊端产生原因类似于把所有代码写在同一个python文件中,我们常用的优化方法就是解耦合# 如何查找表与表之间的关系"""以...

    外键

    """

    把所有数据都存放与一张表的弊端:

    1.组织结构不清晰

    2.浪费硬盘空间

    3.扩展性极差

    """

    # 上述弊端产生原因类似于把所有代码写在同一个python文件中,我们常用的优化方法就是解耦合

    # 如何查找表与表之间的关系

    """

    以员工和部门表为例。查找表关系需要做到换位思考(站在两边去找表关系)

    先站在员工表:

    找员工表的多条数据能否对应部门表的一条数据

    翻译:

    多个员工能否属于一个部门

    可以!之后不能直接下结论,还需要站在部门表的角度再确认关系

    再站在部门表:

    找部门表的多条数据能否对应员工表的一条数据

    翻译:

    多个部门能否有同一个员工

    不可以!

    只有站在两边表的角度都分析过了,才能够下结论

    员工表单向多对一部门表

    """

    # 员工表中的dep_id 可以随意更改,但是应该限制dep_id字段必须只是部门表已有的id字段才合理

    一对多(Foreign Key)

    # foreign key 会带来什么样的效果

    # 1.在创建表时,先建立被关联的表dep,才能见关联表emp 否则会报错

    create table dep(

    id int primary key auto_increment,

    dep_name char(16),

    dep_comment char(60)

    );

    create table emp(

    id int primary key auto_increment,

    name char(16),

    gender enum('male','female','other') not null default 'male',

    dep_id int,

    foreign key(dep_id) references dep(id)

    );

    # 2.再插入记录时,必须先插被关联的表dep,才能插关联表emp

    insert into dep(dep_name,dep_comment) values

    ('sb教学部','sb辅导学生学习,教授python课程'),

    ('外交部','老男孩上海校区驻张江形象大使'),

    ('nb技术部','nb技术能力有限部门');

    insert into emp(name,gender,dep_id) values

    ('alex','male',1),

    ('egon','male',2),

    ('lxx','male',1),

    ('wxx','male',1),

    ('wenzhou','female',3);

    # 如果想修改emp中的dep_id或dep里的id时都无法成功

    # 如果想删除dep表的教学部时,也无法删除

    # 方式1:先删除教学部对应的所有的员工,再删除教学部

    # 方式2:受限于外键约束,导致操作数据变得非常复杂,能否有一张简单的方式,让我不需要考虑在操作目标表的时候还需要考虑关联表的情况,比如我删除部门,那么这个部门对应的员工就应该跟着立即清空

    # 先把之前创建的表删除,先删员工表,再删不么表

    # 3.更新与删除都需要考虑到关联与被关联的关系>>>同步更新与同步删除

    create table dep(

    id int primary key auto_increment,

    dep_name char(10),

    def_comment char(60)

    );

    create table emp(

    id int primary key auto_increment,

    name char(16),

    gender enum('male','female') not null default 'male',

    dep_id int,

    foreign key(dep_id) references dep(id)

    on update cascade

    on delete cascade

    );

    insert int dep(dep_name,dep_comment) values

    ('sb教学部','sb辅导学生学习,教授python课程'),

    ('外交部','老男孩上海校区驻张江形象大使'),

    ('nb技术部','nb技术能力有限部门');

    insert into emp(name,gender,dep_id) values

    ('alex','male',1),

    ('egon','male',2),

    ('lxx','male',1),

    ('wxx','male',1),

    ('wenzhou','female',3);

    # 删除部门后,对应的部门里的员工表数据对应删除

    # 更新部门后,对应员工表中的标示部门的字段同步更新

    多对多

    # 图书表与作者表之间的关系

    """

    仍然先站在两张表的角度分析:

    1.站在图书表:一本书可不可以有多个作者,可以,那就是书多对一作者

    2.站在作者表:一个作者可不可以写多本书,可以,那就是作者多对一书

    双方都能一条数据对应对方多条记录,这种关系就是多对多

    """

    # 先考虑如何创建表?图书表需要有一个外键关联作者,作者表也需要一个外键关联图书,那么先创建谁都不合适,如何解决?

    # 解决方法:建立第三张表,该表中有一个字段fk作者的id,还有一个字段fk书的id

    create table author(

    id int primary key auto_increment,

    name char(16)

    );

    create table book(

    id int primary key auto_increment,

    bname char(16),

    price int

    );

    insert into author(name) values

    ('egon'),

    ('alex'),

    ('wxx');

    insert into book(name,price) values

    ('python从入门到入土',200),

    ('葵花宝典切割到精通',800),

    ('九阴真经',500),

    ('九阳神功',100);

    create table author2book(

    id int primary key auto_increment,

    author_id int,

    book_id int,

    foreign key(author_id) references author(id)

    on update cascade

    on delete cascade,

    foreign key(book_id) references book(id)

    on update cascade

    on delete cascade

    );

    insert into author2book(author_id,book_id) values

    (1,3),

    (1,4),

    (2,2),

    (2,4),

    (3,1),

    (3,2),

    (3,3),

    (3,4);

    一对一

    客户表和学生表(老男孩的客户与学生之间,报名之前都是客户,只有报了名的才能是学生)

    # 左表的一条记录唯一对应右表的一条记录,反之也一样

    create table customer(

    id int primary key auto_increment,

    name char(20) not null,

    qq char(10) not null,

    phone char(16) not null

    );

    create table student(

    id int primary key auto_increment,

    class_name char(20) not null,

    custome_id int unique, # 该字段一定要是唯一的

    foreign key(customer_id) references customer(id) # 外键的字段一定要保证唯一

    on update cascade

    on delete cascade

    );

    # 三种外键关系都是用foreign key, 区别在于如何使用以及其他条件限制即可做出三种关系

    修改表

    # mysql对大小写不敏感

    语法:

    1. 修改表名

    alter table 表名

    rename 新表名;

    2. 增加字段

    alter table 表名

    add 字段名 数据类型[完整性约束条件...],

    add 字段名 数据类型[完整性约束条件...];

    alter table 表名

    add 字段名 数据类型[完整性约束条件...] first;

    alter table 表名

    add 字段名 数据类型[完整性约束条件...] after 字段名;

    3. 删除字段

    alter table 表名

    drop 字段名;

    4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,可以使用change

    alter table 表名

    modify 字段名 数据类型[完整性约束条件...];

    alter table 表名

    change 旧字段名 新字段名 旧数据类型 [完整性约束条件...];

    alter table 表名

    change 旧字段名 新字段名 新数据类型 [完整性约束条件...];

    复制表

    # 查询语句执行的结果也是一张表,可以看成虚拟表

    # 复制表结构+记录 (key不会复制: 主键、外键和索引)

    create table new_service select * from service;

    # 只复制表结构

    select * from service where 1=2; //条件为假,查不到任何记录

    create table new1_service select * from service where 1=2;

    create table t4 like employees;

    展开全文
  • 外键简介2.2 > 外键关系2.2.1 > 一对多2.2.2 > 多对多2.2.3 > 一对一关系3 > 查询关键字3.1 > 查询关键字之select与from3.2 > 查询关键字之where筛选3.3 > 查询关键字之group by分组3.4 &...

    1 > 自增特性

       自增的作用已经了解但是自增他有他自己的一些特性,在实操过程中当我们将id值设为自增属性之后,当我们删除某个数据后,再次插入数据会发现自增的值就会出现断层了。演示如下:

    
    	 create table t1(
        -> id int primary key auto_increment,
        -> name varchar(32)
        -> );
    
    

    在这里插入图片描述
       正常插入数据时没有问题自增没有出现断层,数字连续。

    
    	insert into t1(name) values('jason'),('bob'),('kevin');
    
    

    在这里插入图片描述
       当我们删除id=4,id= 7 后插入oscar他的id值不会回退。如下:

    delete from t1 where id=4;
    delete from t1 where id=7;
    insert into t1(name) value('oscar');
    select * from t1;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | jason |
    |  2 | bob   |
    |  3 | kevin |
    |  5 | rr    |
    |  6 | rr    |
    |  8 | oscar |
    +----+-------+
    6 rows in set (0.00 sec)
    
    

    在这里插入图片描述
       如何解决呢? 就是我们必须要在删除数据后再重置主键值,自增属性才会继续连续自增。

    
    mysql> truncate t1;
    Query OK, 0 rows affected (1.85 sec)
    
    mysql> select * from t1;
    Empty set (0.00 sec)
    
    mysql> insert into t1(name) values('jason'),('kevin'),('tony');
    Query OK, 3 rows affected (0.05 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> insert into t1(name) values('oscar');
    Query OK, 1 row affected (0.05 sec)
    
    mysql> select * from t1;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | jason |
    |  2 | kevin |
    |  3 | tony  |
    |  4 | oscar |
    +----+-------+
    4 rows in set (0.00 sec)
    
    

    在这里插入图片描述

    2 > 约束条件之外键

    2.1 > 外键简介

       外键前戏:

    
    	创建一张员工表(有以下几个字段)
    		id name age dep_name dep_desc
    	
    	就这样创建一个表有不少的缺陷:
    		1.表的重点不清晰
    			既可以说是员工表也可以说是部门表
    		2.表中的某些字段对应的数据一直在重复
    			浪费了存储空间
    		3.表的拓展性极差 牵一发而动全身
    			耦合度太高 不利于维护
    	
    	解决方法
    		将表一分为二
    		员工表						部门表
    		id name age					id dep_name dep_desc
    	# 拆完之后确实解决了上述三个缺陷,但是也有了一个致命缺点
    	# 员工与部门表之间没有了绑定关系
    	
    	解决方法	
    		在员工表中添加一个部门编号字段与部门表中的主键字段相对应
    	'''
    		该字段就是外键字段
    			是用来记录表与表之间的数据关系
    	'''
    

    2.2 > 外键关系

       四种外键关系:

    
    	1.一对多
    	2.多对多
    	3.一对一
    	4.没有关系
    
    

       对于关系的判断就需要记住一个口诀:换位思考

    2.2.1 > 一对多

       关系梳理如下:

    
    	1.以员工表与部门表为例
    		先站在员工表的角度
    	  	问:一个员工能否对应多个部门
    	    答:不可以
    		
    		再站在部门表的角度
    	  	问:一个部门能否对应多个员工
    	    答:可以
    	    
    	结论:
    		换位思考之后得出的答案是一个可以一个不可以
    		所以关系是"一对多" 部门是'一'员工是'多
    		 '''关系表达只能用一对多 不能用多对一'''
    		一对多关系 外键字段建在"多"的一方(员工表)
    

       创建外键SQL语句如下:

    
    	'''
    		如果表中有外键字段 那么建议先编写普通字段 最后再考虑外键字段
    	'''
    	
    	create table emp(
    		id int primary key auto_increment comment '编号',
    		name varchar(32) comment '姓名',
    		age int comment '年龄',
    		dep_id int comment '部门编号',
    		foreign key(dep_id) references dep(id)
    	);
    	create table dep(
    		id int primary key auto_increment comment '编号',
    		dep_name varchar(32) comment '部门名称',
    		dep_desc varchar(32) comment '部门描述'
    	);
    '''
    	但是按这个顺序你这么些 你会发现员工表创建不出来,就是因为有这 foreign key的约束条件存在
    '''
    

    在这里插入图片描述
       foreign key的约束条件具体如下:

    
    	1.创建表的时候 应该先创建被关联表(没有外键字段的表)
    	2.插入数据的时候 应该先插入被关联表(没有外键字段的表)
    		外键字段填入的值只能是被关联表中已经存在的值
    	3.修改、删除被关联表数据都会出现障碍
    		需要使用到级联更新来解决这个障碍
    
    

       级联更新级联删除的具体作用,就是当我们创建完成员工表和部门表之后向对部门表(被关联表)做修改的时候员工表(关联表)中的关联数据也会做出变动的操做,具体代码如下:

    
    
    	'''
    		再关联表中去添加级联跟新级联删除代码
    			on update cascade  # 级联更新
    			on delete cascade  # 级联删除
    	'''
    	create table emp1(
    	id int primary key auto_increment comment '编号',
    	  name varchar(32) comment '姓名',
    	  age int comment '年龄',
    	  dep_id int comment '部门编号',
    	  foreign key(dep_id) references dep1(id) 
    	  on update cascade  # 级联更新
    	  on delete cascade  # 级联删除
    	);
    	create table dep1(
    		id int primary key auto_increment comment '编号',
    	  dep_name varchar(32) comment '部门名称',
    	  dep_desc varchar(32) comment '部门描述'
    	);
    
    	"""
    	在实际工作中外键也可能不会使用 因为外键会消耗额外的资源
    	并且会增加表的复杂度 
    	表很多的情况下 我们也可以通过SQL语句的形式建立逻辑意义上的表关系
    	"""
    

    2.2.2 > 多对多

       关系梳理如下:

    
    	以图书与作者表为例
    		1.先站在图书表的角度
    	  	问:一本书籍能否对应多名作者
    	    答:可以
    	  2.再站在作者表的角度
    	  	问:一名作者能否对应多本书籍
    	    答:可以
    	  结论:换位思考之后两边都可以 那么就是"多对多"关系
    
    

       创建关联表代码过程如下:

    
    	"""
      		针对多对多关系 需要单独开设第三张表专门存储关系
      	"""
    	# 先依此创建书表和作者表(两张表里不写两张表的关系)
    	 create table book(
    	    id int primary key auto_increment,
    	    title varchar(32),
    	    price float(10,2)
    	);
    	
    	create table author(
    	    id int primary key auto_increment,
    	    name varchar(32),
    	    gender enum('male','female','others')
    	);
    	
    	# 再创建第三张表专门存储关系的表
    	create table book_author(
    	    id int primary key auto_increment,
    	    author_id int,
    	    book_id int,
    	    # 将字段author_id 与作者表的id关联
    	    foreign key(author_id) references author(id) 
    	    on update cascade   # 级联更新
    	    on delete cascade,  # 级联删除
    	    # 将字段book_id 与书表的id关联
    	    foreign key(book_id) references book(id) 
    	    on update cascade  # 级联更新
    	    on delete cascade  # 级联删除
    	);
    

    在这里插入图片描述

    2.2.3 > 一对一关系

       关系梳理如下:

    
    	针对qq用户表 其实里面的数据可以分成两类
    		热数据:经常需要使用的数据
    	    	eg:qq号码 座右铭 个人简介 爱好
    	  	冷数据:不怎么经常需要使用的数据
    	    	eg:邮箱 电话 学校 ...
    	  	为了节省资源并降低数据库压力 会将表一分为二
    		  	用户表
    		    	存使用频率较高的数据字段
    		    用户详情表
    		    	存使用频率较低的数据字段
    	1.先站在用户表的角度
    		问:一个用户数据能否对应多个用户详情数据
    	  答:不可以
    	2.再站在用户详情表的角度
    		问:一个用户详情数据能否对应多个用户数据
    	  答:不可以
    	结论:换位思考之后两边都不可以 那么关系可能有两种
    
    

       创建关联表代码过程如下:

    
    create table User(
    	id int primary key auto_increment,
    	name varchar(32),
    	gender enum('male','female','others'),
    	user_detail_id int unique,  
    	foreign key(user_detail_id) references UserDetail(id) 
    	on update cascade   # 级联更新
    	on delete cascade,  # 级联删除
    );
    create table UserDetail(
    	id int primary key auto_increment,
    	phone bigint,
    	age int
    );
    
    
    

    3 > 查询关键字

       数据准备。

    
    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
    ('jason','male',18,'20170301','张江第一帅形象代言',7300.33,401,1), #以下是教学部
    ('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);
    
    

    在这里插入图片描述

    3.1 > 查询关键字之select与from

    
    	select用于指定查询的字段
    	from用于指定查询的表
    	select id,name from mysql.user;
    	'''查询关键字其实有先后执行顺序 但是无需过多在意!!!'''
    
    

    3.2 > 查询关键字之where筛选

       1. 查询id大于等于3 小于等于6的数据

    
    	select * 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);
    
    

    在这里插入图片描述

       3. 查询id小于3或者大于6的数据

    	
    	select * from emp where id not between 3 and 6;
    
    

    在这里插入图片描述

       4. 查询薪资不在20000,18000,17000的数据

    
    	select * from emp where salary not in (20000, 18000, 17000);
    
    

    在这里插入图片描述
       5. 查询岗位描述为空的数据

    	
    	select * from emp where post_comment = null; # 报错
    		'''针对null只能用is 而不能用符号'''
    	select * from emp where post_comment is null;
    
    

    在这里插入图片描述
       6. 查询员工姓名中包含字母o的员工姓名和薪资

    
    	'''
    		当查找信息不准确时 我们统一称为‘模糊查询’
    		使用关键字
    			like: 开启模糊查询关键字
    		
    		关键符号
    			%:匹配任意个数的任意字符
    			_:匹配单个个数的任意字符
    	'''
    
    	select name,salary from emp where name like '%o%';
    
    

    在这里插入图片描述
       7. 查询员工姓名是由四个字符组成的数据

    
    	select * from emp where name like '____';
    	select * from emp where char_length(name)=4;
    
    

    在这里插入图片描述

    3.3 > 查询关键字之group by分组

       什么是分组?

    	
    	按照指定的条件将单个单个的个体组织成一个个整体
    	例如:
    		按照性别分组 按照部门分组 按照年龄分组 按照国家分组...
    
    

       为何需要分组?

    
    	分组的好处在于可以快速统计出某些数据
    	eg:
    		最大薪资 平均年龄 最小年龄 总人数 ...
    
    

       如何分组?

    	
    	'''按照部门分组 '''
    	select * from emp group by post;	# 5.7及以上版本会直接报错	
    	
    	'''
    		mysql5.7及以上版本默认自带sql_mode=only_full_group_by
    		该模式要求分组之后默认只可以直接获取分组的依据不能直接获取其他字段
    
    		原因是分组的目的就是按照分组的条件来管理诸多数据 
    		最小单位应该是分组的依据而不是单个单个的数据
    
    		如果是MySQL5.6及以下版本 需要自己手动添加
    		可以直接在配置文件里面直接改方便不然需要将之前写的所有配置再写一遍
    		set global sql_mode = only_full_group_by......
    	'''
    	# 所以真确的写法是下面这种
    	select post from emp group by post;
    

    在这里插入图片描述

    3.4 > 聚合函数

       聚合函数是专门用于分组之后的数据统计。

    
    	max				统计最大值
    	min				统计最小值
    	sum				统计求和
    	count			统计计数
    	avg				统计平均值
    	
    ps:是否需要分组 我们可以在题目或者需求中发现
    

       1 > 统计每个部门的最高薪资

    
    	select post,max(salary) from emp group by post;
    
    

    在这里插入图片描述
       2 > 统计每个部门的平均薪资

    
    	select post,avg(salary) from emp group by post;
    
    

    在这里插入图片描述
       3 > 统计每个部门的员工人数

    
    	select post,count(id) from emp group by post
    
    

    在这里插入图片描述
       4 > 统计每个部门的月工资开销

    
    	select post,sum(salary) from emp group by post;
    
    

    在这里插入图片描述
       5 > 统计每个部门最小的年龄数

    
    	select post,min(age) from emp group by post;
    
    

    在这里插入图片描述

    3.5 > 间接获取分组以外其他字段的数据

       1 > 统计每个部门下所有员工的姓名

    
    	select post,group_concat(name) from emp group by post;
    
    

    在这里插入图片描述
       2 > 统计每个部门下所有员工的姓名和年龄

    
    	select post,group_concat(name, age) from emp group by post;
    
    

    在这里插入图片描述
       3 > 给字段起别名

    
    	select post,group_concat(name) as '姓名' from group by post;
    	'''
    		也可以不写as关键字 但是语义不明确 建议还是加上
    		select post,id '序列',name '姓名' from emp; 
    	'''
    

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Mysql主键外键操作

    2021-01-19 04:53:19
    外键:·一对多·多对多·一对一·修改表·复制表主键:rimary key auto_increment(primary key是主键通常和auto_increment自动增加混合使用)把所有数据存放到一张表中的弊端:组织结构不清晰浪费硬盘空间扩展性差一...
  • MySQL 外键使用

    2021-02-08 13:22:41
    MySQL 外键使用外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但...
  • 其实互联网职业可以大致分两个阶段,在毕业后的3到5年内主要都是以学习、积累为主,从一开始啥都不懂的校园“新鲜人”向...5、数据库,Redis、ES、MySQL、分库分表 分享一下我的学习之路 2017从杭州师范大学(也是马云
  • 主键是本张表的主键,是唯一且非空的,而外键是另一张表中与这张表的某个字段的类型,字段名相同的字段,一般是用作关联两张或两张以上的数据表时用的。以下面三张表为例:有三张表,一张表是读者信息,有一个属性为...
  • 主要介绍了详解MySQL中的外键约束问题,针对在MySQL中使用InnoDB表的情况,需要的朋友可以参考下
  • 环境:MySQL 5.7问题:之前为这个终生图书馆小项目设计了几张表User,HaveRead,SignIn,Book,BookLabel,BookPlan,结果昨晚发现如果User表用户变化(比如删除...在重新创建这些表以及构建外键关系的时候,MySQL报了这样...
  • Mysql中取消外键约束

    千次阅读 2018-10-03 10:00:42
    Mysql中取消外键约束 ** Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。 解决方法是在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sql语句,重新创建此表后,再把...
  • 通过给mysql的表字段添加外键约束,可以有效的保持数据的一致性和完整性,数据就不会很容易出问题。1、创建表时直接创建外键约束create table books(bookid number(10) not null primary key,bookName varchar2(20) ...
  • mysql怎么增加外键

    2021-01-30 06:05:54
    mysql增加外键的方法:1、在CREATE TABLE语句中,通过FOREIGN KEY关键字来添加外键;2、在ALTER TABLE语句中,通过ADD和FOREIGN KEY关键字来添加外键MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键...
  • 外键

    2021-03-03 20:16:08
    如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。...
  • 今儿继续再看老师给推荐的深入浅出mysql数据库开发这本书,看到innodb数据库的外键关联问题时,遇到了一个问题,上写的是可以对父表进行修改,从而同步到子表的外键上去,可是自己的实验却是没有能够。 代码如下:...
  • mysql外键关联问题

    2021-02-02 07:15:00
    今儿继续再看老师给推荐的深入浅出mysql开发这本书,看到innodb数据库的外键关联问题时,遇到了一个问题,上写的是可以对父表进行修改,从而同步到子表的外键上去,可是自己的实验却是没有能够。 show create ...
  • 外键,索引,主键和索引区别于联系
  • 外键的插入或者更新不能插入或更新主键表中没有的值,切记删除主键表中的数据时,要先去外键表中接触关系,也可以在建立外键时设置好更新或者删除的外键表中的数据是否更改。设置外键的语法:CONS...
  • 外键前戏之一对多关系# 定义一张部门员工表id name gender dep_name dep_desc1 jason male 教学部 教书育人2 egon male 外交部 ...
  • 目录 1.前言 2.表与表关系 1.一对多关系 2.多对多关系: 3.一对一关系 ... 在MySQL的关系中没有多对一一说 一对多 多对一 都叫一对多!!! 多对多关系 一对一关系 没有关系 2.表与..
  • 我这里设置mysql外键关联多对多的情况,设置中间表时为什么我创建外键时出错,出现 出现该错误,请教大家,感谢 CREATE DATABASE IF NOT EXISTS longcaiuserbook DEFAULT CHARSET utf8 DEFAULT COLLATE utf8_bin;...
  • 还有十五分钟图书馆关闭,赶紧来把今天的关于MySQL外键修改的内容记录一下。 背景: 在写作业的时候必要的建立了两个数据表。 users表和records表修改前如下所示: 可以看出开始的情况是: records的user_id是外键...
  • MySQL外键约束的使用

    2021-01-21 14:11:24
    软件工程试验二中要求建立如下数据库:使用MySQL建立一个“图书数据库“ BookDB,包含两张表:– Book {ISBN (PK), Title, AuthorID (FK), Publisher, PublishDate, Price}– Author {AuthorID (PK), Name, Age, ...
  • 今日重点:外键一对多多对多一对一------------------------------------------------------------------------------------------------------------------------------------------------------------------------...
  • 8.20MySQL(三)外键

    2021-01-19 09:07:32
    一、外键前戏1.定义一张部门员工表2.把所有数据都存放于一张表的弊端1.表的结构不清晰2.浪费硬盘空间3.表的扩展性极差(无法忽略的缺点)3.上述的弊端产生原因类似于把代码全部写在一个py文件中,你应该怎么做?解耦合...
  • 本文实例讲述了mysql外键的三种关系。分享给大家供大家参考,具体如下:因为有foreign key的约束,使得两张表形成了三种了关系:多对一多对多一对一一对多或多对一多对一create table press(id int primary key auto...
  • mysql如何添加一个表的外键1:创建一个父表,主键作为子表的外键:create table province(pId int primary key auto_increment,pName varchar(20));2:创建子表,外键是父表的主键:create table user(userId int ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,733
精华内容 7,093
关键字:

mysql书外键

mysql 订阅