SQL语句分类
SQL,英文全称为Structured Query Language,中文意思是结构化查询语言(属于编程语言的一种)
DDL数据定义语⾔
Data Definition Language,数据定义语言,例如修改数据库中的表、视图、索引等对象的结构
1.官方DDL语句示例:
mysql> ? Data Definition
You asked for help about help category: "Data Definition"
For more information, type 'help <item>', where <item> is one of the following
topics:
ALTER DATABASE
ALTER EVENT
ALTER FUNCTION
ALTER INSTANCE
ALTER LOGFILE GROUP
ALTER PROCEDURE
ALTER SCHEMA
ALTER SERVER
ALTER TABLE
ALTER TABLESPACE
ALTER VIEW
CREATE DATABASE
CREATE EVENT
CREATE FUNCTION
CREATE INDEX
CREATE LOGFILE GROUP
CREATE PROCEDURE
CREATE SCHEMA
CREATE SERVER
CREATE SPATIAL REFERENCE SYSTEM
CREATE TABLE
CREATE TABLESPACE
CREATE TRIGGER
CREATE VIEW
DROP DATABASE
DROP EVENT
DROP FUNCTION
DROP INDEX
DROP PROCEDURE
DROP SCHEMA
DROP SERVER
DROP SPATIAL REFERENCE SYSTEM
DROP TABLE
DROP TABLESPACE
DROP TRIGGER
DROP VIEW
FOREIGN KEY
RENAME TABLE
TRUNCATE TABLE
对数据库进行操作
- 创建数据库
create
,创建数据库时,数据库的名称不能是敏感字符,若非要创建敏感字符名称数据库可以加 反引号
create database/schema wzy666;
create database wzy666 character set utf8mb4;
create database wzy666 charset utf8 collate utf8_general_mysql500_ci;
- 查看数据库
show databases;
show databases like '%xiao%';
show create databse xiaoC; # 数据库创建语句
- 修改数据库 (字符集/校对规则)
alter database test charset utf8mb4;
alter database test charset utf8 collate utf8_general_mysql500_ci;
- 删除数据库 (需要审核,慎重)
drop database test;
drop schema test;
- 切换数据库
use test; # 若不切换数据库,对表进行操作时,需要指定库名.
select database() # 查看切换的数据库信息
对数据表进行操作
创建数据表 create
创建表标准语法结构:
create table <表名> (
<字段名1> <类型1> 字段部分约束 字段属性,
…
<字段名n> <类型n> 字段部分约束 字段属性,
字段索引设置 (主键索引 辅助索引 联合索引)
) 引擎设置 字符集设置 校对规则设置;
CREATE TABLE `student` (
`id` int NOT NULL COMMENT '学号信息',
`name` varchar(45) NOT NULL COMMENT '学生名',
`age` tinyint unsigned NOT NULL COMMENT '学生年龄',
`gender` enum('M','F','N') NOT NULL DEFAULT 'N' COMMENT '学生性别',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表'
查看数据表
show tables; # 查看指定数据库中所有表信息
show tables like '%user%'; # 过滤查看指定表信息是否存在
show create table 表名; # 查看表的创建语句,查看表字段注释信息
desc 表名; # 查看表结构信息 *****
show index from 表名 # 查看表中索引设置信息
修改数据表的属性信息
rename table stu1 to stu2; # 修改表名称
alter table stu2 rename stu3;
- 修改数据表结构信息之添加字段,此时每一行会插入一个新列,产生元数据锁
alter table t1 add column telno char(11) not null unique key comment '手机号';
alter table t1 add column wechat varchar(64) not null unique key comment '微信号' after name;
alter table t1 add column qqnum varchar(64) not null unique key comment 'qq号' first;
删除字段
alter table t1 drop column qqnum;
DCL数据控制语言
DCL Data Control Language,数据控制语言,语句用于控制数据库中数据的访问权限和安全性。常见的有:
- 授权/撤销授权
GRANT 权限列表 ON 数据库对象 TO 用户名;
- 刷新权限
FLUSH PRIVILEGES;
1.官方数据控制语言示例:
mysql> ? Account Management;
You asked for help about help category: "Account Management"
For more information, type 'help <item>', where <item> is one of the following
topics:
ALTER RESOURCE GROUP
ALTER USER
CREATE RESOURCE GROUP
CREATE ROLE
CREATE USER
DROP RESOURCE GROUP
DROP ROLE
DROP USER
GRANT
RENAME USER
REVOKE
SET DEFAULT ROLE
SET PASSWORD
SET RESOURCE GROUP
SET ROLE
DML数据操作语言
DML Data Manipulation Language,数据操作语言。
1.官方数据操作语言示例:
mysql> ? Data manipulation;
You asked for help about help category: "Data Manipulation"
For more information, type 'help <item>', where <item> is one of the following
topics:
CALL
DELETE
DO
DUAL
HANDLER
IMPORT TABLE
INSERT
INSERT DELAYED
INSERT SELECT
JOIN
LOAD DATA
LOAD XML
PARENTHESIZED QUERY EXPRESSIONS
REPLACE
SELECT
TABLE
UNION
UPDATE
VALUES STATEMENT
常用DML语句示例
- 在表中插入数据
insert
标准语法:
insert into 表名 (字段01名称,字段02名称...) values (字段01值,'字段02值',...);
精简语法:
insert into 表名 (必要字段信息) values (必要字段值);
- 在表中修改数据
update
update 表名 set 字段名='字段值' where 过滤行信息;
- 在表中删除数据
delete
delete from 表名 where 过滤行信息;
delete from t1 where telno='111';
3种数据删除方式
区别分析 | drop table stu; | truncate table stu; | delete from stu; |
---|---|---|---|
功能效果 | 删除表结构+数据 | 删除表数据(释放空间) | 删除表数据(标记删除) |
删除逻辑 | 彻底删除 | 物理删除(段区页层面删除) | 逻辑删除(逐行删除) |
删除效率 | 效率快(和数据量无关) | 效率快(和数据量无关) | 效率慢(和数据量有关) |
自增影响 | 新增自增序列 | 重置自增序列(释放高水位线) | 延续自增序列 |
数据恢复 | 利用日志文件恢复 | 利用备份恢复/延时从库恢复 | 利用日志文件恢复(快速) |
runcate table stu;
,把磁盘中的block快中的数据删除。
1.现在有一个wzy库,里面有一个 my_user 表,对应的磁盘存储目录如下:
mysql> use wzy;
Database changed
mysql> show tables;
+---------------+
| Tables_in_wzy |
+---------------+
| my_user |
+---------------+
[root@db51data]# pwd
/data/3306/data
[root@db51data]# tree wzy
wzy
└── my_user.ibd
2.把表 my_user 删除掉
mysql> drop table my_user;
Query OK, 0 rows affected (0.01 sec)
然后查看对应的 .ibd 就会跟着消失了
[root@db51data]# tree wzy
wzy
0 directories, 0 files
delete
只是标记删除了,磁盘空间不会被释放;当有新的数据需要写入时,就会覆盖掉被标记为输出的数据
DQL数据查询语言
Data Query Language,数据查询语言。如何查看各种数据信息,核心是SQL的SELECT语句,主要用于从数据库中选择数据
字符和校对
字符集
字符集介绍
字符集(Character Set)是多个字符的集合,规定了字符在计算机中的编码方式。字符集的作用:把人类可识别数据字符串–>数据库服务–>计算机识别二进制信息。
字符集设置
1.查看系统支持的字符集
mysql> show charset;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| binary | Binary pseudo charset | binary | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
....................................
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |
+----------+---------------------------------+---------------------+--------+
2.设置数据库的默认字符集
[root@db51~]# cat /data/3306/my.cnf
[mysql]
socket=/tmp/mysql.sock
default-character-set=utf8mb4
[mysqld]
user=mysql
mysqlx=0
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
character-set-server=utf8mb4
3.对库或表设置字符集
CREATE DATABASE 库名 CHARACTER SET charset_name(字符集名称);
alter DATABASE 库名 CHARACTER SET charset_name(字符集名称);
CREATE TABLE 表名 (字段01 字段01类型 ) CHARACTER SET charset_name(字符集名称);
alter table 表名 CHARACTER SET charset_name(字符集名称);
4.查看已有的数据库/数据表字符集信息
mysql> show create database wzy;
+----------+-------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------------------------------------------------------------------+
| wzy | CREATE DATABASE `wzy` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show create table t1;
CREATE TABLE `t1` (
`id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
校对规则
校对规则介绍
数据库的校对规则(Collation)是指在数据库中对字符进行比较和排序时所遵循的规则。校对规则定义了字符的顺序、大小写敏感性、重音符号处理等行为
校对规则是字符集的一部分,它决定了如何比较和排序字符。不同的校对规则可以影响数据库中字符串的比较结果和排序顺序
在数据库设计和管理中,校对规则的选择非常重要,特别是在多语言环境中。正确的校对规则可以确保数据的正确排序和搜索
常见的校对规则:
- _ci:表示不区分大小写(case-insensitive)
- _cs:表示区分大小写(case-sensitive)
- _bin:表示二进制比较,完全按照字符的编码值进行比较
- _ai:表示不区分重音符号(accent-insensitive)
- _as:表示区分重音符号(accent-sensitive)
校对规则设置
1.查看表字符信息
mysql> show create table t1;
+-------+----------------------------------------------------------------+
| Table | Create Table | |
+-------+----------------------------------------------------------------+
| t1 | CREATE TABLE `t1` ( |
`info` char(3) DEFAULT NULL |
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | |
+-------+----------------------------------------------------------------+
1 row in set (0.00 sec)
2.指定字符和校对
创建库时:
create database exam charset utf8mb4;
创建表时:
create table t3 charset utf8mb4;
3.修改字符和校对
alter table t1 charset utf8mb4 collate utf8mb4_bin;
如何修复一个乱码的表
1.备份表mysqldump
2.删除旧表
3.创建新表指定字符集
4.导入原数据
字符影响排序和查询 案例
保障查询结果
保障排序效果
1.在创建表示指定校对规则,然后查看校对规则
# 不区分大小写,不影响字符排序
create table t1(info char(3)) charset utf8mb4 collate utf8mb4_0900_ai_ci;
# 区分大小写,不影响字符排序
create table t2(info char(3)) charset utf8mb4 collate utf8mb4_0900_as_cs;
# 区分大小写,影响数据排序效果
create table t3(info char(3)) charset utf8mb4 collate utf8mb4_bin;
查看已有的表字符集设置
mysql> show create table t1;
+-------+----------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`info` char(3) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
mysql> show create table t2;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| t2 | CREATE TABLE `t2` (
`info` char(3) COLLATE utf8mb4_0900_as_cs DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_as_cs |
mysql> show create table t3;
+-------+-----------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------+
| t3 | CREATE TABLE `t3` (
`info` char(3) COLLATE utf8mb4_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
2.插入数据
insert into t1 values('a'),('A'),('b'),('B'),('c'),('C');
insert into t2 values('a'),('A'),('b'),('B'),('c'),('C');
insert into t3 values('a'),('A'),('b'),('B'),('c'),('C');
3.查看字母a,t1表区分大小写,所以只显示1个a
mysql> select * from t1 where info='a';
+------+
| info |
+------+
| a |
| A |
+------+
mysql> select * from t2 where info='a';
+------+
| info |
+------+
| a |
+------+
mysql> select * from t3 where info='a';
+------+
| info |
+------+
| a |
+------+
4.查看数据表所有内容,t3表影响排序
mysql> select * from t1 order by info;
+------+
| info |
+------+
| a |
| A |
| b |
| B |
| c |
| C |
+------+
mysql> select * from t2 order by info;
+------+
| info |
+------+
| a |
| A |
| b |
| B |
| c |
| C |
+------+
mysql> select * from t3 order by info;
+------+
| info |
+------+
| A |
| B |
| C |
| a |
| b |
| c |
+------+
加粗样式