day05

2019-06-20  本文已影响0人  藏鋒1013

一、去重名:DISTINCT

1.格式:

SELECT DISTINCT(列名)
FROM 表名;

二、别名:AS

1.表别名

select a.time,group_concat(d.sname)
from teacher AS a
join course AS b
on a.tno = b.tno
join score AS c
on b.cno = c.cno
jion student AS d
on c.sno = d.sno
where a.tname='oldguo' AND c.score<60
group by a.tno;

2.列别名

select count(distinct(name)) as 个数 from world.city;

三、外连接

left join

左外连接:

select a.name,b.name,b.surfacearea
from city AS a
left join country AS b
on a.countrycode=b.code
where a.population<100;

四、information_schema.tables

1.元数据

---->'基表'(无法直接查询和修改)
---->DDL 进行元数据修改
---->show,desc(show),information_schema(全局类的统计和查询)

use information_schema;
desc tables;


TABLE_SCHEMA ###表所在的库
TABLE_NAME  ###表名
ENGINE  ###表的存储引擎
TABLE_ROWS ###表的行数
AVG_ROW_LENGTH ###平均行长度
INDEX_LENGTH  ###索引的长度
--- 含义
TABLE_SCHEMA 表所在的库
TABLE_NAME 表名
ENGINE 表的存储引擎
TABLE_ROWS 表的行数
AVG_ROW_LENGTH 平均行长度
INDEX_LENGTH 索引的长度

2.例子:

(1)查询整个数据库中所有的库名对应的表名

SELECT table_schema,table_name
FROM information_schema.tables;

(2)查询world和school库下的所有表

SELECT table_schema,table_name
FROM information_schema.tables
WHERE table_schema='world'
UNION ALL
SELECT table_schema,table_name
FROM information_schema.tables
WHERE table_schema='school'

(3)查询整个数据库中所有库对应的表名,每个库显示成一行

SELECT table_schema,GROUP_CONCAT(table_name)
FROM information_schema.tables
GROUP BY table_schema;

(4)统计一下每个库下的表的个数

select table_schema,count(table_name)
from information_schema.tables
group by table_schema;

(5)统计一下每个库的真实数据量

select table_schema,sum(avg_row_length*table_rows+index_length)
from information_schema.tables
group by table_schema;

3. information_schema.tables+CONCAT()拼接命令

使用方法:

select user,host from mysql.user

select concat(user,"@",host)
from mysql.user;
或者:
select concat(user,"@","'",host,"'")
from mysql.user;

生产需求1:

模仿下面命令,对整个数据库下的1000张表进行单独备份。

mysqldump -uroot -p123 world city >/tmp/world_city.sql;

解答:

select concat("mysqldump -uroot -p123 ",table_schema," ",table_name," >/tmp/",table_schema,"_",table_name,".sql;")
from information_schema.tables;

排除sys,performance,information_schema

select concat("mysqldump -uroot -p123 ",table_schema," ",table_name," >/tmp/",table_schema,"_",table_name,".sql;")
from information_schema.tables
where table_schema not in  sys,performance,information_schema
into outfile '/tmp/abc.sh';

例子:模仿以下语句,批量实现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命令 含义
show databases; 查看所有数据库名
show tables; 查看当前库下的所有表名
show tables from world 查看world库下的所有表名
show databases;                  ###查看所有数据库名
show tables;                     ###查看当前库下的所有表名
show tables from world;          ###查看world库下的所有表名
show create database;            ###查看建库语句
show create database oldboy;     ###查看oldboyde 建库语句
show grants for root@'localhost' ###查看用户权限信息
show charset                     ###查看所有的字符集
show collation                   ###查看校对规则
show full processlist            ###查看数据库连接状态
show status                      ###查看数据库的整体状态
show status like '%lock%'        ###模糊查看数据库的整体状态
show varables                    ###查查看数据库所有变量情况
show varables like '%innodb%'    ###查看数据库所有变量情况
show engine                      ###查看所有支持存储引擎
show engine innodb status        ###查看所有innodb存储引擎状态情况
show binary logs                 ###查看二进制日志情况
show binlog events in            ###查看二进制日志事件
show relaylog events in          ###查看relay日志事件
show slave status                ###查看从库状态
show master status               ###查看数据库binlog位置信息
show index from                  ###查看表的索引情况

六、索引

6.1 索引作用

提供了类似书中目录的作用,目的是为了优化查询。

6.2 索引的种类(算法)

(1)B树索引
(2)Hash索引
(3)R树
(4)Full text
(5)GIS

6.3 B树算法普及

B-tree
B+tree (双向指针)在范围查询方面提供了更好的性能
B*tree

6.4 在功能上的分类*****

6.4.1 辅助索引(S)怎么构建B树结构的?

(1) 辅助索引是基于表的列进而生成的
(2)取出索引列的所有值(取出键值)
(3)进行所有键值的排序
(4)将所有的键值按顺序落到BTree索引的叶子节点上
(5)进而生成枝节点和根节点
(6)叶子节点除了存储键值之外,还存储相邻叶子节点的指针,另外还会保存原表数据的指针

6.4.2 聚集索引(C)怎么构建B树结构的?

(1)建表是有主键列(ID)
(2)表中进行数据存储,会按照ID列的顺序,有序的存储一行一行的数据到数据也上(这个动作叫做聚集索引组织)
(3)表中的数据页被作为聚集索引的叶子节点
(4)把叶子节点的主键值生成上层的枝节点和根节点

6.4.3 聚集索引和辅助索引构成区别总结

聚集索引,只能有一个,非空唯一,一般是主键
辅助索引,可能有多个,是配合聚集索引使用的
聚集索引叶子节点,就是磁盘的数据行存储的数据页
MySQL是根据聚集索引,组织存储数据,数据存储时就是按照聚集索引的顺序进行存储数据
辅助索引,只会提取索引键值,进而自动排序生成B树结构

6.5 辅助索引细分

ID 类型 说明
1 单列辅助索引 普通的单列辅助索引
2 联合多列辅助索引(覆盖索引) 多个列作为索引条件,生成索引树,理论是好的,可以大量的回表查询
3 唯一索引 索引列的值都是唯一的

6.6关于索引的高度受什么影响?

ID 影响因素 解决方法
1 数据行多 分表,分库,分布式
2 索引列字符长度 前缀索引
3 char、varchar 变长长度字符串,使用char;定长长度字符串,使用varchar
4 enum 优化索引高度,能用则用
上一篇下一篇

猜你喜欢

热点阅读