目 录CONTENT

文章目录

MySQL基础应用

简中仙
2020-09-07 / 0 评论 / 0 点赞 / 48 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2024-01-21,若内容或图片失效,请留言反馈。 本文如有错误或者侵权的地方,欢迎您批评指正!

一、MySQL内置功能

1、 连接数据库

参数说明
-u数据库用户名
-p用户密码
-S使用sock文件登录;例如:mysql -uroot -p -S /tmp/mysql.sock
-h指定登录IP地址;例如: mysql -uroot -p -h 192.168.1.10
-P指定登录IP地址端口;例如:mysql -uroot -p -h 192.168.1.10 -P3306
-e免交互执行sql语句;例如:mysql -uroot -p -e "show databases;"
<恢复数据;例如: mysql -uroot -p123456 /root/world.sql

2、内置命令

命令说明
help打印mysql帮助
\c;ctrl+c结束上个命令运行
\q;quit; exit; ctrl+d退出mysql
\G将数据竖起来显示
source恢复备份文件

二、SQL基础

结构化的查询语言

关系型数据库通用的命令

遵循SQL92的标准(SQL_MODE)

1、SQL常用种类

种类说明
DDL数据定义语言
DCL数据控制语言
DML数据操作语言
DQL数据查询语言

2、数据库的逻辑结构

名字使用小写字符;不能以数字开头;不能是数据库内部的关键字;必须设置字符集表名小写字母,不能数字开头,不能是保留字符,使用和业务有关的表名
属性字符集,排序规则存储引擎类型,字符集,排序规则数据类型,约束,其他属性

3、字符集 (charset)

常用字符集
utf83个字节
utf8mb4 (建议)4个字节,支持emoji

1、设置MySQL默认字符集

基于session会话

set character_set_client=utf8mb4;
# 主要用来设置客户端使用的字符集。
set character_set_database=utf8mb4;
# 主要用来设置默认创建数据库的编码格式,如果在创建数据库时没有设置编码格式,就按照这个格式设置。
set character_set_server=utf8mb4;
# 服务器安装时指定的默认编码格式,这个变量建议由系统自己管理,不要人为定义
set character_set_connection=utf8mb4;
# 主要用来设置连接数据库时的字符集,如果程序中没有指明连接数据库使用的字符集类型则按照这个字符集设置。
set character_set_results=utf8mb4;
# 数据库给客户端返回时使用的编码格式,如果没有指明,使用服务器默认的编码格式。
set character_set_system=utf8mb4;
# 数据库系统使用的编码格式,这个值一直是utf8,不需要设置,它是为存储系统元数据的编码格式。
set collation_connection=utf8mb4;
set collation_server=utf8mb4;
set collation_database=utf8mb4;

基于全局global

# 设置全局的数据库字符编码
set global character_set_database=utf8mb4;
set global character_ser_server=utf8mb4;

永久性改变,在配置文件中修改数据库的字符编码(需重启服务)

[mysqld]
character-set-server=utf8mb4 
[client]
default-character-set=utf8mb4 
[mysql]
default-character-set=utf8mb4

2、字符集的查看

查看MySQL支持的字符集

show charset;

+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+

查看MySQL已配置的默认字符设置

show variables like '%character%';

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

查看已配置的字符设置

