文章目录
- 一. mysql内置的功能
- 1.连接数据库
- 2.内置命令
- 1.SQL介绍
- 2.SQL常用种类
- 3. SQL引入-数据库的逻辑结构
- 4. 字符集 (charset)
- 5. 排序规则: collation
- 6. 数据类型介绍
- 6.1 数字
- 6.2 字符串
- 6.3 时间
- 7.1 库的定义
- 7.2 关于库定义规范
- 7.3 DDL-表定义
- 7.4 DCL
- 7.5 DML
- 8.1 select 语句的应用
- 8.1.1 select单独使用的情况
- 8.1.2 select 通用语法(单表)
- 1.环境准备
- 2.SELECT 配合 FROM 子句使用
- 3.SELECT 配合 WHERE 子句使用
- 4.SELECT 配合GROUP BY+聚合函数应用
- 4.1 常用聚合函数介绍
- 4.2 GROUP BY
- 11.1 作用
- 11.2 多表连接基本语法要求
一. mysql内置的功能
1.连接数据库
u-p-S-h-P-e<例子:1. mysql -uroot -p -S /tmp/mysql.sock(完整socket连接方式)(密码是123456)2. mysql -uroot -p -h10.0.0.51 -P3306(远程连接方式) (密码是123)3. -e 免交互执行sql语句[root@db01 ~]# mysql -uroot -p -e \"show databases;\" (密码是123456)4. < 恢复数据[root@db01 ~]# mysql -uroot -p123456 </root/world.sql
2.内置命令
help 打印mysql帮助\\c ctrl+c 结束上个命令运行\\q quit; exit; ctrl+d 退出mysql\\G 将数据竖起来显示source 恢复备份文件
二.SQL基础应用
1.SQL介绍
结构化的查询语言关系型数据库通用的命令遵循SQL92的标准(SQL_MODE)
2.SQL常用种类
DDL 数据定义语言DCL 数据控制语言DML 数据操作语言DQL 数据查询语言
3. SQL引入-数据库的逻辑结构
库库名字库属性:字符集,排序规则表表名表属性:存储引擎类型,字符集,排序规则列名列属性:数据类型,约束,其他属性数据行
4. 字符集 (charset)
相当于MySQL的密码本(编码表)show charset;utf8 : 3个字节utf8mb4 (建议): 4个字节,支持emoji
5. 排序规则: collation
mysql> show collation;对于英文字符串的,大小写的敏感utf8mb4_general_ci 大小写不敏感utf8mb4_bin 大小写敏感(存拼音,日文)
6. 数据类型介绍
6.1 数字
整数tinyintint浮点数略
6.2 字符串
char(100)定长字符串类型,不管字符串长度多长,都立即分配100个字符长度的存储空间,未占满的空间使用\"空格\"填充varchar(100)变长字符串类型,每次存储数据之前,都要先判断一下长度,按需分配磁盘空间.会单独申请一个字符长度的空间存储字符长度(少于255,如果超过255以上,会占用两个存储空间)如何选择这两个数据类型?1. 少于255个字符串长度,定长的列值,选择char2. 多于255字符长度,变长的字符串,可以选择varcharenum 枚举数据类型address enum(\'sz\',\'sh\',\'bj\'.....)1 2 3悬念,以上数据类型可能会影响到索引的性能
6.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。
7. DDL的应用
(用软件SQLyog操作)
7.1 库的定义
创建数据库CREATE DATABASE zabbix CHARSET utf8mb4 COLLATE utf8mb4_bin;--- 查看库情况SHOW DATABASES;SHOW CREATE DATABASE zabbix;--- 删除数据库(不代表生产操作)DROP DATABASE zabbix;--- 修改数据库字符集--- 注意: 一定是从小往大了改,比如utf8--->utf8mb4.--- 目标字符集一定是源字符集的严格超级.CREATE DATABASE lsn;SHOW CREATE DATABASE lsn;ALTER DATABASE lsn CHARSET utf8mb4;
7.2 关于库定义规范
--- 1.库名使用小写字符--- 2.库名不能以数字开头--- 3.不能是数据库内部的关键字--- 4.必须设置字符集.
7.3 DDL-表定义
建表表名,列名,列属性,表属性--- 列属性PRIMARY KEY : 主键约束,表中只能有一个,非空且唯一.NOT NULL : 非空约束,不允许空值UNIQUE KEY : 唯一键约束,不允许重复值DEFAULT : 一般配合 NOT NULL 一起使用.UNSIGNED : 无符号,一般是配合数字列,非负数COMMENT : 注释AUTO_INCREMENT : 自增长的列mysql> use lsn;Database changedmysql> 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.04 sec)(字符串要加单引号,数字不用,要能够做到审核)--- 建表规范 *****--- 1. 表名小写字母,不能数字开头,--- 2. 不能是保留字符,使用和业务有关的表名--- 3. 选择合适的数据类型及长度--- 4. 每个列设置 NOT NULL + DEFAULT .对于数据0填充,对于字符使用有效字符串填充--- 5. 每个列设置注释--- 6. 表必须设置存储引擎和字符集--- 7. 主键列尽量是无关列数字列,最好是自增长--- 8. enum类型不要保存数字,只能是字符串类型--- 查询建表信息SHOW TABLES;SHOW CREATE TABLE stu;DESC stu;(查看列情况)--- 创建一个表结构一样的表CREATE TABLE test LIKE stu;--- 删表(不代表生产操作)DROP TABLE test;--- 修改--- 在stu表中添加qq列 *****mysql>ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL COMMENT \'qq号\';(对生产的性能影响比较大)pt-osc(在线DDL时,减少索表情况)--- 在sname后加微信列 ***ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT \'微信号\' AFTER sname;--- 在id列前加一个新列num ***ALTER TABLE stu ADD num INT NOT NULL UNIQUE COMMENT \'身份证\' FIRST ;--- 把刚才添加的列都删掉(危险,不代表生产操作) ***ALTER TABLE stu DROP num;DESC stu;ALTER TABLE stu DROP qq;ALTER TABLE stu DROP wechat;--- 修改sname数据类型的属性 ***DESC stu;ALTER TABLE stu MODIFY sname VARCHAR(64) NOT NULL COMMENT \'姓名\';--- 将gender 改为 sex 数据类型改为 CHAR 类型 ***ALTER TABLE stu CHANGE gender sex CHAR(4) NOT NULL COMMENT \'性别\';
7.4 DCL
grantrevoke
7.5 DML
insertDESC stu;--- 最偷懒INSERT stu VALUES(1,\'zs\',18,\'m\',NOW());SELECT * FROM stu;--- 最规范INSERT INTO stu(id,sname,age,sex,intime)VALUES (2,\'ls\',19,\'f\',NOW());--- 针对性的录入数据INSERT INTO stu(sname,age,sex)VALUES (\'w5\',11,\'m\');--- 一次性录入多行INSERT INTO stu(sname,age,sex)VALUES(\'aa\',11,\'m\'),(\'bb\',12,\'f\'),(\'cc\',13,\'m\');-- update(一定要加where条件)UPDATE stu SET sname=\'aaa\';SELECT * FROM stu;UPDATE stu SET sname=\'bb\' WHERE id=6;-- delete (一定要有where条件)DELETE FROM stu;DELETE FROM stu WHERE id=9;-- 生产中屏蔽delete功能--- 使用update替代deleteALTER TABLE stu ADD is_del TINYINT DEFAULT 0 ;UPDATE stu SET is_del=1 WHERE id=7;SELECT * FROM stu WHERE is_del=0;
8.DQL 介绍
select (查看内容)show (查看属性类)
8.1 select 语句的应用
8.1.1 select单独使用的情况
mysql> select @@basedir;mysql> select @@port;mysql> select @@innodb_flush_log_at_trx_commit;mysql> show variables like \'innodb%\';mysql> use worldmysql> select database();mysql> select now();
8.1.2 select 通用语法(单表)
select 列from 表where 条件group by 条件having 条件order by 条件limit
三.select练习
1.环境准备
先导入world数据库[root@web01 ~]# cd /usr[root@web01 usr]# rz -E #上传 world.sqlmysql> CREATE DATABASE world CHARSET utf8mb4 COLLATE utf8mb4_bin;mysql> use worldmysql> source /usr/world.sql;mysql> show tables;city 城市表country 国家表countrylanguage 国家的语言city表结构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)ID : 城市序号(1-...)name : 城市名字countrycode : 国家代码,例如:CHN,USAdistrict : 区域: 中国 省 美国 洲population : 人口数mysql> show create table city;(查看注释)
2.SELECT 配合 FROM 子句使用
select 列,列,列 from 表--- 例子:1)查询表中所有的信息(生产中几乎是没有这种需求的)USE world ;SELECT id,NAME ,countrycode ,district,population FROM city;或者:SELECT * FROM city;2)查询表中 name和population的值SELECT NAME ,population FROM city;
3.SELECT 配合 WHERE 子句使用
select 列,列,列 from 表 where 过滤条件-- where等值条件查询 *****例子:1) 查询中国所有的城市名和人口数SELECT NAME,population FROM cityWHERE countrycode=\'CHN\';-- where 配合比较判断查询(> < >= <=) *****例子:2)世界上小于100人的城市名和人口数SELECT NAME,population FROM cityWHERE population<100;-- where 配合 逻辑连接符(and or)例子:3)查询中国人口数量大于1000w的城市名和人口SELECT NAME,population FROM cityWHERE countrycode=\'CHN\' AND population>8000000;4)查询中国或美国的城市名和人口数SELECT NAME,population FROM cityWHERE countrycode=\'CHN\' OR countrycode=\'USA\';5) 查询人口数量在500w到600w之间的城市名和人口数SELECT NAME,population FROM cityWHERE population>5000000 AND population<6000000;或者:SELECT NAME,population FROM cityWHERE population BETWEEN 5000000 AND 6000000;-- where 配合 like 子句 模糊查询 *****例子:1)查询一下contrycode中带有CH开头,城市信息SELECT * FROM cityWHERE countrycode LIKE \'CH%\';注意:不要出现类似于 %CH%,前后都有百分号的语句,因为不走索引,性能极差如果业务中有大量需求,我们用\"ES\"来替代-- where 配合 in 语句例子:1)查询中国或美国的城市信息.SELECT NAME,population FROM cityWHERE countrycode=\'CHN\' OR countrycode=\'USA\';或者:SELECT NAME,population FROM cityWHERE countrycode IN (\'CHN\' ,\'USA\');
4.SELECT 配合GROUP BY+聚合函数应用
4.1 常用聚合函数介绍
MAX(),MIN(),AVG(),COUNT(),SUM()GROUP_CONCAT()
4.2 GROUP BY
将某列中有共同条件的数据行,分成一组,然后在进行聚合函数操作.例子:1. 统计每个国家,城市的个数SELECT countrycode ,COUNT(id) FROM cityGROUP BY countrycode;2. 统计每个国家的总人口数.SELECT countrycode,SUM(population) FROM cityGROUP BY countrycode;3. 统计每个 国家 省 的个数SELECT countrycode,COUNT(DISTINCT district) FROM cityGROUP BY countrycode;(DISTINCT去重)4. 统计中国 每个省的总人口数SELECT district, SUM(population) FROM cityWHERE countrycode=\'CHN\'GROUP BY district ;5. 统计中国 每个省城市的个数SELECT district, COUNT(NAME) FROM cityWHERE countrycode=\'CHN\'GROUP BY district ;6. 统计中国 每个省城市的名字列表GROUP_CONCAT()guangdong guangzhou,shenzhen,foshan....SELECT district, GROUP_CONCAT(NAME) FROM cityWHERE countrycode=\'CHN\'GROUP BY district ;7. 小扩展anhui : hefei,huaian ....SELECT CONCAT(district,\":\" ,GROUP_CONCAT(NAME)) FROM cityWHERE countrycode=\'CHN\'GROUP BY district ;
5.SELECT 配合 HAVING 应用ORDER BY 子句
例子:1. 统计所有国家的总人口数量,将总人口数大于5000w的过滤出来,并且按照从大到小顺序排列SELECT countrycode,SUM(population) FROM cityGROUP BY countrycodeHAVING SUM(population)>50000000ORDER BY SUM(population) DESC ;
6.SELECT 配合 LIMIT 子句
例子:1. 统计所有国家的总人口数量,将总人口数大于5000w的过滤出来,并且按照从大到小顺序排列,只显示前三名SELECT countrycode,SUM(population) FROM cityGROUP BY countrycodeHAVING SUM(population)>50000000ORDER BY SUM(population) DESCLIMIT 3 OFFSET 0;SELECT countrycode,SUM(population) FROM cityGROUP BY countrycodeHAVING SUM(population)>50000000ORDER BY SUM(population) DESCLIMIT 3 OFFSET 3LIMIT M,N :跳过M行,显示一共N行LIMIT Y OFFSET X: 跳过X行,显示一共Y行
7.练习题:
1. 统计中国每个省的总人口数,只打印总人口数小于100w的SELECT district ,SUM(population) FROM cityWHERE countrycode=\'CHN\'GROUP BY districtHAVING SUM(population)<1000000;2. 查看中国所有的城市,并按人口数进行排序(从大到小)SELECT * FROM city WHERE countrycode=\'CHN\'ORDER BY population DESC;3. 统计中国各个省的总人口数量,按照总人口从大到小排序SELECT district ,SUM(population) FROM cityWHERE countrycode=\'CHN\'GROUP BY districtORDER BY SUM(population) DESC ;4. 统计中国,每个省的总人口,找出总人口大于500w的,并按总人口从大到小排序,只显示前三名SELECT district ,SUM(population) FROM cityWHERE countrycode=\'CHN\'GROUP BY districtHAVING SUM(population)>5000000ORDER BY SUM(population) DESCLIMIT 3;
8.小结
语句执行顺序select disctrict , count(name) from citywhere countrycode=\'CHN\'group by districthaving count(name) >10order by count(name) desclimit 3;
9.union 和 union all
作用: 多个结果集合并查询的功能需求: 查询中或者美国的城市信息SELECT * FROM city WHERE countrycode=\'CHN\' OR countrycode=\'USA\';改写为:(性能比or语句好很多)SELECT * FROM city WHERE countrycode=\'CHN\'UNION ALLSELECT * FROM city WHERE countrycode=\'USA\';union 和 union all 的区别 ?union all 不做去重复union 会做去重操作
11.多表连接查询(内连接)
11.1 作用
单表数据不能满足查询需求时.例子: 查询世界上小于100人的城市,所在的国家名,国土面积,城市名,人口数city:SELECT countrycode,NAME,population FROM city WHERE population<100;PCN Adamstown 42countryDESC country;CODENAMESurfaceAreaSELECT NAME ,SurfaceArea FROM country WHERE CODE=\'PCN\';Pitcairn49.00
11.2 多表连接基本语法要求
1.最核心的是,找到多张表之间的关联条件列2.列书写时,必须是:表名.列3.所有涉及到的查询列,都放在select后4.将所有的过滤,分组,排序等条件按顺序写在on的后面SELECTcountry.name,country.SurfaceArea,city.name,city.population,FROM cityJOIN countryON city.CountryCode=country.codeWHERE city.population<1005.多张表AJOIN BON A.x=B.yJOIN CON B.m=C.n
四.学生管理系统
use schoolstudent :学生表sno: 学号sname:学生姓名sage: 学生年龄ssex: 学生性别teacher :教师表tno: 教师编号tname:教师名字course :课程表cno: 课程编号cname:课程名字tno: 教师编号score :成绩表sno: 学号cno: 课程编号score:成绩-- 项目构建drop database school;CREATE DATABASE school CHARSET utf8;USE schoolCREATE TABLE student(sno INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT \'学号\',sname VARCHAR(20) NOT NULL COMMENT \'姓名\',sage TINYINT UNSIGNED NOT NULL COMMENT \'年龄\',ssex ENUM(\'f\',\'m\') NOT NULL DEFAULT \'m\' COMMENT \'性别\')ENGINE=INNODB CHARSET=utf8;CREATE TABLE course(cno INT NOT NULL PRIMARY KEY COMMENT \'课程编号\',cname VARCHAR(20) NOT NULL COMMENT \'课程名字\',tno INT NOT NULL COMMENT \'教师编号\')ENGINE=INNODB CHARSET utf8;CREATE TABLE sc (sno INT NOT NULL COMMENT \'学号\',cno INT NOT NULL COMMENT \'课程编号\',score INT NOT NULL DEFAULT 0 COMMENT \'成绩\')ENGINE=INNODB CHARSET=utf8;CREATE TABLE teacher(tno INT NOT NULL PRIMARY KEY COMMENT \'教师编号\',tname VARCHAR(20) NOT NULL COMMENT \'教师名字\')ENGINE=INNODB CHARSET utf8;INSERT INTO student(sno,sname,sage,ssex)VALUES (1,\'zhang3\',18,\'m\');INSERT INTO student(sno,sname,sage,ssex)VALUES(2,\'zhang4\',18,\'m\'),(3,\'li4\',18,\'m\'),(4,\'wang5\',19,\'f\');INSERT INTO studentVALUES(5,\'zh4\',18,\'m\'),(6,\'zhao4\',18,\'m\'),(7,\'ma6\',19,\'f\');INSERT INTO student(sname,sage,ssex)VALUES(\'oldboy\',20,\'m\'),(\'oldgirl\',20,\'f\'),(\'oldp\',25,\'m\');INSERT INTO teacher(tno,tname) VALUES(101,\'oldboy\'),(102,\'hesw\'),(103,\'oldguo\');DESC course;INSERT INTO course(cno,cname,tno)VALUES(1001,\'linux\',101),(1002,\'python\',102),(1003,\'mysql\',103);DESC sc;INSERT INTO sc(sno,cno,score)VALUES(1,1001,80),(1,1002,59),(2,1002,90),(2,1003,100),(3,1001,99),(3,1003,40),(4,1001,79),(4,1002,61),(4,1003,99),(5,1003,40),(6,1001,89),(6,1003,77),(7,1001,67),(7,1003,82),(8,1001,70),(9,1003,80),(10,1003,96);SELECT * FROM student;SELECT * FROM teacher;SELECT * FROM course;SELECT * FROM sc;student :学生表===============sno: 学号sname:学生姓名sage: 学生年龄ssex: 学生性别teacher :教师表================tno: 教师编号tname:教师名字course :课程表===============cno: 课程编号cname:课程名字tno: 教师编号score :成绩表==============sno: 学号cno: 课程编号score:成绩1.多表连接例子-- 1. 统计zhang3,学习了几门课SELECT student.sname,COUNT(sc.cno)FROM student JOIN scON student.sno=sc.snoWHERE student.sname=\'zhang3\';-- 2. 查询zhang3,学习的课程名称有哪些?SELECT student.sname,GROUP_CONCAT(course.cname)FROM studentJOIN scON student.sno=sc.snoJOIN courseON sc.cno=course.cnoWHERE student.sname=\'zhang3\'GROUP BY student.sname;-- 3. 查询oldguo老师教的学生名和个数.SELECT teacher.tname,GROUP_CONCAT(student.sname),COUNT(student.sname)FROM teacherJOIN courseON teacher.tno=course.tnoJOIN scON course.cno=sc.cnoJOIN studentON sc.sno=student.snoWHERE teacher.tname=\'oldguo\'GROUP BY teacher.tname;-- 4. 查询oldguo所教课程的平均分数SELECT teacher.tname,AVG(sc.score)FROM teacherJOIN courseON teacher.tno=course.tnoJOIN scON course.cno=sc.cnoWHERE teacher.tname=\'oldguo\'GROUP BY sc.cno;(有可能不止教一门,所以需要分组)-- 5. 每位老师所教课程的平均分,并按平均分排序SELECT teacher.tname,course.cname,AVG(sc.score)FROM teacherJOIN courseON teacher.tno=course.tnoJOIN scON course.cno=sc.cnoGROUP BY teacher.tname,course.cnameORDER BY AVG(sc.score)-- 6. 查询oldguo所教的不及格的学生姓名SELECT teacher.tname,student.sname,sc.scoreFROM teacherJOIN courseON teacher.tno=course.tnoJOIN scON course.cno=sc.cnoJOIN studentON sc.sno=student.snoWHERE teacher.tname=\'oldguo\' AND sc.score<60-- 7. 查询所有老师所教学生不及格的信息(扩展)SELECT teacher.tname,GROUP_CONCAT(CONCAT(student.sname,\":\",sc.score))FROM teacherJOIN courseON teacher.tno=course.tnoJOIN scON course.cno=sc.cnoJOIN studentON sc.sno=student.snoWHERE sc.score<60GROUP BY teacher.tno-- 8.别名应用表别名 :SELECT t.tname,GROUP_CONCAT(CONCAT(st.sname,\":\",sc.score))FROM teacher as tJOIN course as cON t.tno=c.tnoJOIN scON c.cno=sc.cnoJOIN student as stON sc.sno=st.snoWHERE sc.score<60GROUP BY t.tno表别名是全局调用的.列别名:SELECT t.tname as 讲师名 ,GROUP_CONCAT(CONCAT(st.sname,\":\",sc.score)) as 不及格的FROM teacher as tJOIN course as cON t.tno=c.tnoJOIN scON c.cno=sc.cnoJOIN student as stON sc.sno=st.snoWHERE sc.score<60GROUP BY t.tno列别名可以被 having 和 order by 调用1. 上节回顾1.1 group by (先排序,再去重)当有统计类需求时使用,不能一对多1.2 关于group by的sql_modeonly_full_group_by说明:1. 在5.7版本中MySQL sql_mode参数中自带,5.6和8.0都没有2. 在带有group by 字句的select中,select 后的条件列(非主键列),要么是group by后的列,要么需要在函数中包裹1.3 group_concat列转行聚合函数mysql> select user,group_concat(host) from mysql.user group by user;1.4 concat做列值拼接mysql> select concat(user,\"@\",host) from mysql.user;1.5 关于多表连接语法规则1.首先找涉及到的所有表2.找到表和表之间的关联列3.关联条件写在on后面A join B on 关联列4. 所有需要查询的信息放在select后5. 其他的过滤条件where group by having order by limit 往最后放6.(有关性能的操作)注意:对多表连接中,驱动表(第一张表)选择数据行少的表。后续所有表的关联列尽量是主键或唯一键(在表设计时设置),至少建立一个索引。1.6 别名表别名列别名countoldguo linux a,b,c,doldguo python x,y,zoldboy linux 10hsw python 111.7 distinct(去重)mysql> select count(distinct countrycode) from city;1.8 select 执行顺序select user ,count(name) from 表 where 列 group by user having 列 order by 列 ;2. 扩展类内容-元数据获取 ***2.0 元数据介绍及获取介绍元数据是存储在\"基表\"中。通过专用的DDL语句,DCL语句进行修改通过专用视图和命令进行元数据的查询information_schema中保存了大量元数据查询的试图show 命令是封装好功能,提供元数据查询基础功能2.1 information_schema的基本应用 ***tables 视图的应用mysql>create view aa as 语句;(创建视图)mysql>select * from aa; (查询视图)mysql> use information_schema;mysql> show tables;mysql> desc tables;(tables保存了整个数据库范围内所有表的元数据)TABLE_SCHEMA 表所在的库名TABLE_NAME 表名ENGINE 存储引擎TABLE_ROWS 数据行AVG_ROW_LENGTH 平均行长度INDEX_LENGTH 索引长度例子:(在SQLYOG中进行)(不用记,会用就行)USE information_schema;DESC TABLES;-- 1. 显示所有的库和表的信息SELECT table_schema,table_name FROM information_schema.tables;-- 2. 以以下模式 显示所有的库和表的信息-- world city,country,countrylanguageSELECT table_schema,GROUP_CONCAT(table_name)FROM information_schema.tablesGROUP BY table_schema;-- 3. 查询所有innodb引擎的表SELECT table_schema,table_name ,ENGINEFROM information_schema.tablesWHERE ENGINE=\'innodb\';-- 4. 统计world下的city表占用空间大小-- 表的数据量=平均行长度*行数+索引长度-- AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTHSELECT table_name,(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)/1024FROM information_schema.TABLESWHERE table_schema=\'world\' AND table_name=\'city\';-- 5. 统计world库数据量总大小SELECT table_schema,SUM((AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH))/1024FROM information_schema.TABLESWHERE table_schema=\'world\';-- 6. 统计每个库的数据量大小,并按数据量从大到小排序SELECT table_schema,SUM((AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH))/1024 AS total_KBFROM information_schema.TABLESGROUP BY table_schemaORDER BY total_KB DESC ;2.2 配合concat()函数拼接语句或命令(项目当中用到的语句)例子:-- 1. 模仿以下语句,进行数据库的分库分表备份。mysqldump -uroot -p123 world city >/bak/world_city.sqlSELECTCONCAT(\"mysqldump -uroot -p123 \",table_schema,\" \",table_name,\" >/bak/\",table_schema,\"_\",table_name,\".sql\")FROM information_schema.tables;-- 2. 模仿以下语句,进行批量生成对world库下所有表进行操作ALTER TABLE world.city DISCARD TABLESPACE;SELECTCONCAT(\"ALTER TABLE \",table_schema,\".\",table_name,\" DISCARD TABLESPACE;\")FROM information_schema.tablesWHERE table_schema=\'world\';(不变的用引号引起来)
五.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 \'\' 查看数据库整体状态信息