SQL语句的规范
- 命令不区分大小写
- 表名和库名默认区分大小写
- 语句以;结束
- 查看帮助 HELP CREATE TABLE
数据库:存放数据的仓库 =》目录
创建、删除、修改、查询:库的创建语句、有哪些数据库、有哪些数据表...
数据表:仓库中的货架(实际存在数据的位置)=》文件(存放数据)
创建: CREATE
* 基本数据类型
* 约束关系(5种)
删除: DROP
修改: ALTER
查询:表的创建语句、表结构DESC
数据记录:
增加:INSERT INTO table_name VALUES (col1,col2....),();
插入指定字段:INSERT INTO table_name (,) values();
删除:DELETE/TRUNCATE
修改: UPDATE
查询:SELECT
查看数据库 SHOW DATABASES;
创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name[...];
创建时指定编码
create database if not exists test5 default character set utf8;
查看创建语句
show create database products\G;
查看数据库中有哪些表
use db_name;
show tables;
===============================
修改字符集
*创建一个test5数据库,设置字符集为GBK
create database test5 default character set GBK;

*修改字符集为UTF8
alter database test5 default character set UTF8;
show create database test5\G;

修改数据库名(不支持)
删除数据库
DROP DATABASE test5;
DROP DATABASE IF EXISTS test5;
SQL语句可以写成一个SQL文件,*.sql
可以执行这个SQL文件
===================================
修改配置文件把数据放在[root@xiaoyu /]#ll /data/mysql这个目录


系统把配置拆分成多个 "小文件",放在/etc/my.cnf.d/目录下
client.cnf:专门管 MySQL客户端的配置(比如客户端默认连接端口、字符集);mysql-server.cnf/mysqld.cnf:专门管 MySQL 服务端的配置(比如慢查询阈值、缓存大小、端口);


datadir=/data/mysql : MySQL 实际的数据存储目录 , 所以test1/test5 都在这里
socket=/data/mysql/mysql.sock : MySQL 本地连接的套接字文件路径,和datadir保持一致,避免连接报错, 本地程序(比如 Xshell 里的 mysql 客户端)和 MySQL 服务端 "沟通的专属通道"
/var/lib/mysql是MySQL 默认 的数据存储目录(上面已经修改成/data/mysql了),里面存的是:
- 每个数据库对应的文件夹(比如你创建的
test1库,会对应/var/lib/mysql/test1文件夹); - 数据库表的物理文件(比如 InnoDB 引擎的
.ibd文件、MyISAM 的.frm/.MYD/.MYI文件); - MySQL 系统库(
mysql、information_schema等)的物理文件
为啥不用默认位置要修改呢?
1、解决磁盘空间不足问题,避免系统崩溃(Linux 系统中,/var目录通常是系统盘, 默认分配的空间很小 ,/data目录通常是数据盘,空间大)
2、方便备份/迁移,提升IO性能,降低操作风险
3、本质逻辑: 系统盘只存系统文件,数据盘存业务数据 / 日志,这是运维的通用最佳实践
===================================
数据表:文件
列/字段:一个列代表了特定的数据类型和含义
students表
*name列->类型(字符串)
*age列->类型(整型)
行:一行代表一个具体的数据记录,行中数据要符合列的约束
*cali,18
整型
TINYINT 1字节 -128~127
SAMLLINT 2字节
MEDIUMINT 3字节
INT 4字节
BiGINT 8字节

zerofill需和unsigned搭配使用 默认加上
浮点型数据
float 4字节 单精度浮点数(计算故障率)(默认显示长度为7位,含小数点)
double 8字节 双精度浮点数(默认显示长度为17位)
decimal 定点型(默认只显示整数部分)

float(10,2)
10->显示总宽度
2->显示小数位数

