大纲
mysql查询是一种入门很简单的技术,最简单的查询长得像这样:select * from user
,简单查询用户表(不建议直接使用)。完整一点的查询长这样:select * from user where id=1 order by time desc limit 10
。查询主要由4部分组成:
- select 部分,表明你要查什么,*代表所有,一般不推荐。建议需要查什么字段都写上去,支持嵌套查询语句。
- from 部分,表明你要从哪里查,可以多表联合查询。
- where 部分,表明你的筛选条件,也支持嵌套,是查询语句中最重要也最复杂的部分。
- order 后面的部分,表明你想要怎么展示。语法上这部分不是必须的,但是除了导出,大家在日常使用中必须要加。
下面按照重要程度进行详细介绍。(注意:示例代码不一定完整,实际使用的这4部分基本都要有!)
where
日常使用中一般会用到下面几个基本语句:
对比判断
- 如需要查询名字是小明的用户,可以用
where name = '小明'
,注意字符串必须用单引号包裹,不要用双引号。 - 想要查询年龄是18岁或者是30-40岁的用户,可以用
where age=18 or (age>=30 and age <=40)
。和数学一样,括号里面的优先计算,所以不熟练的情况下建议多打括号。 - 上面的语句可以优化成
where age=18 or age between 30 and 40
,between是一个语句,不需要用括号,包含两端(30和40)。 - 不等于用!=,如
where age!=18
就是年龄不为18的。
模糊查询
如果我们只知道一个人名字里面有“明”,那么我们需要用到模糊查询:where name like '%明%'
。%是通配符,代表任意字符,这个语句可以查询所有名字里面带“明”字的用户。一般情况下这种查询会很慢,建议少用,或者明确知道“明”在前面还是后面时,去掉一个%来提高效率。
in查询
想要查询年龄是2 4 8岁的用户,可以用in查询:where age in (2,4,6)
。选项用逗号分隔,外面用括号包裹。更复杂一点(可选学习),它还可以嵌套查询,比如想查询18岁用户上了哪些课,可以这么写:select name from classChoose where userId in (select id from user where age=18)
。这里查的是classChoose
表,条件里面通过(select id from user where age=18)
来获取所有18岁用户的ID,然后用in来进行匹配筛选。in里面的嵌套查询只能select一个字段,用以匹配筛选,嵌套查询需要用括号包裹。
from
from里面是你想要查询的表,如user。表名建议使用双引号包裹,否则和系统关键字一样会报错(示例里面都没有加,是因为切换输入法麻烦,正常使用建议都加防止出错)。多表查询如下:from user join classChoose where user.id=classChoose.userId
,使用join进行连接多个表,然后用where限定连接条件。join理论上可以无限写,但是多写一个占用的空间会多一个数量级,在没有合适限定条件的情况下数据库会爆炸(假设A表有10W数据,B表1000数据,两表简单连接会产生1亿条数据)。所以多表连接必须写好限定条件。
有时候会涉及两个相同的表联查,涉及上下级的时候比较常见。这个时候需要写别名,如select u1.name,u2.age from user u1 join user u2 on u1.id=u2.fatherId where u1.time>10086
。表名+空格+别名即可,其他地方使用这个表只能使用别名,原本的名字相当于隐藏了。
select
select里面是你要查什么,一般是表里面的字段,如select name from "user"
(注意,user在postsql里面是关键字,这里的表名不加双引号就会报错,所以建议表名都要加)就是查询用户的名称。如果是连表查询,字段前面需要加所属表的名称,如"user".name
,否则容易出错。
select里面还有一些统计函数,如select count(*) as userCount,sum(age) as age,avg(age) as avgAge,min(age) as minAge,max(age) as maxAge
。这里as代表别名,函数一般比较长,所以一般会设置一个别名方便看。userCount是一共有多少数据(如果有where,那么都是筛选后的数据),age是年龄总和,avgAge是平均年龄,minAge maxAge分别是最大最小年龄。这里除了count函数以外,其他的都需要输入字段,告诉数据库你要看哪个字段的统计数据。在使用统计数据函数的时候,无法查询普通字段,因为已经给你聚合统计了。高级用法后续会讲。
(可选学习)select还可以进行嵌套查询,如select name,(select count(*) from classChoose where classChoose.userId=user.id) as classes
,这样一句话就可以查到用户的信息以及他选了多少课,在需要连多表查询多个统计信息的时候会很方便。要点是,嵌套的查询只能select 1个字段,然后需要用括号包裹起来,可以引用主表(这里是user表)里面的字段(user.id)。
杂项
where语句后面的内容统称为杂项,常用的有order by age asc
limit 10
。order by
是对结果进行排序,asc是升序,desc是降序。limit
是限制返回多少条,一般不要太大(一般200足够了,多也不要超过1K),太大了占带宽且慢。
和统计函数一起有个高级用法,group by
。它可以和统计函数一起进行分组统计,如select avg(age) as age,level from user group by level
,就是按照等级来看用户的平均年龄,在这种情况下select里面可以添加group by
中的字段。group by
支持多个字段,如select avg(age) as age,level,class from user group by level,class
就是按照等级和班级进行分组统计。