MySQL常用功能简单介绍
博客:http://pangge.blog.51cto.com/ 马哥教育:www.magedu.com
【Mysql的查询功能】
show databases; 查看数据库列表 use jiaowu; 切换到jiaowu数据库 show tables; 查看数据库中所有表
SELECT的整体语法形式: SELECT values_to_display FROM table_name WHERE expression GROUP BY how_to_group HAVING expression ORDER BY how_to_sort LIMIT row_count;
常见的查询语法: COUNT(*): 查看总行数 MAX(filed):返回最大值 MIN(filed):返回最小值 AVG(filed):返回平均值 SUM(filed):求和的
常见的比较操作符:
=, <>aka !=, <, <=, >, >=, <=>相当于等于但是可以与空值相比较
常见的组合条件: AND 与 OR 或 NOT 非
通配符的使用:LIKE % 匹配任意长度的字符 _匹配单个长度的单个字符
RLIKE:自己匹配方式,支持正则表达式匹配
排列方式:
默认排列方式为升序(ASC)
ORDER BY home DESC 表示以降序的方式进行排列
DISTINCT 重复只显示一次
查询分为单表查询,联结查询,子查询,联合查询 单表查询:执行在一张表上的简单查询
联结查询:将多张表连接起来的简单查询 交叉联结:笛卡尔乘积
mysql> SELECT * FROM students,tutors;
内联结:等值联结,用的比较多的查询方式
mysql> SELECT * FROM students,tutors WHERE students.TID=tutors.TID; 外联结:JOIN 不是完整的等值联结。 左外联结:LEFT JOIN 以左表为基准 tb1 LEFT JOIN tb2 ON condition
mysql> SELECT * FROM students LEFT JOIN tutors ON students.TID=tutors.TID;
右外联结:RIGHT JOIN 以右表为基准 tb1 RIGHT JOIN tb2 ON condition
mysql> SELECT * FROM students RIGHT JOIN tutors ON students.TID=tutors.TID;
自联结:自己与自己联结(学习利用别名进行操作),通过一张表的两个字段关系建立连接关系。是内联结的特殊形式。
mysql> SELECT s.Name,t.Name FROM students AS s,students AS t WHERE s.TID=t.SID; 子查询:求平均年龄的查询,是复杂查询,嵌套查询,有时可能针对一张表的,它的操作机制是查询中嵌套了别的查询语句。(子查询弊端:优化不是特别好,使用可能会导致系统性能下降)
常见的主要有以下三种: (1),用于WHERE子句或HAVING子句中的子查询
mysql> SELECT Name,Age FROM students WHERE Age > (SELECT AVG(Age) FROM students);
用于比较操作符或逻辑操作符中(子查询的返回值只能一个/行); mysql> SELECT Name,Age FROM students WHERE Age > (SELECT Age FROM students WHERE TID>3); 返回值会有多个所以会报错 用于IN操作符(子查询的返回值可以多行);
mysql> SELECT Name FROM students WHERE TID IN (SELECT TID FROM tutors WHERE Age >50); 可以返回多个值
用于EXISTS布尔比较中:只要有结果就可以返回;
这种不常见 (2),用于FROM子句中的子查询:把查询语句当做表使用,若表多的情况下请启用别
名。类似于视图
mysql> SELECT vt.Name FROM (SELECT Name,Age FROM students UNION SELECT TName,Age FROM tutors) AS vt WHERE Age>30 3,用于UPDATE语句或DELETE语句中的子查询:
mysql> DELETE FROM students WHERE Age+20< (SELECT MIN(Age) FROM tutors) mysql> SELECT * FROM students
子查询条件有可能会执行多次进行比较。而且两个条件查询所用的表不能为同一张表。
联合查询:多个sql语句执行结果联合起来,可以使用UNION来连接。联合查询还可以直接进行排序,因为它会把结果放到一张临时表中。
mysql> SELECT Name,Age FROM students UNION SELECT TName,Age FROM tutors ORDER BY Age;
【索引】
索引:是对数据库表中一列或多列的值进行排序的一种结构也可以说是按照某种特定的格式组合起来的某种排列方式重新组合起来的一种机制,使用索引可快速访问数据库表中的特有信息。
简单索引:建立在单个字段上
组合索引:建立在多个字段上
我们平时所谓的索引不管是主键还是唯一键等等它们通常被称为B-tree(平衡树)索引 特点:
每一个分叉的节点通常是一个查询范围 每个叶子节点到根节点的距离一样
叶子节点有双向链表指向上/下一个叶子节点
在叶子节点上存在的是指针,指向磁盘上真正的数据
平衡树的升级版(B-Tree+)索引:InnoDB引擎的索引是根据主键建立的也就是说InnoDB中的数据不是用指针存储的,而是在索引背后的有真正地磁盘块,所以它是将索引和数据表存储在一起的。
特点:所有叶子节点高度相同
叶子节点有双向链表指向上/下一个叶子节点 每一个entry保存了整行数据,表即索引 TID用于事务控制(锁) RP用于MVCC
索引的类型有以下四种:
1,最左前缀索引(B-Tree):自左向右找固定长度的字符串索引的可以利用全键值,键值范围,键前缀的方式进行查找。 适用场景:
匹配全名:将索引中的每个字段都拿来作条件进行匹配
匹配最左前缀:仅适用于索引中的第一列 匹配范围值:用于大于,小于,等于,不大于等等中,仍然从最左侧开始匹配 局限性:
只要查找没有从索引最左侧开始,就无法使用此索引 不能跳过索引中的列,所以创建索引时的次序很重要。
覆盖索引:在索引中能够找到所有数据的索引(最频繁的实现查找方式,索引直接指向数据),它只是一种利用操作方式,不是索引类型。
键缓存:在内存中开辟一段区域,用于将索引数据载入进来,在内存中根据索引完成数据匹配的。是MyISAM上的一个特性机制。
缓冲区:即缓存键又缓存数据,是InnoDB的一种机制。
2,哈希索引:key-value(键值对)索引,做字符串等值比较时非常好用,但是它比较独特不是所有存储引擎都支持,只有Memory引擎支持显示hash索引。MyISAM不支持这种索引,InnoDB上不是用户创建的是由自己维护的自适应hash索引;只可使用等于或不等于,不能使用大于,小于(跟hash有关)
局限性:
不能实现覆盖索引 不能根据索引排序 不支持部分键匹配
只支持使用=,IN,<=>
优势: 速度很快(碰撞率低的情况下)索引在使用前去鉴定一下碰撞率 3,空间索引:R-Tree:只记录保存空间位置信息,索引周围的地理数据的; 只有MyISAM引擎支持;只适用Mysql内部的函数来使用索引
4,全文索引:Fulltext
全文中任何一个位置出现的字符串都可以用于做关键字 只有MyISAM引擎支持 搜索机制:使用特殊函数实现
第三方项目为不论你是任何存储引擎都可以使用全文索引,有时还会比MyISAM引擎还要快。。。
全文索引项目:可以和MyISAM一起使用 Lucene (基于java开发) Sphinx (基于c++开发的)
使用索引:
1,必须使用隔离列(不能参与运算)
where Age+20 > 60;可以使用:where Age > 60-20
2,前缀索引和索引选择性至关重要
指定使用固定长度的索引,太短会降低速度,一般限定在30%左右
手动计算索引长度方法:
select count (disctict field)/count(*)from table; select count (distinct left(field,n))/count(*) from table;
3,选择使用合适的覆盖索引 4,使用索引即完成查找又同时完成排序 扫描有序索引排序
使用文件排序(Filesort) 5,尽可能避免重复索引
创建索引:
CREATE TABLE 创建表时直接创建索引
许多创建方式详见:mysql> help CREATE TABLE
ALTER TABLE 添加表索引
许多添加方法详见:help ALTER TABLE # ALTER TABLE students ADD INDEX(Name,Age);
SHOW INDEX FROM 显示某张表上的索引 # SHOW INDEX FROM students;
CREATE INDEX 创建索引
#CREATE INDEX createtime ON students(CreateTime);
DROP INDEX 删除索引
#DROP INDEX Name ON students;
#ALTER TABLE students DROP INDEX createtime;
【Mysql的锁和事务】
存储引擎:又称为表类型
怎么查看当前系统支持什么存储引擎?? mysql> SHOW ENGINES;