MySql8默认采用严格模式
MySql设置:宽松模式和严格模式
宽松模式:某些设置不符合本身的要求,按默认方式处理
严格模式:如果不符合设置,直接报错处理
==================================
字符串类型
CHAR(N) 固定长度的字符串
VARCHAR(N) 可变长度的字符串
TEXT 用于存储大块文本(文章主体)
JSON 轻量级数据交换文本 NULL<-json->None (相当于翻译官)
二进制 图片、音频、视频
常见考题:CHAR和VARCHAR的区别?如何选择字符串类型?
CHAR:固定长度CHAR(100),适合固定长度的数据(手机号、身份证号码、学号...)
VARCHAR:可变长度字符串VARCHAR(100),根据内部存储的实际数据占用的存储空间
日期时间类型
data 3字节 yyyy-mm-dd
time 3字节 HH:mm:ss
datatime 8字节 yyyy-MM-dd HH:mm:ss
timestamp 4字节 yyyy-MM-dd HH:mm:ss 时间戳
year 1字节 yyyy
datetime 和timestamp的区别
datetime:与时区无关,存啥显示啥
timestamp:与时区有关,自动按时区转换


枚举和集合类型
枚举类型:ENUM 在多个选择中选择1个
集合类型:SET 在多个选择中选择N个
select * from users where hobby like "%阅读%";
select * from users where hobby find_in set ("阅读",hobby)>0;(它只能找一个)
========================================
常见约束
*非空约束(NOT NULL)
*唯一约束(UNIQUE):该列的值在表中是唯一的,允许NULL,可以有多个
*默认值约束(DEFALUT)
*主键约束(PRIMARY KEY)--》不允许为空NOT NULL,不允许重复UNIQUE
如果表中有一个字段符合主键特点,可以将该字段设置为主键(学号),如果没有可以使用 id -》自增
*主键的好处:会创建主键索引=》提高查询速度
*创建表与表之间的关系
*进行数据完整性和合法性检查
*外键约束(FOREIGN KEY)--》用于表与表之间建立关系
优点:
- 确保数据一致性,在插入/更新数据会进行约束检查,如果不合法就会报错
- 节省磁盘空间:减少数据冗余(不会有很多重复数据)
- 便于维护
缺点:
每次都进行检查会降低数据库性能
注:企业中会分表,不会直接使用foreign key进行关系约束在代码层面实现数据检查

XXX =》RESTRICT 限制动作(默认)
CASCADE 级联动作
SET NULL 设置为空
表操作
表的创建
CREATE TABLE [IF NOT EXISTS] table_name(
col_name datatye [约束信息],
col_name datatye [约束信息],
col_name datatye [约束信息]
) 表字符集;
**注:**列名:小写+下划线(风格指南-见名知意)
数据类型:优化存储风格、可扩展性
约束信息:提升查询效率、保证数据的完整性
复制表结构创建表
CREATE TABLE new_classes LIKE classes;


复制表结构和数据(后面可接where条件)
CREATE TABLE new_classes2 AS SELECT * FROM classes;
删除表:DROP TABLE [IF EXISTS] table_name;
修改表:
新增列:ALTER TABLE <表名> ADD <列名 列类型> [FIRST|AFTER 列名]; //<>表示必填



删除列:ALTER TABLE <表名> DROP COLUMN <列名>;

修改列类型:ALTER TABLE <表名> MODIFY <列名 列类型>;

修改列名:
ALTER TABLE <表名> CHANGE <旧列名 新列名 列类型>;
ALTER TABLE classes CHANGE col3 col03 int;
ALTER TABLE <表名> RENAME COLUMN <旧列名> TO <新列名>;
ALTER TABLE classes RENAME COLUMN col2 TO col02;
增加约束关系:
ALTER TABLE <表名> ADD CONSTRAINT <约束名> <约束类型>;
ALTER TABLE tb ADD CONSTRAINT pk_id PRIMARY KEY (id);
=============================================
Selinux配置:
命令行的临时生效
改配置文件永久生效/etc/selinux/config
firewalld
systemctl stop firewalld
systemctl disable firewalld
如何查看错误?
near后面错误从哪个位置开始
utf8中文3个英文1个字符