当前位置: 首页 > news >正文

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';

相关文章:

  • Springboot+vue的社区智慧养老监护管理平台设计与实现(有报告),Javaee项目,springboot vue前后端分离项目
  • R语言阈值效应函数cut.tab2.0版发布(支持线性回归、逻辑回归、cox回归,自定义拐点)
  • uTools工具使用
  • Redis-缓存问题及解决方案
  • Kafka系列之:Kafka集群同时设置基于时间和日志大小两种方式保存Topic的数据
  • 学习好并用好大模型
  • 【Cocos入门】场景切换(loadScene、preloadScene)
  • nginx slice模块的使用和源码分析
  • jmeter-06常用的几种断言方式
  • PdfFactory Pro软件下载以及序列号注册码生成器
  • Pandas 对带有 Multi-column(多列名称) 的数据排序并写入 Excel 中
  • vue 引入 百度地图API 和 路书
  • 功能强大的国外商业PHP在线教育系统LMS源码,直播课程系统
  • K8S之运用亲和性设置Pod的调度约束
  • 在centos7中利用pybind11构建C++的动态库供python调用
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • docker容器内的网络抓包
  • go append函数以及写入
  • HTML5新特性总结
  • JAVA多线程机制解析-volatilesynchronized
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • node和express搭建代理服务器(源码)
  • scala基础语法(二)
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue组件定义
  • 聚簇索引和非聚簇索引
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端技术周刊 2019-01-14:客户端存储
  • 实习面试笔记
  • 温故知新之javascript面向对象
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​Spring Boot 分片上传文件
  • ​ubuntu下安装kvm虚拟机
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #pragam once 和 #ifndef 预编译头
  • $ git push -u origin master 推送到远程库出错
  • (12)目标检测_SSD基于pytorch搭建代码
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (4)logging(日志模块)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (一)Java算法:二分查找
  • (一)基于IDEA的JAVA基础12
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net Signalr 使用笔记
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET4.0并行计算技术基础(1)
  • .Net各种迷惑命名解释
  • @Controller和@RestController的区别?