一 了解MySQL
二 使用Mysql
1、 sql在处理or操作之前,优先处理and操作符。
案例: select * from products where vend_id=1002 or vend_id=1003 and prod_price>=10
处理过程 select * from products where vend_id=1002 or (vend_id=1003 and prod_price>=10)
建议:在使用多个or 或and 语句的时候使用()来避免歧义。
2、 in 操作符跟or的作用相同,但是:
in的语法比or更简洁;in 比or执行速度快;in里面还可以包含其他select语句。
3、 通配符效率很低,必须要用的话也不要放在where的最前面
4、 在MySQL中使用正则表达式。
like会匹配整个列,若果被匹配的文本只是在列值中出现,like不会查到,除非使用通配符,但是regexp在列值中进行匹配,如果在列值中出现,如regexp就会找到它。
select * from products where prod_name regexp ‘1000’ 查处prod_name中包含1000的行。
常用的正则表达式有:. | ^ $
[123] tong=[1|2|3] tong =‘1 tong’ or ‘2 tong’ or ‘3 tong’
1|2|3 tong = ‘1’ or ‘2’ or ‘3 tong’
[1-9] 如果要匹配特殊字符必须要使用 ‘\\ ‘ 做前导。 比如:select * from products where prod_name regexp ‘\\.’ 如要转义\ 则需要 \\\
* + ? {n} {n,} {n,m}
5、计算字段。
(1)、拼接 concatenate
select concat(vend_name, ‘( ‘ , vend_country, ‘)’ ) from vendor ;
rtrim 去掉右边的空格 ltrim 去掉左边的空格 trim 去掉两边的空格。
(2)进行算术计算。
select prod_id ,quantity, item_price, quantity*item_price as expand_price from orderitems
(3)select 提供了一个测试和实验函数与计算的很好的方法。
select 3*4; select trim(‘sssss ’ ); select now();等等
6、 使用函数
a) upper()left() length() locate() lower() ltrim() right() rtrim() soundex() substring()
b) left() SELECT LEFT('foobarbar', 5);
->'fooba'
c) mysql> SELECT LOCATE('bar', 'foobarbar');
-> 4
mysql> SELECT LOCATE('xbar', 'foobar');
-> 0
mysql> SELECT LOCATE('bar', 'foobarbar', 5);
->7
d) soundex()返回发音相似的差不多是根据发音进行模糊匹配,只对英文有效。(了解)
通常存时间的时候会把日期时间一起存起来,取日期的时候要使用date()函数,取时间使用time()函数。此外还有year()month()
7、 聚集函数。
avg() count() max() min() sum()
avg()会忽略NULL值的行。
count(*)会对行统计,不管是否包含null
count(column) 会对特定列中的具有值进行统计,忽略null值。
max() 【min()】说明:max()会返回该列中数据或日期中最大的值,但是对于文本文件,只会返回最后一行(不会排序什么的),min()会返回文本中第一行。
在5.1版本之后,聚集函数中可以使用distinct。
select avg(distinct prod_price)from products;
聚集函数比在编程中效率高,因此推荐使用聚集函数。
8、 对于分组函数。
如果分组列中有null,则null作为一个分组返回,如果有多个null,他们将分为一组。
select host, count(*) from user group by host with rollup; 其中with rollup就是对所有的进行汇总。
where子句在分组前进行过滤,having子句在分组后进行过滤。where排除的行不在分组中。
9、 全文搜索。
为了使用全文搜索,必须索引被搜索的列,然后select和match() against()一起使用来搜索。
在使用全文搜索的时候必须在定义的时候声明
create table productnotes
(
note_id int not null auto_increment,
note_date datetime not null,
note_text text not null
fulltext(note_text)
)engine=myisam;
fulltext(note_text)对note_text进行索引。
说明不要在导入数据的时候启用fulltext索引,会很费时间。在导入完毕之后再修改,会节约很长时间。
全文搜索案例:
select note_text from productnotes where match(note_text) against(‘rabbit’)
说明:传递给match()的值必须是fulltext中定义的。若有多列,必须列出,并且次序也很重要。
全文搜索的扩展查询
select note_text from productnotes where match(note_text) against(‘rabbit’ with query expansion)
首先会用全文搜索查处符合条件的行,然后会以改行的某些字符为条件查找其他包含这些词的行,也列出来,就像百度搜索一样。扩展搜索极大的增加了返回的行数,实际上跟模糊搜索差不多。
布尔搜索:
select note_text from productnotes where match(note_text) against(‘-rabbit*’ in boolean mode)
布尔全文搜索不需要加索引也可以进行,但是效率很低。其中也有一些特殊的操作符
+ 包含,此必须存在
- 排除,次必须不存在
* 词尾的通配符
“ ” 匹配“”里面的短语
说明MySQL中规定了一条50%规则,就是一个词出现50%以上的行中就将其作为一个非用词忽略。
增删改很费性能,如果数据检索是最重要的,可以在insert和into之间加上low_priority来降低insert的优先级。这样就可以提高select的优先级了。
三 使用MySQL
四 检索数据
五 排序和检索数据