MySQL环境配置(mysql有下载包)

MySQL数据库表的基础操作(增删改查)—讲解一

MySQL数据库表的模糊/多行/分组/排序/分页查询以及字mysql数据类型的讲解—讲解二

MySQL字段约束及多表查询—讲解三

文章目录

  • 7 mysql的字段约束
    • 7.1 主键约束
    • 7.2 非空约束
    • 7.3 唯一约束
    • 7.4 外键约束
  • 8 表关系
  • 多表查询
    • 9.1 连接查询
    • 9.2左外连接查询
    • 9.3右外连接查询
    • 9.4子查询
    • 9.5 多表查询
    • 在sql语句中where和having的区别

7 mysql的字段约束

7.1 主键约束

主键约束:如果为一个列添加了主键约束,那么这个列就是主键,主键的特点是唯一且不能为空。
主键的作用是: 唯一的标识一条表记录(就像身份证号用于唯一的表示一个人一样)
添加主键约束,例如将id设置为主键:
(通常一张表中会有一个主键)

create table stu(id int primary key auto_increment,);

关于主键自增:

(1)设置了主键自增后, 再往表中插入记录,就可以不用给主键赋值,直接插入一个null值即可
(2)设置了主键自增后, 也可以为id赋值,只要赋的值与已有的id值不冲突即可! 在底层会将auto_increment变量的值和插入的id值进行比较, 如果插入的值较大, 将会将插入的值加1后赋值给auto_increment变量

7.2 非空约束

非空约束:如果为一个列添加了非空约束,那么这个列的值就不能为空,但可以重复。
添加非空约束,例如为password添加非空约束:

create table user(password varchar(50) not null,...
);

7.3 唯一约束

唯一约束:如果为一个列添加了唯一约束,那么这个列的值就必须是唯一的(即不能重复),但可以为空。
添加唯一约束,例如为username添加唯一约束及非空约束:

create table user(username varchar(50) unique not null,...
);

7.4 外键约束

设置外键和不设置外键有什么区别?
如果不设置外键,两张表之间的对应关系就只有开发人员自己知道,数据库本身是不知道的,数据库不知道两张表存在对应关系,就不会帮我们维护这段关系。只有开发人员自己来维护。

如果设置了外键,就等同于通知数据库两张表(dept和emp)存在一定的对应关系(emp表中的dept_id列要严格参考dept表中的主键(id)),数据库知道并且会帮我们维护这段关系。

create table dept(id int,name varchar(50)...
);create table emp(id int,name varchar(50),dept_id int,foreign key(dept_id) references dept(id)
);

8 表关系

常见的表关系有:
一对多(多对一)、一对一、多对多

总结:

一对多(多对一):在多的一方添加列(员工和部门)保存一的一方的主键作为外键,从而保存两张表之间的对应关系

一对一:在任意一张表中添加列保存另一方的主键作为外键,从而保存两张表之间的对应关系

多对多:不能在任意一方添加列保存另一方的主键。此时可以创建一张第三方的表,分别保存两张表的主键作为外键,从而保存多对多的对应关系。

多表查询

将db30库中的数据导入数据库

-- -----------------------------------
-- 创建db30库、dept表、emp表并插入记录
-- ------------------------------------- 删除db30库(如果存在)
drop database if exists db30;
-- 重新创建db30库
create database db30 charset utf8;
-- 选择db30库
use db30;-- 删除部门表, 如果存在
drop table if exists dept;
-- 重新创建部门表, 要求id, name字段
create table dept(id int primary key auto_increment,    -- 部门编号name varchar(20)                 -- 部门名称
);
-- 往部门表中插入记录
insert into dept values(null, '财务部');
insert into dept values(null, '人事部');
insert into dept values(null, '科技部');
insert into dept values(null, '销售部');-- 删除员工表, 如果存在
drop table if exists emp;
-- 创建员工表(员工编号、员工姓名、所在部门编号)
create table emp(id int primary key auto_increment, -- 员工编号name varchar(20),                    -- 员工姓名dept_id int                          -- 部门编号
);
-- 往员工表中插入记录
insert into emp values(null, '张三', 1);
insert into emp values(null, '李四', 2);
insert into emp values(null, '老王', 3);
insert into emp values(null, '赵六', 5);

9.1 连接查询

–42.查询部门和部门对应的员工信息

select * from dept, emp;
上面的查询叫做笛卡尔积查询:如果同时查询两张表,其中一张表有m条数据,另外一张表有n条数据,笛卡尔积查询的结果是 m*n 条
笛卡尔积查询的结果中有大量错误数据,我们通常不会直接使用。
但可以通过where子句、条件剔除错误数据,保留正确数据。
正确代码:

select * from dept, emp where dept.id=emp.dept_id;

9.2左外连接查询

