MySQL温故篇(一)SQL语句基础
一、SQL语句基础
数据库(SQL)思维导图_数据库设计思维导图-CSDN博客
1、SQL语言分类
DDL:数据定义语言
DCL:数据控制语言
DML:数据操作语言
DQL:数据的查询语言
2、数据类型
3、字符类型
char(11) :
定长 的字符串类型,在存储字符串时,最大字符长度11个,立即分配11个字符长度的存储空间,如果存不满,空格填充。
varchar(11):
变长的字符串类型看,最大字符长度11个。在存储字符串时,自动判断字符长度,按需分配存储空间。
enum('bj','tj','sh'):
枚举类型,比较适合于将来此列的值是固定范围内的特点,可以使用enum,可以很大程度的优化我们的索引结构。
4、时间类型
5、二进制类型
二、表属性
1、表属性
存储引擎:
InnoDB(默认的)
字符集和排序规则:
utf8
utf8mb4
2、列属性
约束(一般建表时添加):
**primary key** :主键约束
设置为主键的列,此列的值必须非空且唯一,主键在一个表中只能有一个,但是可以有多个列一起构成。
**not null** :非空约束
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0
**unique key** :唯一键
列值不能重复
**unsigned** :无符号
针对数字列,非负数。
其他属性:
**key** :索引
可以在某列上建立索引,来优化查询,一般是根据需要后添加
**default** :默认值
列中,没有录入值时,会自动使用default的值填充
**auto_increment**:自增长
针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量)
**comment ** : 注释
3、字符集
utf8
utf8mb4
MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。
MySQL在 5.5.3 之后增加了 utf8mb4 字符编码
在MySQL 8.0以后默认连接字符集从latin1改成了utf8mb4,字符序从latin1_swedish_ci改成了utf8mb4_0900_ai_ci
utf8mb4_bin 二进制存储
utf8mb4_general_ci 不区分大小写,区分字母变体
utf8mb4_unicode_ci 不区分大小写,不区分字母变体(也就是搜a的时候 α和a都会返回)
主流的MySQL大版本是5.6、5.7、8.0 但由于数据库存储数据的特性,企业往往升级版本的动力不强,除非新项目可以考虑在8.0上跑。
因此使用utf8mb4基本达成共识,如果考虑兼容性建议日常表设计时默认采用utf8mb4_general_ci,如果确定向前看只用8.0以上版本,可以用默认的utf8mb4_0900_ai_ci。
4、校对规则(排序规则)
mysql大小写敏感配置相关的两个参数,lower_case_file_system 和 lower_case_table_names
show global variables like '%lower_case%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | ON |
| lower_case_table_names | 0 |
+------------------------+-------+
二、SQL-- DDL数据定义语言
1、创建数据库
create database school;
create schema sch;
show charset;
show collation;
CREATE DATABASE test CHARSET utf8;
create database xyz charset utf8mb4 collate utf8mb4_bin;
建库规范:
1.库名不能有大写字母
2.建库要加字符集
3.库名不能有数字开头
4. 库名要和业务相关
2、示例:创建testdb 指定字符集,并查看默认的字符集和排序方式
create database testdb charset utf8mb4 collate utf8mb4_bin;
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation_%';
3、删除数据库
drop DATABASE school;
4、查看数据库建库语句,更改字符集
SHOW CREATE DATABASE school;
ALTER DATABASE school CHARSET utf8;
注意:修改字符集,修改后的字符集一定是原字符集的严格超集
SHOW CREATE DATABASE testdb;
ALTER DATABASE testdb CHARSET utf8;
三、表定义
1、建表基本语句(大公司一般使用数据建模软件,建表)
create table stu(
列1 属性(数据类型、约束、其他属性) ,
列2 属性,
列3 属性
)
建表规范:
1. 表名小写
2. 不能是数字开头
3. 注意字符集和存储引擎
4. 表名和业务有关
5. 选择合适的数据类型
6. 每个列都要有注释
7. 每个列设置为非空,无法保证非空,用0来填充。
示例:创建学生表
USE testdb;
CREATE TABLE stu(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname VARCHAR(255) NOT NULL COMMENT '姓名',
sage TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
sgender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别' ,
sfz CHAR(18) NOT NULL UNIQUE COMMENT '身份证',
intime TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入学时间'
) ENGINE=INNODB CHARSET=utf8 COMMENT '学生表';
2、删除表
drop table stu;
3、列的操作
DESC stu;
-- stu表中增加手机号
ALTER TABLE stu ADD 手机号 VARCHAR(20) NOT NULL UNIQUE COMMENT '手机号';
ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT '微信号' AFTER sname ;
ALTER TABLE stu ADD num INT NOT NULL COMMENT '数字' FIRST;
4、删除增加的列
ALTER TABLE stu DROP 手机号;
ALTER TABLE stu DROP wechat ;
ALTER TABLE stu DROP num ;
5、修改数据列的属性
ALTER TABLE stu MODIFY sname VARCHAR(128) NOT NULL ;
ALTER TABLE stu CHANGE sgender sg CHAR(1) NOT NULL DEFAULT 'n' ;
DESC stu;
6、常用表属性查询语句(DQL)
--使用指定的数据库
use school
--查看数据库中的表
show tables;
--查看表结构
desc stu;
--查建表语句
show create table stu;
--复制表,一般用户备份
CREATE TABLE ceshi LIKE stu;
-- 复制表结构
CREATE TABLE ceshi LIKE stu where ‘1’=‘0’;
四、DCL应用 主要用于授权和权限回收
grant
revoke
五、DML语句应用
DML语句作用:对表中的数据行进行增、删、改
示例1:在stu表中插入数据
-- 最标准的insert语句
INSERT INTO stu(id,sname,sage,sg,sfz,intime)
VALUES
(1,'zs',18,'m','123456',NOW());
SELECT * FROM stu;
--同时录入多行数据
INSERT INTO stu(sname,sfz)
VALUES
('w55','3444578d8'),
('m6','1212313'),
('aa','123213123123');
SELECT * FROM stu;
示例2:修改stu表的数据
DESC stu;
SELECT * FROM stu;
UPDATE stu SET sname='zhao4' WHERE id=2;
注意:update语句必须要加where。
示例3:delete(危险!!)stu表中的数据
DELETE FROM stu WHERE id=3;
示例4、全部删除 delete VS truncate
DELETE FROM stu
truncate table stu;
区别:
delete: DML操作, 是逻辑性质删除,逐行进行删除,速度慢.
truncate: DDL操作,对与表段中的数据页进行清空,速度快.
示例5:伪删除:用update来替代delete,最终保证业务中查不到(select)即可
1.添加状态列
ALTER TABLE stu ADD state TINYINT NOT NULL DEFAULT 1 ;
SELECT * FROM stu;
2. UPDATE 替代 DELETE
UPDATE stu SET state=0 WHERE id=6;
3. 业务语句查询
SELECT * FROM stu WHERE state=1;
六、 DQL查询语句(select )
-- select @@xxx 查看系统参数
SELECT @@port;
SELECT @@basedir;
SELECT @@datadir;
SELECT @@socket;
SELECT @@server_id;
---常用函数
SELECT NOW();
SELECT DATABASE();
SELECT USER();
--CONCAT 拼接函数
SELECT CONCAT("hello world");
SELECT CONCAT(USER,"@",HOST) FROM mysql.user;
SELECT GROUP_CONCAT(USER,"@",HOST) FROM mysql.user;
https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html?tdsourcetag=s_pcqq_aiomsg
MySQL函数大全-CSDN博客
MySQL函数大全-CSDN博客
MySQL必知必会——命令总结(mysql的相关命令) | 半码博客
Mysql_脚本宝典
七、information_schema.tables视图
查看视图基本命令
DESC information_schema.TABLES
TABLE_SCHEMA ---->库名
TABLE_NAME ---->表名
ENGINE ---->引擎
TABLE_ROWS ---->表的行数
AVG_ROW_LENGTH ---->表中行的平均行(字节)
INDEX_LENGTH ---->索引的占用空间大小(字节)
1、查询整个数据库中所有库和所对应的表信息
SELECT table_schema,GROUP_CONCAT(table_name)
FROM information_schema.tables
GROUP BY table_schema;
2、统计所有库下的表个数
SELECT table_schema,COUNT(table_name)
FROM information_schema.TABLES
GROUP BY table_schema
3、查询所有innodb引擎的表及所在的库
SELECT table_schema,table_name,ENGINE FROM information_schema.`TABLES`
WHERE ENGINE='innodb';
4、统计world数据库下每张表的磁盘空间占用
SELECT table_name,CONCAT((TABLE_ROWS*AVG_ROW_LENGTH+INDEX_LENGTH)/1024," KB") AS size_KB
FROM information_schema.tables WHERE TABLE_SCHEMA='world';
5、统计所有数据库的总的磁盘空间占用
SELECT
TABLE_SCHEMA,
CONCAT(SUM(TABLE_ROWS*AVG_ROW_LENGTH+INDEX_LENGTH)/1024," KB") AS Total_KB
FROM information_schema.tables
GROUP BY table_schema;
mysql -uroot -p123 -e "SELECT TABLE_SCHEMA,CONCAT(SUM(TABLE_ROWS*AVG_ROW_LENGTH+INDEX_LENGTH)/1024,' KB') AS Total_KB FROM information_schema.tables GROUP BY table_schema;"
6、生成整个数据库下的所有表的单独备份语句
模板语句:
mysqldump -uroot -p123 world city >/tmp/world_city.sql
SELECT CONCAT("mysqldump -uroot -p123 ",table_schema," ",table_name," >/tmp/",table_schema,"_",table_name,".sql" )
FROM information_schema.tables
WHERE table_schema NOT IN('information_schema','performance_schema','sys')
INTO OUTFILE '/tmp/bak.sh' ;
CONCAT("mysqldump -uroot -p123 ",table_schema," ",table_name," >/tmp/",table_schema,"_",table_name,".sql" )
7、107张表,都需要执行以下2条语句
ALTER TABLE world.city DISCARD TABLESPACE;
ALTER TABLE world.city IMPORT TABLESPACE;
SELECT CONCAT("alter table ",table_schema,".",table_name," discard tablespace")
FROM information_schema.tables
WHERE table_schema='world'
INTO OUTFILE '/tmp/dis.sql';