MYSQL的重要知识概述(进阶篇)

1、数据完整性

2、多表查询

3、补充

4、数据库优化

5、MySQL的安装与下载

6、习题演练


整理仓促,文章中有任何问题,敬请提出,感谢支持,让我们共同进步吧!

MYSQL的相关知识概述,共分基础篇、进阶篇和高级篇!

1、数据完整性

(1)数据库的完整性

用来保证存放到数据库中的数据是有效的 , 即数据的有效性和准确性,确保数据的完整性 = 在创建表时给表中添加约束
完整性的分类:
- 实体完整性 ( 行完整性 ):
- 域完整性 ( 列完整性 ):
- 引用完整性 ( 关联表完整性 ):
主键约束: primary key
唯一约束: unique [key]
非空约束: not null
默认约束: default
自动增长: auto_increment
外键约束 : foreign key
建议这些约束应该在创建表的时候设置,多个约束条件之间使用空格间隔

(2)实体完整性

实体:即表中的一行 ( 一条记录 ) 代表一个实体( entity
实体完整性的作用:标识每一行数据不重复。
约束类型:
主键约束
唯一约束
自动增长列
 

(3)域完整性

域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较
域代表当前单元格
域完整性约束:数据类型 非空约束( not null ) 默认值约束 (default)
check 约束( mysql 不支持) check(sex=' ' or sex=' ')

(4)引用完整性

引用完整性又叫 参照完整性
外键约束: FOREIGN KEY

2、多表查询

(1)关系

一对多/多对一关系

多对多关系

一对一关系

(2)语法

1. 合并结果集 :UNION UNION ALL
2. 连接查询
2.1 内连接 [INNER] JOIN ON
2.2 外连接 OUTER JOIN ON
- 左外连接 LEFT [OUTER] JOIN
- 右外连接 RIGHT [OUTER] JOIN
- 全外连接( MySQL 不支持) FULL JOIN
2.3 自然连接 NATURAL JOIN
3. 子查询

 

3、补充

(1)多行新增

insert into 表名 ( 列名 ) values ( 列值 ),( 列值 ),( 列值 )

(2)多表更新

(1)update 1, 2 set 列名 = 列值 where 1. 列名 = 2. 列名 and 其他限定条件
(2)update 1
inner join 2 on 1. 列名 = 2. 列名
set 列名 = 列值
where 限定条件

(3)多表删除

delete 被删除数据的表 from 删除操作中使用的表
where 限定条件
: 多张表之间使用逗号间隔

(4)日期运算函数

now() 获得当前系统时间
year( 日期值 ) 获得日期值中的年份
date_add( 日期 ,interval 计算值 计算的字段 );
注:计算值大于 0 表示往后推日期,小于 0 表示往前推日期

4、数据库优化

1. 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where order by 涉及的列上建立索引。
2. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。最好不要给数据库留 NULL ,尽可能的使用 NOT NULL 填充数据库 备注、描述、评论之类的可以设置为 NULL ,其他的,最好不要使用 NULL
3. 应尽量避免在 where 子句中使用 != <> 操作符,否则引擎将放弃使用索引而进行全表扫描。
4. 应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。

5、MySQL的安装与下载

https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.28-winx64.zip

6、习题演练

题目

数据表:
雇员表(employee):雇员编号(empid,主键),姓名(name),性别
(sex),职称(title),出生日期(birthday),所属部门(depid)
部门(department):部门编号(depid,主键),部门名称(depname)
工资表(salary):雇员编号(empid),基本工资(basesalary),职务工
资(titlesalary),扣除(deduction)

需求

DDL语句

employee:

CREATE TABLE `employee` (
  `empid` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `sex` varchar(2) COLLATE utf8_bin DEFAULT NULL,
  `title` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `birthday` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `depid` int(11) DEFAULT NULL,
  PRIMARY KEY (`empid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

department:

CREATE TABLE `department` (
  `depid` int(20) NOT NULL,
  `depname` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`depid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

salary:

CREATE TABLE `salary` (
  `empid` int(20) NOT NULL,
  `basesalary` decimal(10,2) DEFAULT NULL,
  `titlesalary` decimal(10,2) DEFAULT NULL,
  `deduction` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`empid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

1. 修改表结构,在部门表中添加部门简介字段
ALTER TABLE department ADD departdesc VARCHAR(50);
2. 将李四的职称改为“工程师”,并将她的基本工资改成 2000,职务工资为 700
UPDATE employee e INNER JOIN salary s ON e.empid=s.empid SET e.title='工程师' ,s.basesalary=2000,s.titilsaraly=700 WHERE e.name='李四';
3. 删除人事部门的部门记录
DELETE FROM department WHERE depname='人事部';
4. 查询出每个雇员的雇员编号,实发工资,应发工资
SELECT empid,basesalary+titilsaraly-deduction AS '实发工资',basesalary+titilsaraly AS '应发工资' FROM salary;
5. 查询姓张且年龄小于 40 的员工记录
SELECT * FROM employee WHERE LIKE '张%' AND `DATABASE`(NOW(),`INTERVAL -40 YEAR)<birthday;
6. 查询雇员的雇员编号,姓名,职称,部门名称,实发工资
SELECT empid,name,title,depid,basesalary+titilsaraly-deduction AS '实发工资' FROM salary
7. 查询销售部门的雇员姓名,工资
SELECT e.name,e.basesalary,e.titilsaraly,e.deduction from employee e,department d,salary s WHERE w,empid=s.empid and w.empid=d.dename='销售部';
8. 统计各职称的人数
SELECT title,COUNT(*) FROM employee GROUP BY title;
9. 统计各部门的部门名称,实发工资总和,平均工资
SELECT dename,sum(s.basesalary+s.titilsaraly-s.deduction),AVG([DISTINCT] s.basesalary+s.titilsaraly-s.deduction) FROM employee e,department d,salary s WHERE
e.empid=s.empid AND d.empid=e.empid GROUP BY depname;
10. 查询比销售部门所有员工基本工资都高的雇员姓名
SELECT name,e.basesalaryfrom employee e,salary s WHERE e.empid=s.empid AND e.empid=s,empid AND e.basesalary>(SELECT MAX(basesalary) FROM employee e,salary s
department d WHERE e.empid=s.empid AND d,empid=e.empid AND d.department='销售部');


进阶篇结束!!

猜你喜欢

转载自blog.csdn.net/qinluyu111/article/details/123019947