if判断: select *,if(status=0,"正常","禁用") as t from pre_common_member
判断用户状态,如果是则在 t 字段显示“正常”,否则显示“禁用”
-----------------------------------------------------------------------------------------------------------
Explain命令:可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。
例如:explain select * from news;
参数讲解:
1. id:查询序列号
2. select_type:select类型
SIMPLE:简单SELECT(不使用UNION或子查询等)
PRIMARY:最外面的SELECT
UNION:UNION中的第二个或后面的SELECT语句
DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULT:UNION的结果。
SUBQUERY:子查询中的第一个SELECT
DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
DERIVED:导出表的SELECT(FROM子句的子查询)
3. table:显示这一行的数据是关于哪张表的
4. type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一。
结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
(1)SYSTEM
CONST的特例,当表上只有一条元组匹配
(2)CONST
WHERE条件筛选后表上至多有一条元组匹配时,比如WHERE ID = 2 (ID是主键,值为2的要么有一条要么没有)
(3)EQ_REF
参与连接运算的表是内表(在代码实现的算法中,两表连接时作为循环中的内循环遍历的对象,这样的表称为内表)。
基于索引(连接字段上存在唯一索引或者主键索引,且操作符必须是“=”谓词,索引值不能为NULL)做扫描,使得对外表的一条元组,内表只有唯一一条元组与之对应。
(4)REF
可以用于单表扫描或者连接。参与连接运算的表,是内表。
基于索引(连接字段上的索引是非唯一索引,操作符必须是“=”谓词,连接字段值不可为NULL)做扫描,使得对外表的一条元组,内表可有若干条元组与之对应。
(5)REF_OR_NULL
类似REF,只是搜索条件包括:连接字段的值可以为NULL的情况,比如 where col = 2 or col is null
(6)RANGE
范围扫描,基于索引做范围扫描,为诸如BETWEEN,IN,>=,LIKE类操作提供支持
(7)INDEX_SCAN
索引做扫描,是基于索引在索引的叶子节点上找满足条件的数据(不需要访问数据文件)
(8)ALL
全表扫描或者范围扫描:不使用索引,顺序扫描,直接读取表上的数据(访问数据文件)
(9)UNIQUE_SUBQUERY
在子查询中,基于唯一索引进行扫描,类似于EQ_REF
(10)INDEX_SUBQUERY
在子查询中,基于除唯一索引之外的索引进行扫描
(11)INDEX_MERGE
多重范围扫描。两表连接的每个表的连接字段上均有索引存在且索引有序,结果合并在一起。适用于作集合的并、交操作。
(12)FT
FULL TEXT,全文检索
5. possible_keys:列指出MySQL能使用哪个索引在该表中找到行
6. key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL
7. key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好
8. ref:显示使用哪个列或常数与key一起从表中选择行。
9. rows:显示MySQL认为它执行查询时必须检查的行数。
10. Extra:包含MySQL解决查询的详细信息,也是关键参考项之一。
-------------------------------------------------------------------------------------------select count(uid) from pre_common_member GROUP BY groupid HAVING COUNT(uid)>1
不同组下的用户数量并且数量大于10的组
"having 条件表达式" /*该表达式指示被选择的行必须满足的条件*/ SQL标准要求HAVING必须引用GROUP BY子句中的列或用于总计函数中的列。不过,MySQL支持对此工作性质的扩展,并允许HAVING因为SELECT清单中的列和外部子查询中的列。 HAVING不能用于应被用于WHERE子句的条目。 例如,不能编写如下语句: mysql> SELECT col_name FROM tbl_name HAVING col_name > 0; 而应这么编写: mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;
-----------------------------------------------------------------------------------------------------------------------
select c.*,g.* from pre_school_video c left join pre_school_learn g on c.id=g.vid where c.id in(".$xxid_list.") order by g.`time` desc
select出来一串id,然后到另外一个表里面查数据,查出来的数据怎么按照那串id的排序来显示
select a.*,b.* from 第一个表 a left join 第二个表 b on a.id = b.vid where a.id in("1,2,3") order by b.`time` desc
on 后面是两个表相同字段
-----------------------------------------------------------------------------------------------------------------------