所谓查询(query)实际上指的是mysql里的select语句,进一步讲,就是select权限,每一个新建的用户默认没有任何权限,但是通过grant语句可以赋予某用户查询权限。
一、筛选和排序
查询用的最多的就是select语句:
公式为
select 字段名1,字段名2...
from 表名1,表名2...
where 条件1 (and|or)条件2(and|or)条件3...
order by 字段1,字段2....(dec|asc);
以上语句可能是广大程序人员应用的最多的语句:
例1:从表atable查询所有行
select * from atable;
例2:从表atable查询出字段field1,field2 并且筛选出field1=contr的
select field1,field2
from atable
where field1=contr;
一般情况下条件c是一个布尔表达式或者是like,regexp语句(针对文本段)来筛选行。
例3:从表atable查询出字段field1,field2 选出field2=d 并且按字段field3递减排序(递减为desc,默认/递增为asc)
select field1,field2
from atable
where field2=d
order by field3 desc;
值得注意的是mysql对文本排序时使用的是大小写不敏感的字典序。(默认)
注意:对值的判断会忽略字段的null值,一般如果要查找字段field为空的行可以使用条件 where field is null
注意:一个in语句等价于多个or语句。
二、限定语句
限定为在第一部分的公式加上 limit m offset n;
意思是:从偏移量n的地方取m行
比如说,limit 5 offset 2 是第3行(因为和一般的编程语言一样从0计数)开始取5行,如果确实检索出大于等于5行那就返回,否则就全部取出。
三、对文本字段的处理
对文本的搜索基本形式是like语句和regexp语句
分别代表着搜索模式和正则匹配。
like的用法是这样 ‘%’代表着任意子串,‘_’代表着一个任意的字符串
比如条件 s like 'a%bb_cc'可以用来匹配:
‘abbscebbdcc’、‘asdbbtcc’之类的字符串。
通配符(%和_)有以下几点使用注意事项:
1、能不用的时候尽量不用。可以依靠其他条件表达出自己的筛选范围时尽量不要用通配符。
2、通配符放在模式的位置越靠前,搜索的次数越多,速度越慢。
3、构造通配符时应时刻注意是否构造正确。
正则表达式一般用regexp来代替
正则的知识这里不再叙述,只是在mysql里面 where field regexp 'aaa' 是在搜索“是不是field包含能匹配串aaa的串”
而并不是说一定要完全匹配aaa,那样的匹配应为 regexp ‘^aaa$’即以此开始并结束。
四、字段处理
任何一个字段(数值型)都可以通过加减乘除获得新字段,这个字段是在生成结果前完成的,经过优化处理。
比如:
select f1,f2,f1*f2+2 as f3
from atable;
这个语句提取出了一个表达式并且把f3作为别名生成一个列数为3的结果集。
更通用的是使用函数来处理文本字段和数值字段:
下面是我简单的总结:
文本处理函数
left(str,k)——返回字符串str的左边k个字符;
right(str,k)——返回str右边k个字符;
lower(str)——转化为小写;
upper(str)——转化为大写;
ltrim(str)——去掉左边的空格;
rtrim(str)——去掉右边的空格;
trim(str)——去掉两边的空格;
substring(str,offset,length)——返回str从offset开始长度为length的子串;
length(str)——返回字符串长度;
locate(sub,str,from)——从from的位置开始查找str第一个出现sub子串的位置。
concat(c1,c2,c3,c4....)——把所有参数合并为一个字符串;
soundex(str)——谐音搜索;
比较有意思的是sondex这个函数,我创建了这个示例:
create table friends(
fname char(10) not null,
age int,
phone char(11),
primary key(fname)
);
insert into friends(fname,age,phone)
values ('张三三',19,'15022222222'),('章司司',22,'13299999999');
select * from friends
where soundex(fname)=soundex('张散伞');
首先创建了一个friends表,插入了两个行。
最后那句select条件用白话就是:“你给我找一下名字读起来像这个的人。”,当然了返回的是插入的第一行元组。
这个就好像什么呢?公安部门的天网系统有一个谐音搜索功能,按照这个就查到所有名字谐音相同的人。
有意思吧,哈哈哈哈。
数值处理
sin(x),cos(x),tan(x)——求对应三角函数值,注意x是弧度;
pi()——返回圆周率;
sqrt(x)——开根号;
rand()——随机出一个0~1的小数;
mod(a,b)——a%b的值;
exp(x)——e的x次方;
abs(x)——取绝对值;
floor(x)——对小数向下取整;
实际上一般来说这些已经够用了,其余的可以查手册;
日期处理
curDate()——返回当前日期;
curTime()——当前时间;
dateDiff(a,b)——两个日期之差;
day(d),dayofweek(d),hour(d),minute(d),month(d),second(d),year(d)-----返回一部分;
五、分组
分组的目的是把表“转过来”之前的列成为了行,一般格式为:
select a,b,c..x....z
from t
(where....)
group by x
having ...;
其中值得注意的是:“where在分组前筛选,having子句在分组后筛选”;
group by x表示按照x字段分组
六、多段查询和联结
多段查询主要指的是子查询和union语句
多段查询实质上就是从内向外构造出多个查询,里面一层的结果作为外一层的条件,一般借助in语句;
union是2个以上的select语句结果合并;
注意:union指的是“求并集”,union all指的是“单纯的集合相加”,他们的区别是二者的交集是否会加入。
比如A=(1,3,5,7),B=(1,5,9)
那么A union B=(1,3,5,7,9)但是A union all B=(1,3,5,5,7,9);
懂了吧。
联结说的很高深,有个诀窍就是用到哪几个表就用哪几个表。。。
但是要注意自联结的重命名问题。