第1章 SQL基础应用
1.1 SQL介绍
结构化查询语言
5.7 以后符合SQL92严格模式
通过sql_mode参数来控制
1.2 SQL常用种类
1.1 DDL
数据定义语言
1.2 DML
数据操作语言
1.3 DCL
数据控制语言
1.4 DQL
数据查询语言
1.3 MySQL内置功能
1.1 连接数据库参数
-u:(接上用户名)
-p:(接密码)
-S:(本地通过sock文件连接)
-h:(接上IP地址)
-P:(接上端口号)
-e:(免交互执行sql语句 不登录数据库执行(一般用于监控脚本等))
示例1:本地sock文件链接数据库
mysql -uroot -p -S /tmp/mysql.sock
示例2::远程连接数据库
mysql -uroot -p -h10.0.0.51 -P3306
示例3:免交互执行sql语句
mysql -uroot -p -e "show databases;"
1.2 mysql内置命令
help 打印mysql帮助
c ctrl+c 结束上个命令运行
q quit; exit; ctrl+d 退出mysql
G 将数据竖起来显示
source 恢复备份文件
第2章 字符集
1.1 字符集介绍
1.1 什么是字符集
相当于MySQL的密码本(编码表)
1.2 查看mysql支持哪些字符集
show charset;
1.3 常用的字符集
utf8 : 3个字节
utf8mb4 (建议): 4个字节,支持emoji
2.2 排序规则: collation
2.1 作用
对于英文字符串的,大小写的敏感
# 示例
utf8mb4_general_ci 大小写不敏感
utf8mb4_bin 大小写敏感(存拼音,日文)
2.2 查看MySQL支持哪些规则
show collation;
第3章 数据类型介绍
1.1 数值类型
说明:手机号是无法存储到int的。一般是使用char类型来存储手机号
1.2 浮点数类型
小数
float
double 一般不用这2个,因为这2个不准确会四舍五入
decimal 用这个参数,准确度更高 格式为:decimal(总长,小数位数)
例:decimal(4,2) 最大数为99.99
理解为:这个数值的长度只能有4位,且小数点后面只能有2为位数
1.3 常用字符串类型介绍
1.1 char
固定长度字符串,最多为255个字符
#例子
char(11) :
#解释:定长的字符串类型,在存储字符串时,最大字符长度11个,立即分配11个字符长度的存储空间,如果存不满,空格填充!
1.2 varchar
可变长度字符串,最多为65535个字符
# 例子
varchar(11):
#解释:变长的字符串类型看,最大字符长度11个。在存储字符串时,自动判断字符长度,按需分配存储空间。而且会分配单独的一个字节来存储字符长度值(如果字符长度大于255,则会分配2个字节来存储)
1.3 enum('bj','tj','sh')
枚举类型,比较适合于将来此列的值是固定范围内的特点,可以使用enum,可以很大程度的优化我们的索引结构。
1.4 如何选择这两个数据类型
1. 少于255个字符串长度,定长的列值,选择char
2. 多于255字符长度,变长的字符串,可以选择varchar
1.4 时间类型
1.1 DATETIME
范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999
1.2 TIMESTAMP
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
# timestamp会受到时区的影响(就是说,如果变更了地理位置,会自动调整成当地的时间)
第4章 列的约束类型
1.1 常用的约束有哪些
1.1 primary key(主键)
非空且唯一,一张表中只能有一个主键,但是主键可以是多个列
1.2 not null(非空)
列值必填,不能为空!一般在设计表的时候每一列都要加上
1.3 unique key(唯一键)
列值不能重复
1.4 unsigned(无符号)
对于数字列,无符号 (此约束一定要跟在数字列的后面)
4.2 其他属性
comment: 注释
default: 默认值
auto_increment: 自动增长
第5章 DDL<<=>>数据定义语言的应用
1.1 创建数据库
create database zabbix charset utf8mb4 collate utf8mb4_bin;
1.2 检查数据库是否创建
show databases;
1.3 查看建库的语句
show databases create zabbix;
1.4 建库的规范
1.库名不能有大写字母
2.建库要加字符集
3.库名不能有数字开头
4.库名要和业务相关
1.5 删除库(生产中禁止使用)
mysql> drop database 库名;
1.6 修改库字符集
1.1 修改字符集的前提
#一定是从小往大了改!(目标字符集一定是源字符集的严格超级)
例如:utf8--->utf8mb4
1.2 示例
1. 创建一个名字叫yfc的库
create database yfc;
2. 查看库的字符集
show create database yfc;
3. 修改字符集为utf8mb4
alter database yfc charset utf8mb4;
1.7 DDL<<=>>表定义
1.1 建表
1. 先切换到要在哪个库下建表
use yfc
2. 建表
CREATE TABLE stu(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
NAME VARCHAR(64) NOT NULL COMMENT '姓名',
age TINYINT UNSIGNED NOT NULL DEFAULT 99 COMMENT '年龄',
gender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别',
telnum CHAR(11) NOT NULL DEFAULT '0' COMMENT '手机号',
intime DATETIME NOT NULL DEFAULT NOW() COMMENT '入学时间'
) ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表';
1.2 查看建表语句
show create table stu;
1.3 只克隆表结构
create table t1 like stu;
1.4 表结构和数据都克隆(索引不能克隆)
create table user select * from mysql.user;
1.5 建表规范
1. 表名小写字母,不能数字开头,
2. 不能是保留字符,使用和业务有关的表名
3. 选择合适的数据类型及长度
4. 每个列设置 NOT NULL + DEFAULT .对于数据0填充,对于字符使用有效字符串填充
5. 每个列设置注释
6. 表必须设置存储引擎和字符集
7. 主键列尽量是无关列数字列,最好是自增长
8. enum类型不要保存数字,只能是字符串类型
1.5 查看表结构
第一种方法:
desc 表名;
第二种方法:
show create table 表名;
1.6 删除表 (危险!!!)
mysql> drop table 表名;
第6章 修改表结构
1.1 说明
1. 大表结构变更,会长时间锁表,肯定会影响到线上业务
2. 8.0以后就自动解决了,8.0以前需要业务不繁忙期间或者使用PT-OSC工具
1.2 举例说明
1.1 例子1:在stu表中添加qq列
ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL DEFAULT 0 COMMENT 'QQ号';
--检查
DESC stu;
1.2 例子2:在gender后加一个wechat列
ALTER TABLE stu ADD wecht VARCHAR(20) NOT NULL DEFAULT '0' COMMENT '微信号' AFTER gender ;
--检查
DESC stu;
1.3 例子3: 在首列添加sid列
ALTER TABLE stu ADD sid VARCHAR(20) NOT NULL DEFAULT '0' COMMENT 'sid' FIRST;
--检查
DESC stu;
1.4 例子4:删除列
ALTER TABLE 表名 drop 列名;
1.3 修改列的属性
1.1 说明
modify 只能修改列的属性
change 可以修改列字段的名字
1.2 举例说明
例子1:需改name字段varchar(10)改为varchar(100)
ALTER TABLE stu MODIFY NAME VARCHAR(100) NOT NULL COMMENT '姓名';
例子2:需改字段名称
ALTER TABLE stu CHANGE 修改前的字段名 修改后的字段名 VARCHAR(64) NOT NULL COMMENT '姓名';
第7章 DML<<=>>数据操作语言应用
1.1 insert应用
1.1 环境准备
--例子:
+-----------+---------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+-------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| user_name | varchar(20) | NO | | NULL | |
| email | varchar(50) | NO | | NULL | |
| age | tinyint(3) unsigned | NO | | 0 | |
| fee | decimal(10,2) | NO | | 0.00 | |
| intime | datetime | NO | | CURRENT_TIMESTAMP | |
+-----------+---------------------+------+-----+-------------------+----------------+
1.2 最规范的写法: 适用于所有关系型数据库
1. 一次性录入一行
insert into 表名(id,user_name,email,age,fee,intime)
values(1,'yufenchi','784381392@qq.com',27,500.24,now());
--数字不用加引号,字符串要加引号
2. 一次性录入多行
insert into user(id,user_name,email,age,fee,intime)
values(2,'yufenchi1','784381391@qq.com',28,500.25,now()),
(3,'yufenchi2','784381393@qq.com',29,500.26,now());
1.2 update
1.1 注意
一定要加where 条件,如果不加会把表的记录全部改掉
1.2 环境准备
--例:
+----+-----------+------------------+-----+--------+---------------------+
| id | user_name | email | age | fee | intime |
+----+-----------+------------------+-----+--------+---------------------+
| 1 | yufenchi | 784381392@qq.com | 27 | 500.24 | 2019-09-08 23:19:13 |
| 2 | yufenchi1 | 784381391@qq.com | 28 | 500.25 | 2019-09-08 23:28:49 |
| 3 | yufenchi2 | 784381393@qq.com | 29 | 500.26 | 2019-09-08 23:28:49 |
+----+-----------+------------------+-----+--------+---------------------+
1.2 举例说明
例子1:把上表中yufenchi的age改为100
mysql> update user set age=100 where id=1;
--这里的=是一个判断,判断id=1
mysql> select * from user;
例子2:把表中fee字段 500.25改为12.11
mysql> update user set fee=12.11 where fee=500.25;
例子3:把表中用户名不是yfenchi的全部改为yufenchi
mysql> update user set user_name='yufenchi' where user_name!='yufenchi';
--判断不等于!=
例子4:把表中用户名id=2 和 id=3 的改为yufenchi2
mysql> update user set user_name='yufenchi2' where id in (2,3);
--用in 还有一种是not in(不在里面)
例子5:把表中2到4的年纪全部改为54
mysql> update user set age=54 where id between 2 and 4;
--between 在...之间的
mysql> select * from user;
第8章 drop table , truncate table ,delete from table 区别
1.1 drop table
表结构+数据全部(物理)删除
1.2 truncate table
数据全部清空(物理),清空是区!磁盘空降立即释放,HWM高水位线会下降
1.3 delete from table
逐行删除表中所有数据,逻辑删除!如果数据行多,删除的会很慢!并没有真正的从磁盘上删除,只是在存储层面打了标记,磁盘空间不会立即释放,HWM高水位线不会降低
第9章 伪删除
1.1 作用
用状态列标记一个行是否存在.
UPDATE 替代 DELETE
1.2 第一个里程:添加一个状态列(1代表删除,0代表未删除)
ALTER TABLE stu ADD state CHAR(1) NOT NULL DEFAULT '0' COMMENT '状态列:1代表删除,0代表未删除';
SELECT * FROM stu;
1.3 第二个里程: 删除张四数据行
--原语句:
DELETE FROM stu WHERE sname='张四';
--改写为:
UPDATE stu SET state='1' WHERE sname='张四';
1.4 第三个里程: 查询数据
--原查询语句:
SELECT * FROM stu;
--改写为:
SELECT * FROM stu WHERE state='0';