select
- 检索单列
select name from students;
- 检索多列
select name,age,info from students;
- 检索全部列
除非你真的需要表中的全部内容,否则不要使用*通配符,当库中的数据量非常大的时候
这条语句会给服务器带来巨大的压力,甚至宕机
select * from students;
- 检索不同的行distinct
当表中的某个字段有大量重复的时候,可以加distinct关键字去重,只显示不同的部分
select distinct classid from students;
- 限制结果limit
因为*通配符可能会对服务器带来压力,可以使用limit关键字
limit 3表示选取前3行,而limit 3,4表示从第3行开始选取4行(不包括第3行)
select * from students limit 3;
select * from students limit 3,4;
- 使用完全限定的字段名或表名
select name from students;
select students.name from students;
select students.name from school.students;
order by
- 注意
order by子句必须位于from子句之后,而limit子句则必须位于order by子句之后 - 单列排序
排序时的顺序默认为升序,如果需要降序,可以加上desc子句
select * from students order by age;
select * from students order by age desc;
- 多列排序
多列排序时,会按照前后顺序依次对比排序,即先按照age排序,相同则按照classid
select * from students order by age,classid;
where
- 注意
where子句和order by子句同时使用时,order by必须位于where之后 - where子句操作符
=
等于
>=
大于等于
<=
小于等于
!=
不等于
between...and...
两个值之间
is null
为空
is not null
不为空 - and与or
and表示与,or表示或,and的计算优先级比or要高,因此组合使用时可能会有问题
select * from students where age>18 and age<25;
select * from students where age>18 or sex='女';
- in与not
下列语句的含义是选取年龄18或25的列,用法类似or,但是比or更直观简洁,且效率高
而not in表示选取年龄不为18或25的列,在更复杂的子句中,not是非常有用的
select * from students where age in(18,25);
select * from students where age not in(18,25);
like
like模糊查找,l需要搭配通配符进行使用
- 注意
除非很用必要,否则不应该把通配符置于搜索串的开头,因为这样的效率最慢 - 通配符(%)
%通配符表示任意字符出现任意次数,以下表示以a开头,以a结尾和包含a
select * from students where name like 'a%';
select * from students where name like '%a';
select * from students where name like '%a%';
- 通配符(_)
_通配符表示单个字符,除此以外与%一样 - 正则表达式regexp
MySQL也支持正则,使用方式如下
select * from students where name regexp '[0-5]abc';
函数
文本处理函数
Left()
返回串左边的字符,需要传入2个参数,字符串和截取的字符个数
Right()
返回串右边的字符,需要传入2个参数,字符串和截取的字符个数
SubString()
返回子串的字符,需要传入3个参数,以下结果为asd
select SubString('asddd',1,3);
Concat()
拼接字符串
日期与时间处理函数
AddTime()
增加一个时间(时分秒)
AddDate()
增加日期
CurDate()
当前日期,格式为yyyy-mm-dd
CurTime()
当前时间,格式为hh-MM-ss
Now()
当前的日期和时间
DateDiff()
计算两个时间之差
year()
返回该日期类型的年份
select * from student where year(birthday)=2000;
数值处理函数
Abs()
返回一个数的绝对值
Exp()
返回一个数指数值
Rand()
返回随机数
聚集函数
COUNT()
返回某列的行数,注意如果指定列有NULL值,则该行被忽略
select count(age) from students;
select count(*) from students where classid = 1;
MAX()
返回某列的最大值
MIN()
返回某列的最小值
SUM()
返回某列值之和
AVG()
返回某列的平均值
select max(age),min(age),sum(age),avg(age) from students;
使用聚集函数时,大部分的情况都需要配合group by使用,如果不配合group by
聚集函数求出的值为表中全部行的相应值
group by
group by分组是为了配合聚集函数而使用的,将表中的字段分组显示,进行聚集运算
select school,count(*) as nums from student group by school;
使用group by需要注意一种非常容易出错的情况:
这是错误的写法,因为select里有school,name而group by只有school
select school,name,count(*) as nums from student group by school;
这是正确的写法,select了几个字段,group by也要相应有几个字段
select school,name,count(*) as nums from student group by school,name;
还要group by接的字段只可以用,隔开,千万不要手贱加上and或者or
having
在使用group by分组完的表格,还可以进一步进行过滤分组,这时候需要使用having
以下语句表示按学校分组,并显示各学校的人数,且仅显示人数大于5的学校
select school,count(*) as nums from student group by school having nums>5;
需要注意的是,having与where有很大的相似性,where子句基本都可以被having代替
在SQL里,where主要用于选择行,而having主要用于选择分组