1.distinct
处理过程:
将列里面所有的值进行排序,然后将连续的一段进行匹配,直到匹配到值不相同的一个,然后进行计数。去重排序,此上针对8,0以前版本
select distinct(列) from 表
mysql> select distinct(school.student.sname) from school.student;
+---------+
| sname |
+---------+
| zhang3 |
| zhang4 |
| li4 |
| wang5 |
| zh4 |
| zhao4 |
| ma6 |
| oldboy |
| oldgirl |
| oldp |
+---------+
10 rows in set (0.00 sec)
实际用法:
mysql> select count(*) from world.city;
+----------+
| count(*) |
+----------+
| 4079 |
+----------+
1 row in set (0.00 sec)
mysql> select count(distinct(world.city.name)) from world.city;
+----------------------------------+
| count(distinct(world.city.name)) |
+----------------------------------+
| 3998 |
+----------------------------------+
1 row in set (0.00 sec)
mysql>
2.别名
2.1表别名
SELECT stu.sname,co.cname
FROM student as stu
JOIN score as sc
ON stu.sno = sc.sno
JOIN course as co
ON sc.cno = co.cno
WHERE stu.sname = 'zhang3';
2.2列别名
mysql> select count(distinct(world.city.name)) as a from world.city;
+------+
| a |
+------+
| 3998 |
+------+
1 row in set (0.01 sec)
3.外连接
左连接:left join
SELECT
a. NAME,
b. NAME,
b.surfacearea
FROM
city AS a
LEFT JOIN country AS b ON a.countrycode = b. CODE
AND a.population < 100
左边是小数据,右边是大数据
右连接(right join)
USE world;
SELECT
a. NAME,
b. NAME,
b.surfacearea
FROM
city AS a
right JOIN country AS b ON a.countrycode = b. CODE
AND a.population < 100
HAVING b.surfacearea<'50';
4.information_schema.tables
元数据:存放在基表中,也叫元数据表,ibdata(数据词典,不能查看,存放了数据信息相当于数据的inode),基表无法直接查询和修改。
---修改通过DDL进行元数据修改
---show语句查询,desc(show),information_schema(全局类的统计和)
mysql root@10.0.0.68:information_schema> desc `TABLES` 先切到information_shema库然后通过desc 'tables' 查询
+-----------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| 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 | | | |
+-----------------+---------------------+------+-----+---------+-------+
常用:
TABLE_SCHEMA 表所在库
TABLE_NAME 表名
ENGINE 表的存储引擎
TABLE_ROWS 表的行数
AVG_ROW_LENGTH 平均行长度
INDEX_LENGTH 索引长度
实例:
1. 统计所有库下表的总大小
select table_schema,count(table_name),sum(avg_row_length*table_rows+index_length)/1024/1024 as table_MB
from information_schema.tables
group by table_schema;
2.统计库下总大小
select
sum(avg_row_length*table_rows+index_length)/1024/1024 as table_MB
from information_schema.tables
councat()
mysql> select concat(user,"|",host) from mysql.user;
+-------------------------+
| concat(user,"|",host) |
+-------------------------+
| oldguo|10.0.0.% |
| root|10.0.0.% |
| zhihu|10.0.0.% |
| oldboy|172.16.1.% |
| mysql.session|localhost |
| mysql.sys|localhost |
| root|localhost |
+-------------------------+
7 rows in set (0.00 sec)
mysql> select concat("廖婉丽是傻子");
+------------------------------+
| concat("廖婉丽是傻子") |
+------------------------------+
| 廖婉丽是傻子 |
+------------------------------+
1 row in set (0.00 sec)
show
show databases; 查看所有数据库
show tables; 查看当前库下所有表
show tables from world; 查看world数据库下的所有表
show create database 库; 查看建库语句
show create table 表; 查看建表语句
show grants for root@'localhost';查看用户权限
show charset; 查看字符集
show collation; 校对
show full processlist; 查看连接情况
show status; 查看数据库状态
show engines; 查看存储引擎
show status like '%lock%'模糊
show variables; 查看变量
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 privileges; 查看权限
show index from 表; 查看表的索引
show errors; 查看上一条报错
show warnings; 查看上一条警告
show colums from city 查看表的列定义信息
索引(称为index或key)
作用
提供了类似于书中目录的作用,目的是为了优化查询
种类(算法)
**B树**
Hash索引
R树
Full text 全文索引
GIS
B树索引
image.png
B-tree
B+Tree 在范围查询方面提供了更好的性能(> < >= <= like)
B*Tree
向上生成父节点的时候,总是取子节点的最小值
B+数针对范围查询进行优化,在B数索引的基础上在叶节点上添加双向指针。B*数在枝节点上添加了双向指针。
6.在功能上进行分类******
辅助索引(S)
[secondary][index]
聚集索引(C)
[clustered][index]
6.1辅助索引(S)怎么构建B树结构的?
(1)辅助索引基于表的列进行生成
(2)取出索引列的所有值(取出所有键值)
(3)进行所有键值的排序
(4)将所有的键值按顺序落到BTree索引的叶子节点上
(5)进而生成枝节点和根节点
(6)叶子节点除了存储键值之外还存储指向相邻叶的指针,
另外还会保存指向原表数据的指针。
6.2聚集索引(C)怎么构建B树结构的?
聚集索引组织存储,聚集索引相当于将数据行整行存储在叶子节
点上,依据于聚集索引列。
(1)建表时有主键列
(2)表中数据存储时,会按照主键列顺序有序的存储数据行的内容,
在数据页上(这个动作叫做聚集索引组织表)。
(3)表中的数据页被作为聚集索引的叶子节点。
(4)把叶子节点的主键值生成上层的枝节点和根节点
6.3聚集索引和辅助索引构成区别
(1)聚集索引只有一个,非空,唯一,一般是主键。
(2)辅助索引可以有多个,是配合聚集索引使用。
(3)聚集索引叶子节点,就是磁盘的数据行存储的数据页。
(4)MySQL是根据聚集索引,组织存储数据,数据存储的时候就是按照聚集索引的顺序进行存储。
(5)辅助索引,只会提取索引键值,进行自动排序生成B树结构。
6.4辅助索引细分
1.单列的辅助索引
2.联合多列辅助索引(覆盖索引)
3.唯一索引
6.5关于索引树的高度受什么影响
(1)数据行个数(方案:分表)
(2)索引列的字符长度(方案:前缀索引)
(3)char,varchar(方案:表设计方案)
(4)enum(生成下标索引),在数据数量上优化索引高度,能用则用
网友评论