SQL语句之查
创建一张成绩表,插入数据
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 | +----+--------+------+---------+-----+