mysql学习笔记———查询语句

所谓查询(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);

懂了吧。

联结说的很高深,有个诀窍就是用到哪几个表就用哪几个表。。。

但是要注意自联结的重命名问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值