整理仓促,文章中有任何问题,敬请提出,感谢支持,让我们共同进步吧!
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 ALL2. 连接查询2.1 内连接 [INNER] JOIN ON2.2 外连接 OUTER JOIN ON- 左外连接 LEFT [OUTER] JOIN- 右外连接 RIGHT [OUTER] JOIN- 全外连接( MySQL 不支持) FULL JOIN2.3 自然连接 NATURAL JOIN3. 子查询
3、补充
(1)多行新增
insert into 表名 ( 列名 ) values ( 列值 ),( 列值 ),( 列值 ) ;
(2)多表更新
(1)update 表 1, 表 2 set 列名 = 列值 where 表 1. 列名 = 表 2. 列名 and 其他限定条件(2)update 表 1inner 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;
ALTER TABLE department ADD departdesc VARCHAR(50);
UPDATE employee e INNER JOIN salary s ON e.empid=s.empid SET e.title='工程师' ,s.basesalary=2000,s.titilsaraly=700 WHERE e.name='李四';
DELETE FROM department WHERE depname='人事部';
SELECT empid,basesalary+titilsaraly-deduction AS '实发工资',basesalary+titilsaraly AS '应发工资' FROM salary;
SELECT * FROM employee WHERE LIKE '张%' AND `DATABASE`(NOW(),`INTERVAL -40 YEAR)<birthday;
SELECT empid,name,title,depid,basesalary+titilsaraly-deduction AS '实发工资' FROM salary
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='销售部';
SELECT title,COUNT(*) FROM employee GROUP BY title;
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;
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='销售部');