mysql 数据库DBA课程03_04 SQL基础应用information_schema

group by 的执行过程,先排序,再去重查询mysql 中的用户,允许那些网段登录。
select user,group_concat(host) from mysql.user group by user;



only_full_group_by
说明:
在mysql 5.7版本中,sql_mode参数中自带,在5.6 中没有,8.0中又取消了。
在带有group by 字句的selct 语句中,select 后面跟的列(非主键列),要么是group by 后面的列,要么需要在聚合函数中包裹。
select user,host from mysql.user group by user; # 这条语句在mysql 5.7 中会报错。
select user,group_concat(host) from mysql.user group by user;
mysql 5.7 关闭only_full_group_by


如果关掉only_full_group_by 在有group by 子句的select 语句中,有重复的数据时,只会取第一个


关于多表连接语法规则
1、首先找涉及到的所有表
2、找到表和表之间的关联列
3、关联条件写在ON后面
4、所有需要查询的信息放在select 后
5、其他的过滤条件 where group by having order by limit 往最后放
注意(和性能有关): 对多表连接中,驱动表(from后的第一张表)选择数据行少的表,后续所有表的关联列尽量是主键或者唯一键(表设计的时候),如果不能保证,至少建立一个索引

++++++++++++ 扩展类 内容--------元数据获取
元数据介绍:
是存储在"基表"中。
只能通过专用的DDL语句,DCL语句进行修改。比如create database abc;

通过专用视图和命令进行 元数据 的查询。
information_schema 中保存了大量 元数据 查询的视图
show 命令是封装好的功能,提供元数据查询的一些基础功能 ****
++++++++++++++++++++information_schema 的基本应用 ***
information_schema 是一个虚拟库,主要是收集各个库的信息,在每次启动mysql 的时候会自动生成,不占用空间,运行在内存里面。相当于一个内存视图。
视图:(将我们经常用到的查询语句,起个别名。以后只需要查询这个别名就可以了。)
create view abc
as
select teacher.tname,group_concat(student.sname),count(student.sname) from teacher join course on teacher.tno=course.tno join score on course.cno=score.cno join student on score.sno=student.sno where teacher.tname='oldguo' group by teacher.tno;
select * from abc;


use information_schema;
desc tables;


TABLE_SCHEMA 表所在的库名
TABLE_NAME 表名
ENGINE 存储引擎
TABLE_ROWS 数据行
AVG_ROW_LENGTH 平均行长度
INDEX_LENGTH 索引长度
应用实例:
查询mysql 中,所有库和表的信息
use information_schema;
select table_schema,table_name from information_schema.tables;
扩展:
select table_schema,group_concat(table_name) from information_schema.tables group by table_schema;



查询一下,所有innodb引擎的表
select table_schema,table_name,engine from information_schema.tables where engine='innodb';
---- 统计 world 库的 city 表占用空间大小,以KB显示
平均行长度 * 行数 + 索引长度 = 一张表的数据量的真实大小
AVG_ROW_LENGTH * TABLE_ROWS + INDEX_LENGTH
select table_name, (avg_row_length*table_rows+index_length)/1024 from information_schema.tables where table_schema='world' and table_name='city'; ##以KB显示


统计 world 库,数据量总大小,以KB显示
select table_schema, sum((avg_row_length*table_rows+index_length))/1024 from information_schema.tables where table_schema='world';


统计mysql 中,每个库的数据量大小,以KB显示。
select table_schema, sum((avg_row_length*table_rows+index_length))/1024 from information_schema.tables;


统计每个库的数据量大小,并按数据量从大到小排序
select table_schema,sum((avg_row_length*table_rows+index_length))/1024 as data_k from information_schema.tables group by table_schema order by data_k desc;

+++++++ 配合concat()函数拼接语句或命令
例子:模仿以下语句,进行数据库的分库分表备份
mysqldump -uroot -p123 world city >/bak/world_city.sql
select concat('mysqldump -uroot -p123',' ',table_schema,' ',table_name,'>/bak/table_schema_table_name.sql;') from information_schema.tables;


模仿以下语句,进行批量生成对world库下所有表进行操作
alter table world.city discard tablespace;
select concat('alter table',' ',table_schema,'.',table_name,' ','discard tablespace;') from information_schema.tables where table_schema='world';

+++++ show 介绍 ****
show databases;            查看数据库名
show tables;               查看表名
show create database xx;   查看 建库语句
show create table xx;      查看 建表语句
show processlist;          查看所有用户连接情况
show charset;              查看支持的字符集
show collation;            查看所有支持的校对规则
show grants from 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 ' ';           查看数据库整体状态信息