MySQL查询语句


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主要用于选择分组


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值