首页 > 数据库 >MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】

MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】

时间:2023-08-09 20:32:53浏览次数:51  
标签:salary dept did 数据库 视图 查询 person MySQL select

一.多表联合查询

 创建表和数据

#多表查询语法
select  字段1,字段2... from 表1,表2... [where 条件]


注意: 如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为 笛卡尔乘积

#查询人员和部门所有信息
select * from person,dept 


笛卡尔乘积公式 : A表中数据条数   *  B表中数据条数  = 笛卡尔乘积.

MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】_存储过程

 笛卡尔乘积示例

 

#查询人员和部门所有信息
select * from person,dept where person.dept_id = dept.did;
 
#注意: 多表查询时,一定要找到两个表中相互关联的字段,并且作为条件使用


select * from person,dept where person.did = dept.did;

 

MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】_数据_02

二 多表连接查询

#多表连接查询语法(重点)
SELECT 字段列表
FROM 表1  INNER|LEFT|RIGHT JOIN  表2
ON 表1.字段 = 表2.字段;


  

1 内连接查询 (只显示符合条件的数据)

#查询人员和部门所有信息
select * from person inner join dept  on person.did =dept.did;


 效果: 大家可能会发现, 内连接查询与多表联合查询的效果是一样的.

MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】_数据_03

select * from person inner join  dept  on  person.did =dept.did;

 

2 左外连接查询 (左边表中的数据优先全部显示)

#查询人员和部门所有信息
select * from person left join  dept  on  person.did =dept.did;

 效果:人员表中的数据全部都显示,而 部门表中的数据符合条件的才会显示,不符合条件的会以 null 进行填充.

MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】_存储过程_04

 

select * from person left join  dept  on  person.did =dept.did;

3 右外连接查询 (右边表中的数据优先全部显示)

#查询人员和部门所有信息
select * from person right join  dept  on  person.did =dept.did;

 效果:正好与[左外连接相反]

select * from person right join  dept  on  person.did =dept.did;

 

4 全连接查询(显示左右表中全部数据)

  全连接查询:是在内连接的基础上增加 左右两边没有显示的数据
  注意: mysql并不支持全连接 full JOIN 关键字
  注意: 但是mysql 提供了 UNION 关键字.使用 UNION 可以间接实现 full JOIN 功能

#查询人员和部门的所有数据
 
SELECT * FROM person LEFT JOIN dept ON person.did = dept.did
UNION
SELECT * FROM person RIGHT JOIN dept ON person.did = dept.did;


SELECT * FROM person LEFT JOIN dept ON person.did = dept.did
                UNION 
            SELECT * FROM person RIGHT JOIN dept ON person.did = dept.did;
注意: UNION 和 UNION ALL 的区别:UNION 会去掉重复的数据,而 UNION ALL 则直接显示结果

 

MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】_存储过程_05

三 复杂条件多表查询 

1. 查询出 教学部 年龄大于20岁,并且工资小于40000的员工,按工资倒序排列.(要求:分别使用多表联合查询和内连接查询)

#1.多表联合查询方式:
select * from person where did =(select did from dept where dname ='教学部') 
    and  age>20 
    and salary <40000 
ORDER BY salary DESC;

#2.内连接查询方式:
SELECT * FROM person p1 INNER JOIN dept d2 ON p1.did= d2.did 
    and d2.dname='教学部' 
    and  age>20 
    and salary <40000 
ORDER BY salary DESC;

2.查询每个部门中最高工资和最低工资是多少,显示部门名称

select MAX(salary),MIN(salary),dept.dname from 
        person LEFT JOIN dept
            ON person.did = dept.did
 GROUP BY person.did;

四 子语句查询   

子查询(嵌套查询): 查多次, 多个select

注意: 第一次的查询结果可以作为第二次的查询的 条件 或者 表名 使用.

子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字. 还可以包含比较运算符:= 、 !=、> 、<等.

 1.作为表名使用

select * from (select * from person) as 表名(起别名,不能带引号);
 
ps:大家需要注意的是: 一条语句中可以有多个这样的子查询,在执行时,最里层括号(sql语句)
具有优先执行权.<br>注意: as 后面的表名称不能加引号('')


 2.求最大工资那个人的姓名和薪水

1.求最大工资
select max(salary) from person;
2.求最大工资那个人叫什么
select name,salary from person where salary=53000;