-- 43.查询所有部门和部门下的员工,如果部门下没有员工,员工显示为null
select * from dept left join emp on dept.id=emp.dept_id;


左外连接查询:会将左边表中的所有记录都查询出来,右边表只显示和左边表对应的数据,如果左边表在右边没有对应数据,可以对应null值。

-- 也可以使用右外连接实现上面的查询
select * from emp right join dept on emp.dept_id=dept.id;

9.3右外连接查询

-- 44.查询部门和所有员工,如果员工没有所属部门,部门显示为null
select * from dept right join emp on dept.id=emp.dept_id;


右外连接查询:会将右边表中的所有记录都查询出来,左边表只显示和右边表对应的数据,如果右边表在左边没有对应数据,可以对应null值。

-- 也可以使用左外连接实现上面的查询:
select * from emp left join dept on dept.id=emp.dept_id;-- 查询所有的部门和对应的所有员工(既要显示所有部门,也要显示所有员工)
select * from emp full join dept on dept.id=emp.dept_id;mysql不支持全外连接查询,但我们可以通过union(联合)查询来模拟:
select * from dept left join emp on dept.id=emp.dept_id
union
select * from dept right join emp on dept.id=emp.dept_id;

9.4子查询

子查询:将一条SQL语句的执行结果,作为另外一条SQL语句的条件进行查询,这样的查询就叫做子查询。
将对db40库导入数据库中

-- -----------------------------------
-- 创建db40库、dept表、emp表并插入记录
-- ------------------------------------- 删除db40库(如果存在)
drop database if exists db40;
-- 重新创建db40库
create database db40 charset utf8;
-- 选择db40库
use db40;-- 创建部门表
create table dept(              -- 创建部门表id int primary key,         -- 部门编号name varchar(50),            -- 部门名称loc varchar(50)              -- 部门位置
);-- 创建员工表
create table emp(               -- 创建员工表id int primary key,         -- 员工编号name varchar(50),            -- 员工姓名job varchar(50),         -- 职位topid int,                 -- 直属上级hdate date,                  -- 受雇日期sal int,                 -- 薪资bonus int,                 -- 奖金dept_id int,               -- 所在部门编号foreign key(dept_id) references dept(id)
);-- 往部门表中插入记录
insert into dept values ('10', '财务部', '北京');
insert into dept values ('20', '设计部', '上海');
insert into dept values ('30', '技术部', '广州');
insert into dept values ('40', '销售部', '深圳');-- 往员工表中插入记录
insert into emp values ('1001', '王富国', '办事员', '1007', '1980-12-17', '800', 500, '20');
insert into emp values ('1003', '齐帅', '分析员', '1011', '1981-02-20', '1900', '300', '10');
insert into emp values ('1005', '王浪', '推销员', '1011', '1981-02-22', '2450', '600', '10');
insert into emp values ('1007', '冯松', '经理', '1017', '1981-04-02', '3675', 700, '20');
insert into emp values ('1009', '李政', '推销员', '1011', '1981-09-28', '1250', '1400', '10');
insert into emp values ('1011', '陈要', '经理', '1017', '1981-05-01', '3450', 400, '10');
insert into emp values ('1013', '张勇', '办事员', '1011', '1981-06-09', '1250', 800, '10');
insert into emp values ('1015', '程德祖', '分析员', '1007', '1987-04-19', '3000', 1000, '20');
insert into emp values ('1017', '韩悦', '董事长', null, '1981-11-17', '5000', null, null);
insert into emp values ('1019', '刘笑', '推销员', '1011', '1981-09-08', '1500', 500, '10');
insert into emp values ('1021', '范冰冰', '办事员', '1007', '1987-05-23', '1100', 1000, '20');
insert into emp values ('1023', '赵子龙', '经理', '1017', '1981-12-03', '950', null, '30');
insert into emp values ('1025', '雪雅', '分析员', '1023', '1981-12-03', '3000', 600, '30');
insert into emp values ('1027', '张大胆', '办事员', '1023', '1982-01-23', '1300', 400, '30');

– 45.列出薪资比’刘笑’薪资高的所有员工,显示姓名、薪资

-- 查询'刘笑'的薪资
select sal from emp where name='刘笑';-- 查询薪资比'刘笑'薪资高的所有员工
select name, sal from emp
where sal > (select sal from emp where name='刘笑');

– 46.列出与’雪雅’从事相同职位的所有员工,显示姓名、职位。

-- 求出雪雅的职位
select job from emp where name='雪雅';-- 求与'雪雅'从事相同职位的员工
select name, job from emp
where job=(select job from emp where name='雪雅');

– 47.列出薪资比’技术部’部门(已知部门编号为30)所有员工薪资都高的员工信息,显示员工姓名、薪资和部门名称。

