一、学习内容
什么是SQL
Structured Query Language 结构化查询语言
SQL 作用
1.是一种所有关系型数据库的查询规范,不同的数据库都支持。 2.通用的数据库操作语言,可以用在不同的数据库中。 3.不同的数据库SQL 语句有一些区别。
SQL 语句分类
1.Data Definition Language (DDL 数据定义语言) 如:建库,建表 2.Data Manipulation Language(DML 数据操纵语言), 如:对表中的记录操作增删改 3.Data Query Language(DQL 数据查询语言), 如:对表中的查询操作 4.Data Control Language(DCL 数据控制语言), 如:对用户权限的设置
MySQL 的语法
1.每条语句以分号结尾,如果在SQLyog 中不是必须加的。 2.SQL 中不区分大小写,关键字中认为大写和小写是一样的。 3.三种注释: 1) -空格 单行注释 2) / / 多行注释 3) # 这是mysql 特有的注释方式
创建数据库的几种方式
创建数据库 CREATE DATABASE 数据库名; 判断数据库是否已经存在,不存在则创建数据库 CREATE DATABASE IF NOT EXISTS 数据库名;
创建数据库并指定字符集 CREATE DATABASE 数据库名 CHARACTER SET 字符集;
查看数据库
查看所有的数据库 show databases; 查看某个数据库的定义信息 show create database 数据库名;
修改数据库默认的字符集
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;
删除数据库
DROP DATABASE 数据库名;
使用数据库
查看正在使用的数据库 SELECT DATABASE(); 使用/切换数据库 USE 数据库名;
MySQL 数据类型
| 数据类型 | ||
|---|---|---|
| 分类 | 类型名称 | 类型说明 |
整数 |
tinyInt | 微整型:很小的整数(占8 位二进制) |
| smallint | 小整型:小的整数(占16 位二进制) | |
| mediumint | 中整型:中等长度的整数(占24 位二进制) | |
| int(integer) | 整型:整数类型(占32 位二进制) | |
| 小数 | float | 单精度浮点数,占4 个字节 |
| double | 双精度浮点数,占8 个字节 | |
日期 |
time | 表示时间类型 |
| date | 表示日期类型 | |
| datetime | 同时可以表示日期和时间类型 | |
字符串 | char(11) | 固定长度的字符串,无论使用几个字符都占满全部,M 为0~255 之间的整
数 |
| | varchar(11) | 可变长度的字符串,使用几个字符就占用几个,M 为0~65535 之间的整数 |
|
大二进制 | tinyblob
Big Large Object | 允许长度0~255 字节 |
| | blob | 允许长度0~65535 字节 |
| | mediumblob | 允许长度0~167772150 字节 |
| | longblob | 允许长度0~4294967295 字节 |
|
大文本 | tinytext | 允许长度0~255 字节 | | | text | 允许长度0~65535 字节 | | | mediumtext | 允许长度0~167772150 字节 | | | longtext | 允许长度0~4294967295 字节 |
DDL 操作
创建表的格式 CREATE TABLE 表名( 字段名1 字段类型1, 字段名2 字段类型2 ); 查看某个数据库中的所有表 SHOW TABLES; 查看表结构 DESC 表名; 查看创建表的SQL 语句 SHOW CREATE TABLE 表名; 快速创建一个表结构相同的表 CREATE TABLE 新表名 LIKE 旧表名; 直接删除表 DROP TABLE 表名; 判断表是否存在,如果存在则删除表 DROP TABLE IF EXISTS 表名; 添加表列ADD ALTER TABLE 表名 ADD 列名 类型; 修改列类型MODIFY ALTER TABLE 表名 MODIFY 列名 新的类型; 修改列名CHANGE ALTER TABLE 表名 CHANGE 旧列名 新列名 类型; 删除列DROP ALTER TABLE 表名 DROP 列名; 修改字符集character set ALTER TABLE 表名 character set 字符集; 插入全部字段 所有的字段名都写出来 INSERT INTO 表名 (字段名1, 字段名2, 字段名3…) VALUES (值1, 值2, 值3);
不写字段名 INSERT INTO 表名 VALUES (值1, 值 2, 值3…);
插入部分数据 INSERT INTO 表名 (字段名1, 字段名 2, …) VALUES (值1, 值2, …); 查看包含character 开头的全局变量 show variables like ‘character%’; 什么是蠕虫复制: 将一张已经存在的表中的数据复制到另一张表中。 语法格式: 将表名2 中的所有的列复制到表名1 中 INSERT INTO 表名1 SELECT * FROM 表名 2;
只复制部分列 INSERT INTO 表名1( 列1, 列2) SELECT 列1, 列2 FROM student; 不带条件修改数据 UPDATE 表名 SET 字段名=值; — 修改所有的行
带条件修改数据 UPDATE 表名 SET 字段名=值 WHERE 字段名=值; 不带条件删除数据 DELETE FROM 表名; 带条件删除数据 DELETE FROM 表名 WHERE 字段名=值;
使用truncate 删除表中所有记录 TRUNCATE TABLE 表名;
INSERT 的注意事项
1.插入的数据应与字段的数据类型相同。 2.数据的大小应在列的规定范围内,例如:不能将一个长度为80 的字符串加入到长度为40 的列中。 3.在values 中列出的数据位置必须与被加入的列的排列位置相对应。在mysql 中可以使用value,但不建议使用,功能与values 相同。 4.字符和日期型数据应包含在单引号中。MySQL 中也可以使用双引号做为分隔符。 5.不指定列或使用null,表示插入空值。
DQL语法
| 比较运算符 | 说明 |
|---|---|
| >、<、<=、>=、=、<> | <>在 SQL 中表示不等于,在 mysql 中也可以使用!= ,没有== |
| BETWEEN…AND | 在一个范围之内,如:between 100 and 200 相当于条件在 100 到 200 之间,包头又包尾 |
| IN(集合) | 集合表示多个值,使用逗号分隔 |
| LIKE ‘张%’ | 模糊查询 |
| IS NULL | 查询某一列为 NULL 的值,注:不能写=NULL |
| 逻辑运算符 | 说明 |
|---|---|
| and 或 && | 与,SQL 中建议使用前者,后者并不通用。 |
| or 或 || | 或 |
| not 或 ! | 非 |
| SELECT 字段名 FROM 表名 WHERE 字段 in (数据 1, 数据 2…); |
|---|
| in 里面的每个数据都会作为一次条件,只要满足条件的就会显示 |
| LIKE 表示模糊查询 |
| SELECT * FROM 表名 WHERE 字段名 LIKE ‘通配符字符串’; |
| 通配符 | 说明 |
|---|---|
| % | 匹配任意多个字符串 |
| _ | 匹配一个字符 |
| 理解 |
|---|
| SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC]; |
| ASC: 升序,默认值 |
| DESC: 降 序 |
| 聚合函数 | 作用 |
|---|---|
| max(列名) | 求这一列的最大值 |
| min(列名) | 求这一列的最小值 |
| avg(列名) | 求这一列的平均值 |
| count(列名) | 统计这一列有多少条记录 |
| sum(列名) | 对这一列求总和 |
| where 子句 | 对查询结果进行分组前,将不符合 where 条件的行去掉,即在分组之前过滤数据,即先过滤再分组。 where 后面不可以使用聚合函数 |
| having 子句 | having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。 having 后面可以使用聚合函数 |
| LIMIT offset,length; |
|---|
| offset:起始行数,从 0 开始计数,如果省略,默认就是 0 |
| length: 返回的行数 |
数据库备份和还原
备份格式:DOS 下,未登录的时候。这是一个可执行文件exe,在bin 文件夹 mysqldump -u 用户名 -p 密码 数据库 > 文件的路径
还原格式:mysql 中的命令,需要登录后才可以操作 USE 数据库; SOURCE 导入文件的路径;
数据库表的约束
约束的作用:
对表中的数据进行限制,保证数据的正确性、有效性和完整性。 一个表如果添加了约束,不正确的数据将无法插入到表中。 约束在创建表的时候添加比较合适。
| 约束名 | 约束关键字 | 说明 |
|---|---|---|
| 主键 | primary key | 非空,唯一 |
| 主键自增 | auto_increment | 默认从0开始 |
| 默认 | default | 如果一列没有值,使用默认值 |
| 唯一 | unique | 这一列不能有重复值 |
| 非空 | not null | 这一列必须有值 |
| 外键 | foreign key | 主表中主键列,在从表中外键列 |
| 检查约束 | check | mysql 不支持 |
级联操作
在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作
| 级联操作语法 | 描述 |
|---|---|
| ON UPDATE CASCADE | 级联更新,只能是创建表的时候创建级联关系。更新主表中的主键,从表中的外键 列也自动同步更新 |
| ON DELETE CASCADE | 级联删除 |
表关系的概念
| 表与表之间的三种关系 |
|---|
| 一对多: 最常用的关系部门和员工 |
| 多对多: 学生选课表和学生表,一门课程可以有多个学生选择,一个学生选择多门课程 |
| 一对一: 相对使用比较少。员工表简历表,公民表护照表 |
| 一对多建表原则: 在从表(多方)创建一个字段,字段作为外键指向主表的主键 |
| 多对多关系原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。 |
| 一对一关系原则: 一对一可以创建成一张表。(可以通过唯一约束或主键约束的属性加外键来实现一对一的关系) |
三大范式
什么是范式: 好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储,这些规则就称为范式。
| 范式 | 特点 |
|---|---|
| 第 1 范式 | 原子性,每列不可再拆分 |
| 第 2 范式 | 不产生局部依赖,表中每一列都完全依赖于主键。 |
| 第 3 范式 | 不产生传递,表中每一列都直接依赖于主键 |
多表查询
笛卡尔积:因为多表查询,没有加过滤条件,产生的没用的数据。
隐式内连接:看不到 JOIN 关键字,条件使用 WHERE 指定
SELECT 字段名 FROM 左表, 右表 WHERE 条件
显示内连接:使用 INNER JOIN … ON 语句, 可以省略 INNER
左外连接:使用 LEFT OUTER JOIN … ON,OUTER 可以省略;在内连接的基础上保证左表的数据全部显示
SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
右外连接:使用 RIGHT OUTER JOIN … ON,OUTER 可以省略
用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示 NULL;在内连接的基础上保证右表的数据全部显示
SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件
使用内连接查询
select from dept d inner join emp e on d.id= e.dept_id;
使用左外连接查询
select from dept d left join emp e on d.id= e.dept_id;
使用内连接查询
select from dept inner join emp on dept.id= emp.dept_id;
使用右外连接查询
select from dept right join emp on dept.id= emp.dept_id;
二、学习经验:
mysql练习中,代码不报错,能够得到需要的结果,不意味着代码就是正确,mysql很垃圾,写代码时需要多加注意,不要为了完成作业,应付任务,写完就不管了。
三、学习不足与改进:
目前mysql的学习过程中,知识点难度适中,应用时很多细节没有注意,需要多加练习留意细节,不报错不代表没有问题,需要仔细检查语言规范。
四、学习状态:
第二周的网课,学习状态还行,注意力基本集中到听课,上课中走神情况逐渐降低,偶尔发生一两次,思路可以跟上老师的节奏,知识点几乎都能理解,学习状态仍需进一步改善。
