《MySQL必知必会》笔记 Ⅰ 使用、排序和检索

一 了解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
四 检索数据
五 排序和检索数据

你可能感兴趣的:(mysql)