MySQL SQL 基础
SQL 是一种结构化查询语言,是关系型数据库通用的命令,遵循统一标准(SQL92 标准)。
一、DDL(数据定义语言)
1. 库定义
(1)建库
在 Unix 下,数据库名和表名区分大小写(因为库和表对应系统的目录或文件,而系统的目录和文件名区分大小写)。
create database zabbix charset utf8mb4 collate utf8mb4_bin;
(2)修改字符集
字符集只能从小往大改,如 utf8 -> utf8mb4。
alter database test charset utf8mb4;
(3)查看库
show databases; -- 查看所有数据库
show create database zabbix; -- 查看指定数据库的创建语句
(4)删库
drop database zabbix;
(5)建库规范
- 库名使用小写
- 库名不数字开头
- 库名不能是数据库内部关键字
- 建库必须设置字符集
2. 表定义
(1)建表
create table test.student (
id int primary key auto_increment comment '学号'
,sname varchar(255) not null comment '姓名'
,age tinyint unsigned not null default 0 comment '年龄'
,gender enum('m','f','n') not null default 'n' comment '性别'
,intime datetime not null default now() comment '入学时间'
) engine innodb charset utf8mb4
;
(2)查看表
show tables; -- 查看当前库下所有表
show create table student; -- 查看指定表的创建语句
desc student; -- 查看指定表的结构
(3)复制表结构
create table test.stu like test.student;
(4)修改表
-
增加列(Alter 增加列会导致锁表)
alter table test.student add qq varchar(20) not null comment 'QQ号' after gender; -
修改数据类型
alter table test.student modify qq varchar(64) not null comment 'QQ号' after gender; -- change 可同时修改数据类型、字段名、字段顺序;修改顺序时,放第一列用 first,放某列后用 after。 alter table test.student change gender sex char(1) not null DEFAULT 'n' COMMENT '性别' first; -
删除列
alter table test.student drop qq;
(5)删表
drop table stu;
(6)建表规范
- 表名
- 以小写字母开头,不能数字开头
- 不能是保留字符
- 使用和业务相关的表名,见名知义
- 数据类型
- 选择合适的数据类型和长度
- 每列设置为 not null + default
- 主键列尽量是无关数字列,最好自增
- 数字用 0 填充,字符使用有效字符
- enum 类型只能保存字符串,不能保存数字
- 存储引擎和字符集
- 表必须设置存储引擎和字符集
二、DML(数据操作语言)
1. insert(插入数据)
-
插入单行
-- insert t1 values(2, 'jim'); 这种简化写法不规范,不推荐。 insert into t1(id, name) values(1, 'tom'); -
插入多行
insert into t1(id, name) values(3,'tom'),(4,'jim');
2. update(更新数据)
update t1 set name = 'smith' where id = '3';
3. delete(删除数据)
delete from t1 where id = 4;
4. delete 与 truncate 区别
-
truncate:物理删除,直接释放空间
-
delete:逻辑删除,空间不会立即释放,易产生碎片
长期使用 delete 的表会产生大量碎片,可通过逻辑导出数据、truncate 表、再导入数据的方式消除碎片。
三、DCL(数据控制语言)
1. 授予权限
语法:grant 权限 on 作用目标 to 用户 identified by 密码 with grant option;
grant all on test.* to 'yingzai'@'172.16.0.%' identified by 'yingzai';
grant select,insert,update,delete,create on test.* to 'yingzai'@'172.16.0.%' identified by 'yingzai' with grant option;
2. 查看权限
show grants for yingzai@'172.16.0.%';
3. 收回权限
revoke grant option on test.* from yingzai@'172.16.0.%';
四、DQL(数据查询语言)
1. select 单独使用
-
查看参数/变量
select @@port; show variables like 'port%'; -
查看函数
select database(); -- 查看当前数据库 -- 更多信息可查看帮助 help information functions;
2. 通用语法
select * from t1 limit 5; -- 查询 t1 表的前 5 行数据
3. 聚合函数:group_concat
(1)语法
group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
(2)举例
mysql> select group_concat(name order by name desc separator ' ') from t1 group by id;
+-----------------------------------------------------+
| group_concat(name order by name desc separator ' ') |
+-----------------------------------------------------+
| tom |
| jim |
| tom smith |
| jim |
+-----------------------------------------------------+
4. 字符串函数:concat
(1)语法
concat(str1, str2,...) -- 拼接多个字符串
(2)举例
mysql> select concat(name, '\'s id is ', id) from t1;
+--------------------------------+
| concat(name, '\'s id is ', id) |
+--------------------------------+
| tom's id is 1 |
| jim's id is 2 |
| smith's id is 3 |
+--------------------------------+
5. limit(限制查询结果行数)
(1)语法
limit m,n:跳过前 m 行,显示 n 行(即显示 m+1 到 m+n 行)limit m:显示前 m 行limit n offset m:等同于limit m,n,跳过前 m 行,显示 n 行
(2)举例
limit 3; -- 显示前 3 行
limit 3,4; -- 跳过前 3 行,显示 4 行(即第 4 到第 7 行)
limit 4 offset 3; -- 等同于 limit 3,4,显示第 4 到第 7 行
6. 合集(合并查询结果)
union all -- 合并结果,不去重、不排序
union -- 合并结果,去重且排序
五、元数据查询
数据库的元数据存储在基表中,可通过 information_schema 库中的专用视图查询。
1. tables 表(存储表的元数据)
mysql> use information_schema ;
mysql> desc tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG | varchar(512) | NO | | | |
| TABLE_SCHEMA | varchar(64) | NO | | | |
| TABLE_NAME | varchar(64) | NO | | | |
| TABLE_TYPE | varchar(64) | NO | | | |
| ENGINE | varchar(64) | YES | | NULL | |
| VERSION | bigint(21) unsigned | YES | | NULL | |
| ROW_FORMAT | varchar(10) | YES | | NULL | |
| TABLE_ROWS | bigint(21) unsigned | YES | | NULL | |
| AVG_ROW_LENGTH | bigint(21) unsigned | YES | | NULL | |
| DATA_LENGTH | bigint(21) unsigned | YES | | NULL | |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES | | NULL | |
| INDEX_LENGTH | bigint(21) unsigned | YES | | NULL | |
| DATA_FREE | bigint(21) unsigned | YES | | NULL | |
| AUTO_INCREMENT | bigint(21) unsigned | YES | | NULL | |
| CREATE_TIME | datetime | YES | | NULL | |
| UPDATE_TIME | datetime | YES | | NULL | |
| CHECK_TIME | datetime | YES | | NULL | |
| TABLE_COLLATION | varchar(32) | YES | | NULL | |
| CHECKSUM | bigint(21) unsigned | YES | | NULL | |
| CREATE_OPTIONS | varchar(255) | YES | | NULL | |
| TABLE_COMMENT | varchar(2048) | NO | | | |
+-----------------+---------------------+------+-----+---------+-------+
2. 统计某张表占用空间大小
计算公式:平均行长度 × 行数 + 索引长度
mysql> select AVG_ROW_LENGTH * TABLE_ROWS + INDEX_LENGTH from tables where table_name = 't1';
+--------------------------------------------+
| AVG_ROW_LENGTH * TABLE_ROWS + INDEX_LENGTH |
+--------------------------------------------+
| 16380 |
+--------------------------------------------+
六、show 命令(封装好的元数据查询命令)
- 查看表相关:
show tables;(查看表名)show create table t1;(查看建表语句)show index from t1;(查看表索引)
- 查看数据库相关:
show databases;(查看数据库名)show create database test;(查看建库语句)
- 查看连接情况:
show processlist; - 查看字符集和校对规则:
show charset;(字符集)show collation;(校对规则)
- 查看权限:
show grants for yingzai@'172.16.0.%'; - 查看参数信息:
show variables like '%port%'; - 查看存储引擎:
show engines;(支持的存储引擎)show engine innodb status\G;(innodb 详细状态)
- 查看日志相关:
show binary logs;(二进制日志列表)show binlog events in 't1';(二进制日志事件)show master status;(当前库二进制日志信息)show relaylog events in '';(中继日志事件)
- 查看从库状态:
show slave status\G; - 查看数据库整体状态:
show status like '%log%';