SQL语句之查

where条件

group by分组

order by排序

limit限定

创建一张成绩表,插入数据

insert into mark (id,name,math,english,han) values (1,'张三',80,90,100),
    -> (2,'李四',80,90,59),
    -> (3,'王二',95,95,86),
    -> (4,'麻子',78,23,77),
    -> (5,'老王',98,11,77);

查询语法:

SELECT *|field1,filed2 ...   FROM tab_name
                  WHERE 条件
                  GROUP BY field 分组
                  HAVING 筛选
                  ORDER BY field 排序
                  LIMIT 限制条数

 from后面跟表名,代表从那个表中查询;* 代表全部字段,也可以指定相应字段

eg

select * from mark;

返回

+----+--------+------+---------+-----+
| id | name   | math | english | han |
+----+--------+------+---------+-----+
|  1 | 张三   |   80 |      90 | 100 |
|  2 | 李四   |   80 |      90 |  59 |
|  3 | 王二   |   95 |      95 |  86 |
|  4 | 麻子   |   78 |      23 |  77 |
|  5 | 老王   |   98 |      11 |  77 |
+----+--------+------+---------+-----+
5 rows in set (0.00 sec)

distinct可以去除重复的数据,只是在显示的时候去除,并不是真正的删除。

select distinct math from mark;

select 也可以使用表达式,并且可以使用: 字段 as 别名或者:字段 别名

eg:查询张三的总成绩

select name as 姓名,math+english+han as 总成绩 from mark where id =1

结果

+--------+-----------+
| 姓名   | 总成绩    |
+--------+-----------+
| 张三   |       270 |
+--------+-----------+
1 row in set (0.00 sec)

1、where条件

where字句中可以使用:

a、比较运算符:

1、>   <   >=   <=

2、<>:不等于

3、!=:不等于

4、between 80 and 100 :值在80到100之间

5、in(80,90,100) :值是80或90或100

6、like '张%':匹配张开头字符串,张后面可以有任意多字符,例如:老王,老王八,都可匹配

7、like '张_':匹配张开头字符串,张后面只能有一个字符,只能匹配老王八,一个下划线一个字符,以此类推。

b、逻辑运算符

在多个条件直接可以使用逻辑运算符 and or not

eg:查询张三和李四的成绩

一种错误写法

select name,math,english,han from mark where id=1 and id=2

输出

Empty set (0.00 sec)

此sql语句要表达的意思是id号既是1又是2的数据,根本不存在,所以报错

正确写法

select name,math,english,han from mark where id=1 or id=2

2、order by 排序

asc 升序、desc 降序,其中asc为默认值, order by子句应位于SELECT语句的结尾

eg:将所有人的成绩按照数学成绩降序进行排列

select name,math from mark order by math desc;

输出

+--------+------+
| name   | math |
+--------+------+
| 老王   |   98 |
| 王二   |   95 |
| 张三   |   80 |
| 李四   |   80 |
| 麻子   |   78 |
+--------+------+ 

3、聚合函数

a、count(列名):统计行的个数

eg:统计学生数

select count(*) as 学生数  from mark; 

结果

+-----------+
| 学生数    |
+-----------+
|         5 |
+-----------+ 

b、SUM(列名):统计满足条件的行的内容和

eg:查询学生数学的总成绩

select sum(math) as 数学  from mark; 

结果

+--------+
| 数学   |
+--------+
|    431 |
+--------+

注意:null和任何数做运算结果都为null,所以在进行操作时,要先将null转换为0

eg:将math修改为可null,添加一组name=‘bbu’,math为null的数据,计算bbu总成绩

不将null转换为0时的结果:

alter table mark modify math tinyint null;
insert into mark(name,english,han) values ('bbu',45,44);
select sum(math+english+han) as 数学总成绩 from mark where name='bbu';

结果

+-----------------+
| 数学总成绩      |
+-----------------+
|            NULL |
+-----------------+

将null转换为0后:

select sum(ifnull(math,0)+english+han) as 总成绩 from mark where name='bbu';

结果:

+-----------+
| 总成绩    |
+-----------+
|        89 |
+-----------+

c、AVG(列名):求平均值

eg:求数学成绩平均值

select avg(math) as 数学成绩平均值  from mark;

结果

+-----------------------+
| 数学成绩平均值          |
+-----------------------+
|               86.2000 |
+----------------------- 

d、Max、Min:求最大值与最小值

eg:查询数学成绩最高的分数

select max(math) as 数学最高分数 from mark;

结果

+--------------------+
| 数学最高分数       |
+--------------------+
|                 98 |
+--------------------+

4、group by:分组查询

a、按分组条件分组后每一组只会显示第一条记录,其后可以接多个列名,也可以跟having子句,对group by的结果进行筛选

eg:按照math分组

select id,name,math from mark group by math;
select id,name,sum(math) from mark group by math having id=3;

输出

+----+--------+------+
| id | name   | math |
+----+--------+------+
|  6 | bbu    | NULL |
|  4 | 麻子   |   78 |
|  1 | 张三   |   80 |
|  3 | 王二   |   95 |
|  5 | 老王   |   98 |
+----+--------+------+
mysql> select id,name,sum(math) from mark group by math having id=3;
+----+--------+-----------+
| id | name   | sum(math) |
+----+--------+-----------+
|  3 | 王二   |        95 |
+----+--------+-----------+

b、having 和 where两者都可以对查询结果进行进一步的过滤,差别有:

1、where语句只能用在分组之前的筛选,having可以用在分组之后的筛选;

2、使用where语句的地方都可以用having进行替换

3、having中可以用聚合函数,where中就不行

5、limit:限制条数

eg:查询前两条内容

select * from mark limit 2;
+----+--------+------+---------+-----+
| id | name   | math | english | han |
+----+--------+------+---------+-----+
|  1 | 张三   |   80 |      90 | 100 |
|  2 | 李四   |   80 |      90 |  59 |
+----+--------+------+---------+-----+

eg:跳过前2条查询后3条内容

mysql> select * from mark limit 2,3;
+----+--------+------+---------+-----+
| id | name   | math | english | han |
+----+--------+------+---------+-----+
|  3 | 王二   |   95 |      95 |  86 |
|  4 | 麻子   |   78 |      23 |  77 |
|  5 | 老王   |   98 |      11 |  77 |
+----+--------+------+---------+-----+

回到顶部

 

posted @ 2018-05-07 22:35  sumcet  阅读(435)  评论(0编辑  收藏  举报