1.在常量列表的情况下,OR操作符和IN操作符用在WHERE子句中的差别?
1)在值列表多的情况下,IN操作符可以使缩短sql语句的长度,增加可读性。
2)在数据记录量大的情况下,IN操作符可以提高查询速度(对值列表先排序,然后利用二分查找算法搜索待查内容)。
例如:在值列表为n,表记录为m的情况下,OR操作符的复杂度为n*m,而IN操作符的复杂度为nlogn+m*logn
2.用于WHERE子句中的LIKE模式匹配结果不区分大小写,LIKE操作符强制MySQL扫描整个表中的行来查找匹配数据,因此,它不允许数据库引擎使用索引来加快搜索。
所以,当要从表中使用LIKE操作符来查询大量数据,查询性能会降低很明显。
用法:expr LIKE str
MySQL提供了两个通配符与LIKE操作符一起使用,它们分别是:百分比符号 % (匹配零个或多个字符)和下划线 _(匹配任何单字符),ESCAPE ‘字符’可以自定义转义字符(默认是反斜杠\)
3.LIMIT子句来限制由SELECT语句返回的行数,同时可以实现一种用来获取第n个最大(最小)值的技术。
用法:LIMIT 查询结果开始行(从零开始),查询结果显示的总行数
4.ORDER BY子句允许您使用 FIELD()函数来在一列上自定义排序顺序值,另外可以使用ORDER BY子句来实现MySQL各种自然排序技术。
名词解释:自然排序顺序是按字母顺序的字符串排序,如果存在多位数字则被排序为单个字符。
mysql函数:CONCAT(str1,str2)可以连接两个字符串;CAST(str AS UNSIGNED)可以将字符串转换成无符号整数;
LENGTH(str)可以计算str的长度;convert(str using gbk)可以将str转换成gbk编码格式
5.为了增强查询结果可读性,可以在mysql中定义列别名和表别名,语法如下:
SELECT [column_1|expression] AS descriptive_name FROM table_name AS table_alias,其中语句中的AS是可选的。
注意:别名最好定义在sql语句执行过程中遇到的第一个需要定义别名的地方,这样的话其他地方就可以引用该别名,
例如不能在 WHERE 子句中使用列别名。其原因是,在 MySQL 对 WHERE 子句求值时,SELECT 子句中指定列的值可能尚未确定。
mysql函数:CONCAT_WS(separator,str1,str2,…)用分隔符链接后面的字符串
6.MySQL的INNER JOIN句是 SELECT 语句的可选部分。它应该在 FROM 子句之后立即出现。在使用MySQL INNER JOIN子句之前,必须指定以下标准:
首先,必须指定出现在FROM子句中主表;
其次,需要指定要与主表连接的其它表,这些会出现在INNER JOIN 子句之后。从理论上说可以加入一个表或多个表。但是,为了更好的查询性能,应该限制所连接的表的数量。
第三,需要指定连接条件或连接谓词。连接条件是在 INNER JOIN 子句之后的关键字ON的之后出现。 连接条件是主表和其他表之间匹配行记录的规则。
MySQL的 INNER JOIN 子句的语法如下:
SELECT column_list
FROM t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
…
语法解释:mysql用表t1的每一行基于匹配条件去匹配t2中的每一行,如果左表的行与右表某行匹配成功,那么将匹配成功的两个表的行记录合并。
附:可以使用USING子句对连接条件进行简化,但是只有在查询满足以下两个条件时才能给使用USING进行简化:
1、查询必须是等连接的
2、等连接中的列必须是同名
如:商品表goods表和商品类型表category表中goods的外键和category的主键相同:categoryid而且是等连接,这里可以使用using
注意:如果连接多个表,这些表中列名有相同,则在 SELECT 子句中必须使用表限定符指示是对应的列,以避免不明确的列错误。
7.MySQL的LEFT JOIN子句允许从两个或多个数据库表中查询数据。LEFT JOIN子句是SELECT语句的可选部分,该语句在FROM子句之后出现。语法如下:
SELECT
T1.c1,T1.c2,T2.c1,T2.c2
FROM T1
LEFT JOIN T2 ON T1.c1=T2.c1;
语法解释:mysql用左表的每一行基于匹配条件去匹配右表的每一行,如果左表的行与右表某行匹配成功,那么将匹配成功的两个表的行记录合并
如果匹配不成功,则将左表的行记录与右表“伪造的行记录”合并,且该伪造的行记录对应的所有列均为NULL。
8.除了使用 INNER JOIN,LEFT JOIN 或 RIGHT JOIN 语句来加入一个表,还有一种特殊情况叫作:自连接,即一个表它自己连接自已本身。
当我们想在同一个表中行记录上结合多列,可以考虑使用自连接。要执行自连接操作,必须要使用表的别名,以帮助 MySQL 从同一个表名称中区分右表和左表。
9.GROUP BY子句是 SELECT 语句的可选部分,它将一组行记录按列或表达式的值分组成摘要行记录。GROUP BY子句返回每个分组的一个行记录,而且结果会按照聚合值进行排序。
以下说明了 GROUP BY 子句的语法:
SELECT
c1,c2,…,cn,aggregate_function(ci)
FROM
table
WHERE
where_conditions
GROUP BY c1,c2,…,cn;
mysql函数:YEAR(date)取出年份;MONTH(date)取出月份;DAYOFMONTH(date)当月的天数。
附:group by 一般和聚合函数一起使用才有意义,比如 count sum avg等,使用group by的两个要素:
(1) 出现在select后面的字段 要么是是聚合函数中的,要么就是group by 中的.
(2) 要筛选结果 可以先使用where 再用group by 或者先用group by 再用having
10.MySQL的HAVING子句在SELECT语句中是用来为某一组行或聚合指定过滤条件。
MySQL的HAVING子句通常与GROUP BY子句一起使用。当它在GROUP BY子句中使用时,我们可以应用它在GROUP BY子句之后来指定过滤的条件。如果省略了GROUP BY子句,HAVING子句行为就像WHERE子句一样。
请注意,HAVING子句应用筛选条件每一个分组的行,而WHERE子句的过滤条件是过滤每个单独的行。