-- 求技术部门的最高薪资
select max(sal) from emp where dept_id=30;-- 连接查询员工表和部门表
select emp.name,sal,dept.name from emp, dept
where emp.dept_id=dept.id
and sal>(select max(sal) from emp where dept_id=30); -- 不准确
---------------------------------------------------------
select emp.name,sal,dept.name from emp left join dept
on emp.dept_id=dept.id
where sal>(select max(sal) from emp where dept_id=30);

9.5 多表查询

– 48.列出在’设计部’任职的员工,假定不知道’设计部’的部门编号, 显示部门名称,员工名称

-- 关联查询两张表
select dept.name, emp.name from emp,dept
where dept.id=emp.dept_id;-- 求出在培优部的员工
select dept.name, emp.name from emp,dept
where dept.id=emp.dept_id and dept.name='设计部';

– 49.(自查询)列出所有员工及其直接上级,显示员工姓名、上级编号,上级姓名

/* 将emp表既看作员工表, 也看做上级表 e1(员工表) e2(上级表)查询的列: e1.name, e2.id, e2.name查询的表: emp e1,emp e2连接条件: e1.topid=e2.id
*/select e1.name, e2.id, e2.name
from emp e1,emp e2
where e1.topid=e2.id;select e1.name, e2.id, e2.name
from emp e1 left join emp e2
on e1.topid=e2.id; -- 左外,查询所有员工及对应上级

– 50.列出最低薪资大于1500的各种职位,显示职位和该职位最低薪资

-- 求出每种职位的最低薪资分别是多少
select job,min(sal) from emp group by job;-- 求出最低薪资大于1500的职位
select job,min(sal) from emp group by job having min(sal)>1500;
-- 在分组之前过滤使用where,在分组之后过滤使用having

– 51.列出在每个部门就职的员工数量、平均工资。显示部门编号、员工数量,平均薪资。

-- 对员工表按照部门分组(部门相同的员工为一组)
select dept_id 部门编号, count(*) 部门人数, avg(sal) 平均薪资
from emp group by dept_id;

– 52.查出至少有一个员工的部门,显示部门编号、部门名称、部门位置、部门人数。

-- 连接查询部门表和员工表
select d.id, d.name, d.loc from dept d, emp e
where emp.dept_id=dept.id;-- 按照部门进行分组,统计每个部门的人数
select d.id, d.name, d.loc, count(*)
from dept d, emp e
where e.dept_id=d.id
group by d.name;

– 53.列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。

/*
查询的列:e1.id, e1.name, d.name
查询的表:emp e1(员工表),dept d(部门表) emp e2(上级表)
连接条件:e1.dept_id=d.id, e1.topid=e2.id
筛选条件:e1.hdate<e2.hdate*/select e1.id, e1.name, d.name
from emp e1,dept d,emp e2
where e1.dept_id=d.id and e1.topid=e2.id
and e1.hdate<e2.hdate;

– 54.列出每个部门薪资最高的员工信息,显示部门编号、最高薪资、员工姓名

-- 求出每个部门的最高薪资,显示部门编号和最高薪资
select dept_id,max(sal) from emp group by dept_id;-- 将上面的查询结果作为一张表 和 emp 表进行连接查询
select  e.dept_id dept_id, t.max_sal sal, e.name name
from emp e, (select dept_id,max(sal) max_sal from emp group by dept_id) t
where e.sal=t.max_sal and e.dept_id=t.dept_id;-- 查询没有部门的员工的最高信息,显示部门编号,最高薪资,员工姓名
select dept_id,sal,name from emp where
sal=(select max(sal) from emp where dept_id is null)
and dept_id is null;select  e.dept_id dept_id, t.max_sal sal, e.name name
from emp e, (select dept_id,max(sal) max_sal from emp group by dept_id) t
where e.sal=t.max_sal and e.dept_id=t.dept_id
union
select dept_id,sal,name from emp where
sal=(select max(sal) from emp where dept_id is null)
and dept_id is null;

在sql语句中where和having的区别

相同点:where和having都用于对表中的记录进行筛选过滤

不同点:
(1)where是在分组之前,对表中的记录进行筛选过滤。并且where中不能使用列别名(但可以使用表别名),也不能使用多行函数(count/max/min/sum/avg)
(2)having是在分组之后,对表中的记录进行筛选过滤,having中可以使用列别名、表别名、多行函数。
(3)通常情况,having可以替代where,但反过来不行(但有些情况下不能替换:在分组之前需要对记录进行过滤,分组之后还需要对数据进行过滤,此时不能使用having替换where)