show create database test1;
+----------+----------------------------------------------------------------------+
| Database | Create Database                                                      |
+----------+----------------------------------------------------------------------+
| test1    | CREATE DATABASE `test1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */    |
+----------+----------------------------------------------------------------------+

查看已配置的字符设置

show table status from 库名 like '表名';

查看表中字段已配置的字符设置

show full columns from 表名;

查看库中所有表的字符集设置

select TABLE_NAME,TABLE_COLLATION from information_schema.`TABLES`;

查看所有库所有表中的字段的字符集设置

select TABLE_SCHEMA ,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.`COLUMNS`

3、修改字符集

修改库的字符集

alter database 库名 default character set 字符集;

修改表的字符集

alter table 表名 convert to character set 字符集;

修改字段的字符集

alter table 表名 modify 字段名 字段属性 character set 字符集;

4、排序规则

排序规则说明
utf8mb4_general_ci大小写不敏感
utf8mb4_bin大小写敏感(可以存拼音,日文)

三、数据类型

1、数字

数字说明
整数tinyint 、int
浮点数

2、字符串

字符串说明
char(100)定长字符串类型,不管字符串长度多长,都立即分配100个字符长度的存储空间,未占满的空间使用"空格"填充
varchar(100)变长字符串类型,每次存储数据之前,都要先判断一下长度,按需分配此盘空间;会单独申请一个字符长度的空间存储字符长度(少于255,如果超过255以上,会占用两个存储空间)
enum枚举数据类型

3、时间

时间说明
datetime范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999
timestamp范围为从 1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999

四、DDL的应用

1、库的定义

1、创建数据库

mysql> create database zabbix charset utf8mb4 collate utf8mb4_bin;

2、查看库情况

mysql> show databases;              //查看所有库
mysql> create database zabbix;              //查看zabbix库创建详细信息

3、删除数据库(不代表生产操作)

mysql> drop database zabbix;

4、修改数据库字符集

注意:一定是从小往大了改,比如utf8--->utf8mb4

mysql> create database school;
Query OK, 1 row affected (0.00 sec)

mysql> show create database school;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| school   | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter database school charset utf8mb4;
Query OK, 1 row affected (0.00 sec)

mysql> show create database school;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| school   | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

2、表的定义

1、列属性

列属性说明
PRIMARY KEY主键约束,表中只能有一个,非空且唯一
NOT NULL非空约束,不允许空值
UNIQUE KEY唯一键约束,不允许重复值
DEFAULT默认值,一般配合 NOT NULL 一起使用
UNSIGNED无符号,一般是配合数字列,非负数
COMMENT注释
AUTO_INCREMENT自增长的列

2、建表规范

  1. 表名小写字母,不能数字开头
  2. 不能是保留字符,使用和业务有关的表名
  3. 选择合适的数据类型及长度
  4. 每个列设置 NOT NULL + DEFAULT .对于数据0填充,对于字符使用有效字符串填充
  5. 每个列设置注释
  6. 表必须设置存储引擎和字符集
  7. 主键列尽量是无关列数字列,最好是自增长
  8. enum类型不要保存数字,只能是字符串类型

3、查询建表信息

查看数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| blog               |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

在school库中创建表

mysql> use school;
Database changed
mysql> CREATE TABLE stu ( id INT PRIMARY KEY NOT NULL 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;
Query OK, 0 rows affected (0.02 sec)

查看当前库中存在的表

mysql> SHOW TABLES;
+------------------+
| Tables_in_school |
+------------------+
| stu              |
+------------------+
1 row in set (0.00 sec)

查看建表信息

mysql> SHOW CREATE TABLE stu;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                       |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| stu   | CREATE TABLE `stu` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `sname` varchar(255) NOT NULL COMMENT '姓名',
  `age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
  `gender` enum('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别',
  `intime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入学时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4             |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

查看表结构

mysql> DESC stu;
+--------+---------------------+------+-----+-------------------+----------------+
| Field  | Type                | Null | Key | Default           | Extra          |
+--------+---------------------+------+-----+-------------------+----------------+
| id     | int(11)             | NO   | PRI | NULL              | auto_increment |
| sname  | varchar(255)        | NO   |     | NULL              |                |
| age    | tinyint(3) unsigned | NO   |     | 0                 |                |
| gender | enum('m','f','n')   | NO   |     | n                 |                |
| intime | datetime            | NO   |     | CURRENT_TIMESTAMP |                |
+--------+---------------------+------+-----+-------------------+----------------+
5 rows in set (0.00 sec)

创建一个和表结构一样的表

mysql> CREATE TABLE test LIKE stu;
Query OK, 0 rows affected (0.00 sec)

mysql> DESC test;
+--------+---------------------+------+-----+-------------------+----------------+
| Field  | Type                | Null | Key | Default           | Extra          |
+--------+---------------------+------+-----+-------------------+----------------+
| id     | int(11)             | NO   | PRI | NULL              | auto_increment |
| sname  | varchar(255)        | NO   |     | NULL              |                |
| age    | tinyint(3) unsigned | NO   |     | 0                 |                |
| gender | enum('m','f','n')   | NO   |     | n                 |                |
| intime | datetime            | NO   |     | CURRENT_TIMESTAMP |                |
+--------+---------------------+------+-----+-------------------+----------------+
5 rows in set (0.00 sec)

4、修改表信息

在stu表中添加qq列

mysql> ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL COMMENT 'qq号';
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

在sname后加微信列

mysql> ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT '微信号' AFTER sname;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

在id列前加一个新列num

mysql> ALTER TABLE stu ADD num INT NOT NULL UNIQUE COMMENT '身份证' FIRST ;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC  stu;
+--------+---------------------+------+-----+-------------------+----------------+
| Field  | Type                | Null | Key | Default           | Extra          |
+--------+---------------------+------+-----+-------------------+----------------+
| num    | int(11)             | NO   | UNI | NULL              |                |
| id     | int(11)             | NO   | PRI | NULL              | auto_increment |
| sname  | varchar(255)        | NO   |     | NULL              |                |
| wechat | varchar(64)         | NO   | UNI | NULL              |                |
| age    | tinyint(3) unsigned | NO   |     | 0                 |                |
| gender | enum('m','f','n')   | NO   |     | n                 |                |
| intime | datetime            | NO   |     | CURRENT_TIMESTAMP |                |
| qq     | varchar(20)         | NO   |     | NULL              |                |
+--------+---------------------+------+-----+-------------------+----------------+
8 rows in set (0.00 sec)

修改sname数据类型的属性VARCHAR(255)为VARCHAR(64)

mysql> ALTER TABLE stu MODIFY sname VARCHAR(64) NOT NULL COMMENT '姓名';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

将gender 改为 sex 数据类型改为 CHAR 类型

mysql> ALTER TABLE stu CHANGE gender sex CHAR(4) NOT NULL COMMENT '性别';
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

5、删除列

删除刚才添加的列

mysql> ALTER TABLE stu DROP num;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE stu DROP qq;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE stu DROP wechat;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

五、DCL的应用

1、grant

2、revoke

权限管理: MySQL安装与基础管理

六、DML的应用

1、insert:数据插入

1、根据表结构插入数据

mysql> DESC stu;
+--------+---------------------+------+-----+-------------------+----------------+
| Field  | Type                | Null | Key | Default           | Extra          |
+--------+---------------------+------+-----+-------------------+----------------+
| id     | int(11)             | NO   | PRI | NULL              | auto_increment |
| sname  | varchar(64)         | NO   |     | NULL              |                |
| age    | tinyint(3) unsigned | NO   |     | 0                 |                |
| sex    | char(4)             | NO   |     | NULL              |                |
| intime | datetime            | NO   |     | CURRENT_TIMESTAMP |                |
+--------+---------------------+------+-----+-------------------+----------------+
5 rows in set (0.00 sec)

mysql> INSERT stu VALUES(1,'zs',18,'m',NOW());
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM stu;
+----+-------+-----+-----+---------------------+
| id | sname | age | sex | intime              |
+----+-------+-----+-----+---------------------+
|  1 | zs    |  18 | m   | 2020-09-06 15:59:36 |
+----+-------+-----+-----+---------------------+
1 row in set (0.00 sec)

2、按照规范插入数据

mysql> INSERT INTO stu(id,sname,age,sex,intime) VALUES (2,'ls',19,'f',NOW());
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM stu;
+----+-------+-----+-----+---------------------+
| id | sname | age | sex | intime              |
+----+-------+-----+-----+---------------------+
|  1 | zs    |  18 | m   | 2020-09-06 15:59:36 |
|  2 | ls    |  19 | f   | 2020-09-06 16:00:18 |
+----+-------+-----+-----+---------------------+
2 rows in set (0.00 sec)

3、 针对性的录入数据(其他行默认)

mysql> INSERT INTO stu(sname,age,sex) VALUES ('w5',11,'m');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM stu;
+----+-------+-----+-----+---------------------+
| id | sname | age | sex | intime              |
+----+-------+-----+-----+---------------------+
|  1 | zs    |  18 | m   | 2020-09-06 15:59:36 |
|  2 | ls    |  19 | f   | 2020-09-06 16:00:18 |
|  3 | w5    |  11 | m   | 2020-09-06 16:03:17 |
+----+-------+-----+-----+---------------------+
3 rows in set (0.00 sec)

4、一次性录入多行数据

mysql> INSERT INTO stu(sname,age,sex) VALUES ('aa',11,'m'),('bb',12,'f'),('cc',13,'m');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM stu;                                                       +----+-------+-----+-----+---------------------+
| id | sname | age | sex | intime              |
+----+-------+-----+-----+---------------------+
|  1 | zs    |  18 | m   | 2020-09-06 15:59:36 |
|  2 | ls    |  19 | f   | 2020-09-06 16:00:18 |
|  3 | w5    |  11 | m   | 2020-09-06 16:03:17 |
|  4 | aa    |  11 | m   | 2020-09-06 16:04:12 |
|  5 | bb    |  12 | f   | 2020-09-06 16:04:12 |
|  6 | cc    |  13 | m   | 2020-09-06 16:04:12 |
+----+-------+-----+-----+---------------------+
6 rows in set (0.00 sec)

2、update:数据更新

将stu表中所有sname更新为aaa

mysql> UPDATE stu SET sname='aaa';
Query OK, 6 rows affected (0.01 sec)
Rows matched: 6  Changed: 6  Warnings: 0

mysql> SELECT * FROM stu;
+----+-------+-----+-----+---------------------+
| id | sname | age | sex | intime              |
+----+-------+-----+-----+---------------------+
|  1 | aaa   |  18 | m   | 2020-09-06 15:59:36 |
|  2 | aaa   |  19 | f   | 2020-09-06 16:00:18 |
|  3 | aaa   |  11 | m   | 2020-09-06 16:03:17 |
|  4 | aaa   |  11 | m   | 2020-09-06 16:04:12 |
|  5 | aaa   |  12 | f   | 2020-09-06 16:04:12 |
|  6 | aaa   |  13 | m   | 2020-09-06 16:04:12 |
+----+-------+-----+-----+---------------------+
6 rows in set (0.00 sec)

将stu表中id为6的sname更新为bb

mysql> UPDATE stu SET sname='bb' WHERE id=6;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM stu;
+----+-------+-----+-----+---------------------+
| id | sname | age | sex | intime              |
+----+-------+-----+-----+---------------------+
|  1 | aaa   |  18 | m   | 2020-09-06 15:59:36 |
|  2 | aaa   |  19 | f   | 2020-09-06 16:00:18 |
|  3 | aaa   |  11 | m   | 2020-09-06 16:03:17 |
|  4 | aaa   |  11 | m   | 2020-09-06 16:04:12 |
|  5 | aaa   |  12 | f   | 2020-09-06 16:04:12 |
|  6 | bb    |  13 | m   | 2020-09-06 16:04:12 |
+----+-------+-----+-----+---------------------+
6 rows in set (0.00 sec)

3、delete:数据删除

1、删除表中所有数据

mysql> DELETE FROM stu;

2、删除表中id为9的数据

mysql> DELETE FROM stu WHERE id=9;
Query OK, 0 rows affected (0.00 sec)

4、使用update替代delete(生产中屏蔽delete功能)

mysql> ALTER TABLE stu ADD is_del TINYINT DEFAULT 0;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> UPDATE stu SET is_del=1 WHERE id=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM stu WHERE is_del=0;
+----+-------+-----+-----+---------------------+--------+
| id | sname | age | sex | intime              | is_del |
+----+-------+-----+-----+---------------------+--------+
|  1 | aaa   |  18 | m   | 2020-09-06 15:59:36 |      0 |
|  2 | aaa   |  19 | f   | 2020-09-06 16:00:18 |      0 |
|  4 | aaa   |  11 | m   | 2020-09-06 16:04:12 |      0 |
|  5 | aaa   |  12 | f   | 2020-09-06 16:04:12 |      0 |
|  6 | bb    |  13 | m   | 2020-09-06 16:04:12 |      0 |
+----+-------+-----+-----+---------------------+--------+
5 rows in set (0.00 sec)

七、DQL的应用

world数据库下载地址

mysql> use world
Database changed
mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set (0.00 sec)

mysql> desc city;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |城市序号
| Name        | char(35) | NO   |     |         |                |城市名字
| CountryCode | char(3)  | NO   | MUL |         |                |国家代码
| District    | char(20) | NO   |     |         |                |区域,省
| Population  | int(11)  | NO   |     | 0       |                |人口数
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

1、select 语句的应用

1、select单独使用的情况

mysql> select @@basedir;        //查看当前数据库的数据存储路径
mysql> select @@port;        //查看当前数据库的端口
mysql> select database();        //查看当前所在那个库
mysql> select now();        //查看当前时间

2、select 通用语法(单表)

1、SELECT 配合 FROM 子句使用

mysql> SELECT * FROM city;        //查询表中所有的信息

2、SELECT 配合 WHERE 子句使用

where等值条件查询

mysql> SELECT NAME,population FROM city 
WHERE countrycode='CHN';        //查询中国所有的城市名和人口数

where 配合比较判断查询(> < >= <=)

mysql> SELECT NAME,population FROM city 
WHERE population<100;        //世界上小于100人的城市名和人口数

where 配合逻辑连接符(and or)

mysql> SELECT NAME,population FROM city 
WHERE countrycode='CHN' AND population>8000000;        //查询中国人口数量大于1000w的城市名和人口

mysql> SELECT NAME,population FROM city 
WHERE countrycode='CHN' OR countrycode='USA';        //查询中国或美国的城市名和人口数

mysql> SELECT NAME,population FROM city 
WHERE population>5000000 AND population<6000000;        //查询人口数量在500w到600w之间的城市名和人口数

mysql> SELECT NAME,population FROM city 
WHERE population BETWEEN 5000000 AND 6000000;        //查询人口数量在500w到600w之间的城市名和人口数

where配合like子句模糊查询

mysql> SELECT * FROM city 
WHERE countrycode LIKE 'CH%';        //查询contrycode中带有CH开头,城市信息

where配合in语句

mysql> SELECT NAME,population FROM city 
WHERE countrycode IN ('CHN' ,'USA');        //查询中国或美国的城市信息

3、SELECT 配合 GROUP BY + 聚合函数子句(GROUP BY:分组)

聚合函数名称说明
count()用于计算满足条件的数据项数,返回int数据类型的值
sum()用于求和,只能用于精确或近似数字类型列(bit类型除外),忽略null值,不允许使用聚合函数和子查询
max()用于计算最大值,忽略null值。max函数可以使用于numeric、char、varchar、money、smallmoney、或datetime列,但不能用于bit列。不允许使用聚合函数和子查询
min()用于计算最小值,MIN函数可以适用于numeric、char、varchar或datetime、money或smallmoney列,但不能用于bit列。不允许使用聚合函数和子查询,忽略null值
avg()用于计算精确型或近似型数据类型的平均值,bit类型除外,忽略null值。AVG函数计算时将计算一组数的总和,然后除以为null的个数,得到平均值
GROUP_CONCAT()将组中的字符串连接成为具有各种选项的单个字符串显示
mysql> SELECT countrycode,COUNT(id) FROM city
GROUP BY countrycode;        //统计每个国家城市的个数

mysql> SELECT countrycode,SUM(population) FROM city 
GROUP BY countrycode;        //统计每个国家的总人口数

mysql> SELECT countrycode,COUNT(DISTINCT district) FROM city
GROUP BY countrycode;        //统计每个国家省的个数

mysql> SELECT district,SUM(population) FROM city 
WHERE countrycode='CHN'
GROUP BY district ;        //统计中国每个省的总人口数

mysql> SELECT district,COUNT(NAME) FROM city 
WHERE countrycode='CHN'
GROUP BY district ;        //统计中国每个省城市的个数

mysql> SELECT district,GROUP_CONCAT(NAME) FROM city 
WHERE countrycode='CHN'
GROUP BY district;        //统计中国每个省所属所有城市的名称
+----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| district       | GROUP_CONCAT(NAME)                                                                                                                                                                                                                                    |
+----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Anhui          | Hefei,Huainan,Bengbu,Wuhu,Huaibei,Ma´anshan,Anqing,Tongling,Fuyang,Suzhou,Liu´an,Chuzhou,Chaohu,Xuangzhou,Bozhou,Huangshan                                                                                                                            
| Fujian         | Fuzhou,Amoy [Xiamen],Nanping,Quanzhou,Zhangzhou,Sanming,Longyan,Yong´an,Fu´an,Fuqing,Putian,Shaowu                                                                                                                     
+----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
31 rows in set (0.01 sec)

4、SELECT 配合 HAVING子句(结果再处理)

mysql> SELECT countrycode,SUM(population) FROM city
GROUP BY countrycode
HAVING SUM(population)>50000000;        //统计所有总人口数大于5000w的国家

5、SELECT 配合 ORDER BY子句(排序:从小到大;DESC:从大到小)

mysql> SELECT countrycode,SUM(population) FROM city
GROUP BY countrycode
HAVING SUM(population)>50000000
ORDER BY SUM(population) DESC;        //统计所有总人口数大于5000w的国家并按照从大到小顺序排列

6、SELECT 配合 LIMIT子句(显示数量)

mysql> SELECT countrycode,SUM(population) FROM city
GROUP BY countrycode
HAVING SUM(population)>50000000
ORDER BY SUM(population) DESC 
LIMIT 3;        //统计所有总人口数大于5000w的国家并按照从大到小顺序排列,只显示前三名

mysql> SELECT countrycode,SUM(population) FROM city
GROUP BY countrycode
HAVING SUM(population)>50000000
ORDER BY SUM(population) DESC 
LIMIT 3,3;        //统计所有总人口数大于5000w的国家并按照从大到小顺序排列,显示4-6名

用法

LIMIT M,N     :跳过M行,显示一共N行
LIMIT Y OFFSET X: 跳过X行,显示一共Y行

7、union 和 union all (多个结果集集合并查询)

mysql> SELECT * FROM city WHERE countrycode='CHN'
UNION ALL 
SELECT * FROM city WHERE countrycode='USA';        //查询中国或者美国的城市信息

union all:不做去重复

union:会做去重操作

3、多表连接查询(内连接)

语法要求:
1、找到多张表之间的关联条件列
2、列书写时必须是:表名.列
3、所有涉及到的查询列,都放在select后
4、将所有的过滤、分组、排序等条件按顺序写在on的后面

查询世界上小于100人的城市,所在的国家名,国土面积,城市名,人口数

mysql> desc city;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql> desc country;
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field          | Type                                                                                  | Null | Key | Default | Extra |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Code           | char(3)                                                                               | NO   | PRI |         |       |
| Name           | char(52)                                                                              | NO   |     |         |       |
| Continent      | enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') | NO   |     | Asia    |       |
| Region         | char(26)                                                                              | NO   |     |         |       |
| SurfaceArea    | decimal(10,2)                                                                         | NO   |     | 0.00    |       |
| IndepYear      | smallint(6)                                                                           | YES  |     | NULL    |       |
| Population     | int(11)                                                                               | NO   |     | 0       |       |
| LifeExpectancy | decimal(3,1)                                                                          | YES  |     | NULL    |       |
| GNP            | decimal(10,2)                                                                         | YES  |     | NULL    |       |
| GNPOld         | decimal(10,2)                                                                         | YES  |     | NULL    |       |
| LocalName      | char(45)                                                                              | NO   |     |         |       |
| GovernmentForm | char(45)                                                                              | NO   |     |         |       |
| HeadOfState    | char(60)                                                                              | YES  |     | NULL    |       |
| Capital        | int(11)                                                                               | YES  |     | NULL    |       |
| Code2          | char(2)                                                                               | NO   |     |         |       |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
15 rows in set (0.00 sec)

mysql> select
country.name,        //国名
country.surfacearea,        //国土面积
city.name,        //城市名
city.population        //城市人口
from city        //city表
join country        //country表
on city.countrycode = country.code        //city表和country表的关联列(两列数据相同)
where city.population<100;        //人口<100
+----------+-------------+-----------+------------+
| name     | surfacearea | name      | population |
+----------+-------------+-----------+------------+
| Pitcairn |       49.00 | Adamstown |         42 |
+----------+-------------+-----------+------------+
1 row in set (0.00 sec)

4、查看数据库或表容量大小

查看所有数据库容量大小

select 
	table_schema as '数据库',
	sum(table_rows) as '记录数',
	sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
	sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
group by table_schema
order by sum(data_length) desc, sum(index_length) desc;

查看所有数据库各表容量大小

select 
	table_schema as '数据库',
	table_name as '表名',
	table_rows as '记录数',
	truncate(data_length/1024/1024, 2) as '数据容量(MB)',
	truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
order by data_length desc, index_length desc;

查看指定数据库容量大小

select 
	table_schema as '数据库',
	sum(table_rows) as '记录数',
	sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
	sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
where table_schema='mysql';

查看指定数据库各表容量大小

select 
	table_schema as '数据库',
	table_name as '表名',
	table_rows as '记录数',
	truncate(data_length/1024/1024, 2) as '数据容量(MB)',
	truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
where table_schema='mysql'
order by data_length desc, index_length desc;

八、元数据获取

1、information_schema的基本应用

mysql> use information_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> desc tables;         //有删减
+-----------------+---------------------+------+-----+---------+-------+
| Field           | Type                | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_SCHEMA    | varchar(64)         | NO   |     |         |       |表所在的库名
| TABLE_NAME      | varchar(64)         | NO   |     |         |       |表名
| ENGINE          | varchar(64)         | YES  |     | NULL    |       |存储引擎
| TABLE_ROWS      | bigint(21) unsigned | YES  |     | NULL    |       |数据行
| AVG_ROW_LENGTH  | bigint(21) unsigned | YES  |     | NULL    |       |平均行长度
| INDEX_LENGTH    | bigint(21) unsigned | YES  |     | NULL    |       |索引长度
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.00 sec)

显示所有的库和表的信息

mysql> SELECT table_schema,table_name 
FROM information_schema.tables;

查询所有innodb引擎的表

mysql> SELECT table_schema,table_name ,ENGINE
FROM information_schema.tables 
WHERE ENGINE='innodb';

统计world下的city表占用空间大小(表的数据量=平均行长度×行数+索引长度)单位:kb

AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH

mysql> SELECT table_name,(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)/1024
FROM information_schema.TABLES
WHERE table_schema='world' AND table_name='city';

统计world库数据量总大小

mysql> SELECT table_schema,SUM((AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH))/1024
FROM information_schema.TABLES
WHERE table_schema='world';

统计每个库的数据量大小,并按数据量从大到小排序

mysql> SELECT table_schema,SUM((AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH))/1024 AS total_KB
FROM information_schema.TABLES
GROUP BY table_schema
ORDER BY total_KB DESC;        //total_KB为别名

2、配合concat()函数拼接语句或命令

对所有数据库分库分表进行备份

# mysqldump -uroot -p123 world city >/bak/world_city.sql

mysql> SELECT
CONCAT("mysqldump -uroot -p123456",table_schema," ",table_name
," >/bak/",table_schema,"_",table_name,".sql")
FROM information_schema.tables;

对world库下所有表进行批量操作

mysql> ALTER TABLE world.city DISCARD TABLESPACE;

mysql> SELECT 
CONCAT("ALTER TABLE",table_schema,".",table_name,"DISCARD TABLESPACE;")
FROM information_schema.tables
WHERE table_schema='world';

3、show命令

提供元数据查询基础功能

语句说明
show databases查看数据库名
show tables查看表名
show create database xx查看建库语句
show create table xx查看建表语句
show processlist查看所有用户连接情况
show charset查看支持的字符集
show collation查看所有支持的校对规则
show grants for xx查看用户的权限信息
show variables like '%xx%'查看参数信息
show engines查看所有支持的存储引擎类型
show index from xxx查看表的索引信息
show engine innodb status\G查看innoDB引擎详细状态信息
show binary logs查看二进制日志的列表信息
show binlog events in ''查看二进制日志的事件信息
show master status查看mysql当前使用二进制日志信息
show slave status\G查看从库状态信息
show relaylog events in ''查看中继日志的事件信息
show status like ''查看数据库整体状态信息

show status like '%下面变量%';

Aborted_clients 							由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。 
Aborted_connects 							尝试已经失败的MySQL服务器的连接的次数。 
Connections 									试图连接MySQL服务器的次数。 
Created_tmp_tables 						当执行语句时,已经被创造了的隐含临时表的数量。 
Delayed_insert_threads 				正在使用的延迟插入处理器线程的数量。 
Delayed_writes								用INSERT DELAYED写入的行数。 
Delayed_errors 								用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。 
Flush_commands 								执行FLUSH命令的次数。 
Handler_delete 								请求从一张表中删除行的次数。 
Handler_read_first 						请求读入表中第一行的次数。 
Handler_read_key 							请求数字基于键读行。 
Handler_read_next 						请求读入基于一个键的一行的次数。 
Handler_read_rnd 							请求读入基于一个固定位置的一行的次数。 
Handler_update 								请求更新表中一行的次数。 
Handler_write 								请求向表中插入一行的次数。 
Key_blocks_used 							用于关键字缓存的块的数量。 
Key_read_requests 						请求从缓存读入一个键值的次数。 
Key_reads 										从磁盘物理读入一个键值的次数。 
Key_write_requests 						请求将一个关键字块写入缓存次数。 
Key_writes 										将一个键值块物理写入磁盘的次数。 
Max_used_connections 					同时使用的连接的最大数目。 
Not_flushed_key_blocks 				在键缓存中已经改变但是还没被清空到磁盘上的键块。 
Not_flushed_delayed_rows 			在INSERT DELAY队列中等待写入的行的数量。 
Open_tables 									打开表的数量。 
Open_files 										打开文件的数量。 
Open_streams 									打开流的数量(主要用于日志记载) 
Opened_tables 								已经打开的表的数量。 
Questions 										发往服务器的查询的数量。 
Slow_queries 									要花超过long_query_time时间的查询数量。 
Threads_connected 						当前打开的连接的数量。 
Threads_running 							不在睡眠的线程数量。 
Uptime 												服务器工作了多少秒。
0

评论区