1.SQL分类
2.SQL-DDL:数据定义语言,用来定义数据库对象(数据库、表、字段)
1.数据库操作
创建数据库:
删除数据库:
修改数据库:
1.修改数据库名称
可以选择创建一个新的数据库并将原来数据库中的表拷贝到新的数据库中进而实现更名操作
2.修改数据库的字符集和排序规则
查询数据库
使用数据库
初始化数据库
2.表操作
创建表
删除表
修改表
查看建表语句
3.SQL-DML(数据操作语言)
1.添加数据
2.删除数据
3.修改数据
注意事项
- UPDATE后只跟一张表,即一次只能修改一张表
- 删除/修改数据 可以配合 连接查询/子查询使用
4.SQL-DQL(数据查询语言)
1.语法:
2.单表查询
1.选择表中的列
2.选择表中的元组(行)
1.条件查询
修正: not is null应为is not null
2.聚合查询(聚合函数)
3.分组查询
注意事项
- 执行顺序:where > 聚合函数 > having
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
4.排序查询(asc升序(默认)/desc降序)
5.分页查询
3.多表连接查询
- 一对多(多对一)
- 多对多
- 一对多
1.内连接查询
2.外连接查询
1.左外连接
2.右外连接
3.全外连接
3.自连接查询
4.联合查询
1.union,union all
2.intersect
3.except
5.子查询
1.概述
2.标量子查询
3.列子查询
-- 查询销售部和市场部的所有员工信息
select * from employee where dept in (select id from dept where name = '销售部' or name = '市场部');
-- 查询比财务部所有人工资都高的员工信息
select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));
-- 查询比研发部任意一人工资高的员工信息
select * from employee where salary > any (select salary from employee where dept = (select id from dept where name = '研发部'));
4.行子查询
-- 查询与xxx1,xxx2的职位和薪资相同的员工
select * from employee where (job, salary) in (select job, salary from employee where name = 'xxx1' or name = 'xxx2');
-- 查询入职日期是2006-01-01之后的员工,及其部门信息
select e., d. from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id;
5.表子查询(派生表查询)
-- 查询与xxx1,xxx2的职位和薪资相同的员工
select * from employee where (job, salary) in (select job, salary from employee where name = 'xxx1' or name = 'xxx2');
-- 查询入职日期是2006-01-01之后的员工,及其部门信息
select e., d. from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id;
5.SQL-DCL(数据控制语言)
创建用户
注意事项
- 主机名可以使用%通配
权限控制
注意事项
- 多个权限用逗号分隔
- 授权时,数据库名和表名可以用*进行通配,代表所有
6.函数
- 字符串函数
- 数值函数
- 日期函数
- 流程函数
字符串函数
数值函数
日期函数
流程函数
select
name,
(case when age > 30 then '中年' else '青年' end)
from employee;
select
name,
(case workaddress when '北京市' then '一线城市' when '上海市' then '一线城市' else '二线城市' end) as '工作地址'
from employee;
7.约束
常用约束
外键约束
添加删除外键
删除/更新行为
8.事务
事务操作
四大特性ACID
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
- 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
并发事务
9.MySQL数据类型
数值类型
1.严格数据类型
- integer (同义词int)
- smallint
- decimal (同义词dec)
- numeric
2.近似数值数据类型
- float (同义词real)
- real (同义词float)
- double precision(同义词double)
3.整数类型的存储和范围
4.日期和时间类型
- datetime
- date
- timestamp
- time
- year
5.字符串类型
- char
- varchar
- binary
- varbinary
- blob
- text
- enum
- set
注意:char(n)和varchar(n)括号中n代表字符的个数,并不代表字节个数,比如char(30)就可以存储30个字符
- char和varchar类型类似,但他们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
- binary和varbinary类似于char和varchar,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
- blob是一个二进制大对象,可以容纳可变数量的数据。有4种blob类型:tinyblob、blob、mediumblob和longblob。他们区别在于可容纳存储范围不同。
- 有4种text类型:tinytext、text、mediumtext、和longtext。对应的4种blob类型,可存储的最大长度不同、可根据实际情况选择。
6.枚举与集合类型
- enum
- set
7.空间数据类型
- geometry
- point
- linestring
- polygon
- multipoint
- multilinestring
- multipolygon
- geometrycollection:用于存储空间数据(地理信息、几何图形等)
10.主键
两种定义方式:
11.索引
12.物理删除和逻辑删除
13.MySQL常见的几种加密方法
1.密码加密
2.数据传输加密
3.数据库文件加密:
4.字段级别加密:
1.对称加密算法
2.非对称加密算法
14.时间戳和日期
什么是时间戳:
为什么要使用时间戳
将时间戳转换为日期格式
1.java
package src4; import java.text.SimpleDateFormat; import java.util.*; public class Demo4 { public static void main(String[] args) { SimpleDateFormat slf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//定义日期格式 Date date=new Date();//放入时间戳参数 long time=date.getTime(); System.out.println(time); Date date1=new Date(time); System.out.println(slf.format(date1)); } }
2.mysql
将日期格式转换为时间戳
1.java
package src4; import java.text.SimpleDateFormat; import java.util.*; public class Demo4 { public static void main(String[] args) { //定义日期字符串 String date="2022-08-31 15:30:00"; //定义日期格式 SimpleDateFormat slf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { //将日期字符串转换为日期格式 Date date1=slf.parse(date); //将日期字符串转换为时间戳 long time=date1.getTime(); //输出 System.out.println(time); }catch (Exception ex){ System.out.println("异常"); } } }
2.mysql
获取当前日期
总结
15.三范式
在 MySQL 中,遵循数据库设计的三范式可以提高数据的存储效率、减少数据冗余,并确保数据的一致性和准确性。
第一范式(1NF)
- 要求数据表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
- 例如,不能将“联系电话”这个字段同时存储多个电话号码,而应该拆分为“电话 1”、“电话 2”等多个字段。
第二范式(2NF)
- 要求数据库表中的每个实例或行必须可以被唯一地区分。满足第一范式的基础上,非主键字段必须完全依赖于主键,而不能只依赖于主键的一部分。
- 例如,一个订单表中包含订单号(主键)、商品编号、商品数量、客户编号。其中“商品编号”、“商品数量”只依赖于订单号,而“客户编号”不完全依赖于订单号,这就不满足第二范式。应该将客户信息单独放到一个客户表中,通过客户编号关联。
第三范式(3NF)
- 满足第二范式的基础上,任何非主属性不依赖于其它非主属性(在 2NF 基础上消除传递依赖)。
- 例如,在一个学生表中,有学号(主键)、姓名、所在班级编号、班级名称。其中“班级名称”依赖于“所在班级编号”,而“所在班级编号”又依赖于学号,存在传递依赖,不满足第三范式。应该将班级信息单独放到一个班级表中,通过班级编号关联。
总结
- 遵循三范式进行数据库设计,可以减少数据冗余,提高数据库的性能和可维护性。但在某些实际业务场景中,为了提高查询效率,可能会适当违反范式原则进行反范式设计。
- 例如,在一个经常需要同时查询用户基本信息和用户所在地区信息的系统中,如果用户表和地区表分离,每次查询都需要进行关联操作,可能会影响性能。此时可以在用户表中冗余存储地区信息,以减少关联操作,提高查询速度。
- 总之,在数据库设计中,需要根据具体的业务需求和性能要求,权衡是否严格遵循范式原则。