MySql基本概念和常用语句
一.mysql的sql语句执行顺序:
from-->join-->on-->where-->group by(开始使用select中的别名,后面的语句中都可以使用)-->avg,sum等等函数-->having-->select-->distinct-->order by-->limit
第一步:首先对from子句中的前两个表数据加载到内存中去 , 并且执行一个笛卡尔乘积,此时生成虚拟表 vt1(选择相对小的表做基础表)
第二步:接下来便是应用on筛选器,on中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 vt2
第三步:如果from子句中的表数目多余两个表,那么就将vt3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 vt3。
第四步:应用where筛选器,对上一步生产的虚拟表引用where筛选器,生成虚拟表vt4,
第五步:group by会将vt4切分成若干临时表, 子句将中的唯一的值组合成为一组,得到虚拟表vt5。
第六步:应用having筛选器,生成vt7。having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器。
第七步:处理select子句。将vt7中的在select中出现的列筛选出来。生成vt8. 如果查询sql中有GROUP BY时,会对内存中的若干临时表分别执行SELECT,而且只取各临时表中的第一条记录,然后再形成新的临时表。这就决定了查询sql使用GROUP BY的场景下,SELECT后面跟的一般是参与分组的字段和聚合函数,否则查询出的数据要是情况而定。另外聚合函数中的字段可以是表中的任意字段,需要注意的是聚合函数会自动忽略空值。
第十步:应用distinct子句,vt8中移除相同的行,生成vt9。
第十一步:应用order by子句。按照order_by_condition排序vt9,
第十二步: 执行limit分页
二.sql语句:
1.统计表内字段值出现的次数
SELECT
字段名, COUNT(字段名)
FROM
表名 where 条件
GROUP BY
字段名
HAVING
(COUNT(字段名) > 出现多少次) ORDER BY COUNT(字段名) DESC
2.查看MySQL编码
show variables like '%character%';
3.查看各个数据库占用大小
select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' MB') as data_size,
concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_size
from information_schema.tables
group by TABLE_SCHEMA
order by data_length desc
4.查看单个数据库各个表的大小
SELECT table_name, data_length + index_length AS len, table_rows,
CONCAT(ROUND((data_length + index_length)/1024/1024,2),'MB') AS datas
FROM information_schema.tables
WHERE table_schema = '库名'
ORDER BY len DESC;
5.mysql设置信息
show variables like '%connect%';
6.连接池信息
show global status like 'Max_used_connections';
7.修改数据库编码
alter datebase mydb1 character set utf8 (效对规则)collate utf8_bin;
8.删除整张表
truncate table 表名: 是DDL语句,无法回滚; 将整个表删除,重新创建一个表
9.union 对两个结果集进行并集操作,重复数据只显示一次.
union All,对两个结果集进行并集操作,重复数据全部显示
10.单表约束
主键约束: primary key (唯一非空)
唯一约束: unique 不能有两个一样的数值
非空约束:not null
11.auto_increment. 自动增长
12.关联表建表原则
①一对多的建表原则
在多的一方创建一个字段,这个字段作为外键指向一的一方的主键.
②多对多的建表原则
借助第三张表,第三张表中至少需要两个字段分别作为两个外键分别指向两张表的主键
③一对一
唯一外键对应:在一对多的基础上对外键加上唯一约束,外键约束就是约束这一列的值必须是另一张表的主键值,
13.多表查询:
①交叉连接 "一般不用" 获得的是两个表的笛卡尔积.
②内连接:inner join(inner可以省略) 内连接只匹配符合连接的行
*显示内连接: select * from A inner join B on 条件;
*隐式内连接: select * from A,B where 条件;
③外连接 outer join -- outer可以省略
*左外连接: left outer join 以左边为基准查的,可以查到左边全部信息.select * from A left outer join B on 条件
*右外连接: right outer join select * from A right outer join B on 条件
④自然连接(不允许带on/using)
natural join通过MySql自己的判断完成连接过程,不需要指定连接条件.MySql会使用表内的,相同的字段,作为连接条件,使用自然连接要注意,两个表同名的列不能超过1个.自动删除多余重名列
natrual left join:左自然连接,保留2个表的列(删除多余重名列),以左表为准,不存在匹配的右表列,值置为NULL
natrual right join:和左自然连接相反
⑤子查询: 一个SQL语句查询的过程依赖与另一个SQL查询语句,可以select嵌套
7.简单查询语句总结
查询行数用 count;
筛选分组后的数据用having;
查询分组的用group by;
查询分页的用limit
查询排序用 order by asc或desc;
查询去除重复用 distinct;,在select from中间加
查询不是数组 not in 是 in
非 用 <>
不为null为 is not null
模糊查询用like,在where后面加,like可以使用占位符%
三.mysql配置信息
1.mysql的内置表:
information_schema:存储了系统中一些对象信息,如:用户表信息,试图信息,各种数据库变量状态、字符集信息等
mysql:主要是用户的相关权限信息
performance_schema:记录系统性能的数据库。通过performance_schema变更决定是否开启,默认不是开启的