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';
相关推荐
zzb15803 小时前
RAG from Scratch-优化-query
java·数据库·人工智能·后端·spring·mybatis
一只鹿鹿鹿3 小时前
信息安全等级保护安全建设防护解决方案(总体资料)
运维·开发语言·数据库·面试·职场和发展
堕2743 小时前
MySQL数据库《基础篇--数据库索引(2)》
数据库·mysql
wei_shuo3 小时前
数据库优化器进化论:金仓如何用智能下推把查询时间从秒级打到毫秒级
数据库·kingbase·金仓
71-34 小时前
MySQL的安装和卸载组件
笔记·学习·mysql
雷工笔记4 小时前
Navicat Premium 17 软件安装记录
数据库
wenlonglanying4 小时前
Ubuntu 系统下安装 Nginx
数据库·nginx·ubuntu
数据库小组4 小时前
10 分钟搞定!Docker 一键部署 NineData 社区版
数据库·docker·容器·database·数据库管理工具·ninedata·迁移工具
爬山算法4 小时前
MongoDB(38)如何使用聚合进行投影?
数据库·mongodb
l1t5 小时前
Deep Seek总结的APSW 和 SQLite 的关系
数据库·sqlite