合并
select name,salary from person where salary=(select max(salary) from person);

3. 求工资高于所有人员平均工资的人员

1.求平均工资
select avg(salary) from person;

2.工资大于平均工资的 人的姓名、工资
select name,salary from person where salary > 21298.625;

合并
select name,salary from person where salary >(select avg(salary) from person);

4.练习

  1.查询平均年龄在20岁以上的部门名

  2.查询教学部 下的员工信息

  3.查询大于所有人平均工资的人员的姓名与年龄

#1.查询平均年龄在20岁以上的部门名
SELECT * from dept where dept.did in (
    select dept_id from person GROUP BY dept_id HAVING avg(person.age) > 20
);

#2.查询教学部 下的员工信息
select * from person where dept_id = (select did from dept where dname ='教学部');

#3.查询大于所有人平均工资的人员的姓名与年龄
select * from person where salary > (select avg(salary) from person);

5.关键字

 ANY关键字

 ALL关键字

 SOME关键

 EXISTS 关键字

 

五 其他查询

1.临时表查询

   需求:  查询高于本部门平均工资的人员

   解析思路: 1.先查询本部门人员平均工资是多少.

         2.再使用人员的工资与部门的平均工资进行比较

 代码示例

2. 判断查询 IF关键字

 需求1 :根据工资高低,将人员划分为两个级别,分别为 高端人群和低端人群。显示效果:姓名,年龄,性别,工资,级别

 

 代码示例

需求2: 根据工资高低,统计每个部门人员收入情况,划分为 富人,小资,平民,吊丝 四个级别, 要求统计四个级别分别有多少人

MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】_触发器_06

 

#语法一:
SELECT
CASE WHEN STATE = '1' THEN '成功'
WHEN STATE = '2' THEN '失败'
ELSE '其他' END 
FROM 表;
 
#语法二:
SELECT CASE age
WHEN 23 THEN '23岁'
WHEN 27 THEN '27岁'
WHEN 30 THEN '30岁'
ELSE '其他岁' END
FROM person;


 

MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】_存储过程_07

 代码示例

六  SQL逻辑查询语句执行顺序(重点***)

先来一段伪代码,首先你能看懂么?

SELECT DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>

如果你知道每个关键字的意思和作用,并且你还用过的话,那再好不过了。但是,你知道这些语句,它们的执行顺序你清楚么?如果你非常清楚,你就没有必要再浪费时间继续了;如果你不清楚,非常好!!! 请点击我...

 

七 外键约束

1.问题?

  什么是约束:约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性

2.问题?

  以上两个表 person和dept中, 新人员可以没有部门吗?

3.问题?

  新人员可以添加一个不存在的部门吗?

4.如何解决以上问题呢?

  简单的说,就是对两个表的关系进行一些约束 (即: froeign key). 

  foreign key 定义:就是表与表之间的某种约定的关系,由于这种关系的存在,能够让表与表之间的数据,更加的完整,关连性更强。

5.具体操作

    5.1创建表时,同时创建外键约束

CREATE TABLE IF NOT EXISTS dept (
did int not null auto_increment PRIMARY KEY,
dname VARCHAR(50) not null COMMENT '部门名称'
)ENGINE=INNODB DEFAULT charset utf8;
 
CREATE TABLE IF NOT EXISTS person(
id int not null auto_increment PRIMARY KEY,
name VARCHAR(50) not null,
age TINYINT(4) null DEFAULT 0,
sex enum('男','女','人妖') NOT NULL DEFAULT '人妖',
salary decimal(10,2) NULL DEFAULT '250.00',
hire_date date NOT NULL,
dept_id int(11) DEFAULT NULL,
CONSTRAINT fk_did FOREIGN KEY(dept_id) REFERENCES dept(did) -- 添加外键约束
)ENGINE = INNODB DEFAULT charset utf8;


   5.2 已经创建表后,追加外键约束

#添加外键约束
ALTER table person add constraint fk_did FOREIGN key(dept_id) REFERENCES dept(did);
 
#删除外键约束
ALTER TABLE person drop FOREIGN key fk_did;


定义外键的条件:

(1)外键对应的字段数据类型保持一致,且被关联的字段(即references指定的另外一个表的字段),必须保证唯一

(2)所有tables的存储引擎必须是InnoDB类型.

