MySQL必知必会
1.SQL(像多数语言一样)在处理OR操作符前,优先处理AND操
作符。
建议:在WHERE子句中使用圆括号
任何时候使用具有AND和OR操作
符的WHERE子句,都应该使用圆括号明确地分组操作符。不要
过分依赖默认计算次序,即使它确实是你想要的东西也是如
此。使用圆括号没有什么坏处,它能消除歧义。
2.
正则表达式字符后面的?表示0个或一个匹配,+表示1个或多个匹配,*表示0个或多个匹配。
3.
[[:<:]] 词的开始)
[[:>:]](词的结尾)
e.g.
[[:<:]]anv会匹配有anv开头的单词的字符串,vil[[:>:]]会匹配vil结尾的单词的字符串。
4.
Contat()函数(拼接字符串)
TRim()函数(去掉字符串两边的空格)
RTrim()函数(去掉右边的空格)
LTrim()函数(去掉左边的空格)
Left()函数(
返回左边子串
e.g.
SELECT LEFT('foobarbar', 5); 返回 'fooba'
)
Locate()函数(
LOCATE(substr,str):返回substr在字符串str 的第一个出现的位置
LOCATE(substr,str,pos):返回子符串 substr 在字符串str,从pos处开始的第一次出现的位置。
如果substr 不在str 中,则返回值为0
)
Soundex()函数(
保留字符串的首字母,但删除元音字母(a、e、h、i、o、u)和w、y,所有不在A-Z范围之内的国际字母符号被视为元音字母。 一个标准的soundex字符串的长度为4个字符,然而soundex()函数会返回一个人以长度的字符串
将数字赋予剩下的字母如下:
1. b, f, p, v
2. c, g, j, k, q, s, x, z
3. d, t
4. l
5. m, n
6. r
e.g. select soundex('Quadratically'); 的结果是 'Q36324'
select soundex('user'); 的结果是 'U260'
select soundex('中华人名共和国'); 的结果是 '中000'
)
5.
DISTINCT可以与COUNT配合使用
DISTINCT不能用于COUNT(*),因此不允许使用COUNT( DISTINCT),
否则会产生错误
e.g.
在统计不重复的记录的时候能用到,比如SELECT COUNT( DISTINCT id ) FROM tablename;就是计算talbebname表中id不同的记录有多少条。
SELECT COUNT( DISTINCT * ) FROM tablename;会产生错误。
6.
HAVING和WHERE的差别
WHERE:行级过滤
HAVING:组级过滤
这里有另一种理解方法,WHERE在数据
分组前进行过滤, HAVING在数据分组后进行过滤。这是一个重
要的区别, WHERE排除的行不包括在分组中。这可能会改变计
算值,从而影响HAVING子句中基于这些值过滤掉的分组。
作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。
WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。(严格说来,你可以写不使用聚集的 HAVING 子句, 但这样做只是白费劲。同样的条件可以更有效地用于 WHERE 阶段。)
在前面的例子里,我们可以在 WHERE 里应用城市名称限制,因为它不需要聚集。 这样比在 HAVING 里增加限制更加高效,因为我们避免了为那些未通过 WHERE 检查的行进行分组和聚集计算。
7.
子查询
虽然子查询一般与IN操作符结合使用,但也可以用于测试等于( =)、
不等于( <>)等。
8.
内部联接:INNER JOIN
外部联接:OUTER JOIN