MySQL字段约束及多表查询---讲解三相关推荐

  1. MySQL的约束、多表查询、子查询

    一.约束之主键约束 约束:约束是添加在列上的,用来约束列的. 1.主键约束(唯一标识):非空.唯一.被引用 当表的某一列被指定为主键后,该类就不能为空,不能有重复值出现 创建表时指定主键的两种方式: ...

  2. MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物

    MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...

  3. 【 mysql基础(三)】约束和多表查询

    目录 1. 约束 1.1 概述 1.2 约束演示 1.3 外键约束 2. 多表查询 2.1 多表关系 2.2 多表查询概述 2.4 外连接 2.5 自连接 2.5.1 自连接查询 5.5.2 联合查询 ...

  4. MySQL学习思维导图(MySQL简介、SQL基础命令、约束、单表查询、多表查询、内置函数、存储过程、视图、事务、索引)

    MySQL学习思维导图 内容包括:MySQL简介.SQL基础命令.约束.单表查询.多表查询.内置函数.存储过程.视图.事务.索引 文章目录 MySQL学习思维导图 一.MySQL简介 二.SQL基础命 ...

  5. SQL中的外键约束及多表查询

    SQL中的外键约束及多表查询 外键约束 foreign key 实体:数据库中的表,就可以看作一个实体,实体和实体之间有一些关系 比如说做一个网上商城的项目,里面有用户表,商品表,订单表 一对多的关系 ...

  6. MySQL数据库中的多表查询含义以及练习~建议码友们点亮拇指+收藏呐~

    MySQL数据库中的多表查询含义以及练习 一. 多表查询含义 二. 多表查询练习 1. 已知表 2. 需求And代码 一. 多表查询含义 查询语法: select列名列表from表名列表where条件 ...

  7. 小汤学编程之MySQL(三)——约束、多表查询、事务和数据库其他操作

    一.约束 1.主键约束     2.自动增长     3.非空约束     4.唯一约束     5.默认约束     6.外键约束     7.级联删除和级联更新     8.null删除和null ...

  8. mysql字段约束_mysql数据库之表操作及字段约束条件

    一.存储引擎 二.表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id name age sex 1 li 12 male 2 liu ...

  9. Mysql(软件安装、Mysql基本语法、Mysql数据操作、Mysql关键字、约束、多表查询、Mysql多表查询、数据备份、数据导入、视图)

    1.MySQL介绍 1.1数据库介绍 数据库概念 数据库就是用于存储数据的一个空间 数据存储方式的发展史 甲骨文(材料太昂贵) 竹简(太沉了,运输不方便) 纸(易损坏) 计算机(办公软件,传输不方便) ...

最新文章

  1. 假如时光倒流,你依然会变成现在的你
  2. matlab 定义矩阵_MATLAB与Python,Mathematica由高维转化一维矩阵的方式的不同
  3. 安装 mysql-8.0.23-winx64
  4. 实现SQL SERVER 下的PadLeft函数
  5. 一套高可用、易伸缩、高并发的IM群聊架构方案设计实践
  6. STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决
  7. linux+删除乱码的文件,linux 下删除乱码文件-乾颐堂
  8. 张凯江:架构能力-“构建”世界的能力
  9. 北京一Model 3失控冲向公交站台,特斯拉调查后回应......
  10. [转载] Python元组操作及方法总结
  11. ubuntu终端颜色配置
  12. 解决java.lang.IndexOutOfBoundsException: Index: 0, Size: 0的问题
  13. 无限纷争怎么看以前的服务器,无限纷争怎么切换角色 无限纷争切换角色方法...
  14. 三相电流滞环跟踪PWM控制
  15. 安装lux:推荐一款网页视频下载工具。并简单使用。(win)
  16. 地理信息安全在线培训考试系统题库-必对题
  17. 【FPGA创新设计竞赛——2022紫光同创杯】1、“基于 RISC-V 处理器的软硬件系统设计”赛题介绍
  18. e-r数据建模-概念模型 逻辑模型 物理模型-总结
  19. 【网络爬虫项目】实战知识点 - webcrawler
  20. 20个免费webservice接口

热门文章

  1. Mybatis 报错Mapper method ‘xxx‘ has an unsupported return type,解决办法
  2. 用户需求和产品需求的采集、分析、筛选和管理
  3. 封装python函数判断成绩等级_封的解释|封的意思|汉典“封”字的基本解释
  4. 中文数字转换成阿拉伯数字(一千二百三十四万五千六百七十八-->12345678)
  5. 我的世界服务器的自动门怎么做,我的世界自动门怎么做
  6. 手机本地文档文件不能扫描出来的问题
  7. ZBLOG即时聊天(客服)插件v1.3.2版本下载,强大的在线客服系统源码
  8. 使用pycharm + kivy开发自己的app
  9. 树莓派3B+(无显示器)实现串口登录
  10. linux yield_带你通俗易懂的了解——Linux线程模型和线程切换