(3)外键的约束4种类型: 1.RESTRICT 2. NO ACTION 3.CASCADE 4.SET NULL

 


标签:salary,dept,did,数据库,视图,查询,person,MySQL,select
From: https://blog.51cto.com/aaronthon/7024970

相关文章

  • 设置Oracle视图查询权限的步骤(oracle视图查询权限)
    设置Oracle视图查询权限的步骤是向用户授予SELECT对设定视图的权限。Oracle提供了两种主要方式来授予用户查询视图的权限,分别是直接授权和使用角色授权。本文将介绍如何正确地设置授权,使用Oracle视图。 首先,要设置Oracle视图查询权限,必须具有包括CREATEVIEW权限和SELECT权限的......
  • MySQL数据表的损坏及容灾解决方案
    引言在互联网应用中,MySQL是最常用的关系型数据库之一。然而,数据表的损坏可能会导致数据丢失或无法正常访问,给业务运营带来严重影响。本文将讨论MySQL数据表容易损坏的情况,并提供相应的容灾解决方案。数据表容易损坏的情况MySQL数据表在以下情况下容易发生损坏:硬件故障:例如磁盘......
  • mysql查询字段中还有中文的数据
    select*fromwgsf where`机构名称` REGEXP'^[\u4e00-\u9fa5]+$';上述SQL语句的含义是在表wgsf中,查询字段机构名称里纯中文的数据;其中[\u4e00-\u9fa5]代表汉字的Unicode编码范围,^和$表示匹配字符串的开头和结尾,可以确保该字段里的数据是纯中文。eg:在wsgf表中查询 机构名......
  • MySQL 中的锁类型及死锁避免策略
    引言在数据库系统中,锁是一种重要的机制,用来管理并发访问数据的方式。在多个并发读写的事务同时操作数据库时,很容易出现资源争用的情况,这就需要使用锁来控制数据的访问权限,保证数据的一致性和完整性。MySQL是一款广泛使用的关系型数据库管理系统,它提供了多种不同的锁类型,用于不同......
  • 何时使用MongoDB而不是MySql
    什么是MySQL和MongoDBMySQL和MongoDB是两个可用于存储和管理数据的数据库管理系统。MySQL是一个关系数据库系统,以结构化表格格式存储数据。相比之下,MongoDB以更灵活的格式将数据存储为JSON文档。两者都提供性能和可扩展性,但它们为不同的应用场景提供了更好的性能。My......
  • 面试博客:MySQL中的访问控制详解
    引言在当今互联网时代,数据安全是每个企业和个人都必须重视的问题。作为最流行的关系型数据库之一,MySQL提供了强大的访问控制功能,以确保只有授权用户可以访问和操作数据库。本文将深入探讨MySQL中的访问控制机制,并提供一个代码示例来帮助读者更好地理解。什么是访问控制?访问控制......
  • MySQL数据库笔记(一)
    第一章数据库概述1、什么是数据库数据库是一种存储并管理数据的软件系统存储:持久化管理:增删改查常用的存储数据的方式:1、Java中的变量:生命周期短,不能实现持久化[内存]2、序列化:管理数据时依赖于Java中的反序列化[硬盘]3、txt,办公软件:没有统一的方式管理数据[硬盘]4......
  • MySQL和Java中的货币字段类型选择
    引言在互联网应用中,处理货币是一项常见的任务。为了确保准确性和精度,我们需要选择适当的字段类型来存储货币数据。本文将讨论在MySQL和Java中记录货币时应选择的字段类型,并提供相应的代码示例。MySQL中的货币字段类型在MySQL中,我们可以使用DECIMAL数据类型来存储货币数据。DECIM......
  • MySQL中的外键(foreign key)
    [转]https://blog.csdn.net/weiguang102/article/details/126409406 版权声明:本文为CSDN博主「知其黑、受其白」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weiguang102/article/details/126409406......
  • mysql主从环境Auto_Position=1下的主备切换
    环境:OS:Centos7mysql:5.7.29 1.停止从服务器slave服务:mysql>stopslave;2.将从服务器切换为主服务器,在从服务器上执行mysql>resetmaster;mysql>resetslaveall; 3.这个时候查看下新主库的gtidmysql>showslavestatus\G;Emptyset(0.00sec)ERROR:Noque......