简单查询:
SELECT *FROM 表名 表的别名 ; (表的别名可加可不加)
演示:
#查询所有学生#
SELECT *FROM student;
或 SELECT *FROM student;
查询指定数据
多个数据之间以逗号分隔
SELECT 字段名1,字段名2..FROM 表名;
演示:
#查询学生的姓名和年龄#
SELECT name,age FORM student;
指定列的别名进行查询
使用别名的好处,显示的时候使用新的名字,并不修改表的结构。
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名;
as可以省略
对表和列同时指定别名
SELECT 字段名1 AS 别名 ,字段名2 AS别名..FROM 表名 AS 别名
# 使用别名
select name as 名字 , age as 年龄 from student;
# 表使用别名
select s.name as 名字 , s.age as 年龄 from student as s;
清除重复值:
查询指定列且结果不出现重复数据:
SELECT DISTINCT 字段名 FROM 表名;
演示:
# 查询stu表中的性别
select sex from stu;
# 去掉重复的记录
select distinct sex from stu;
查询结果参与运算
SELECT 列名1+数值 FROM 表名;
SELECT 列名1+列名2 FROM 表名;
列名的数据类型必须是数值类型,若参与运算的不是数值,则新增列名以相加以后的字符串命名
//准备数据:添加数学,中文成绩列,给每条记录添加对应的数学和中文成绩,查询的时候将数学和中文的成绩相加
# 查询所有人的数学成绩,以及数学+5分的结果
select math , math+5 from stu;
# 查询数学和中文的和
select * , math+chinese as 总成绩 from stu;
# as 可以省略
select * , math+chinese 总成绩 from stu;
判断
IFNULL( 列名,默认值) 如果列名不为null,返回这列的值。如果为 NULL,则返回默认值
条件查询
SELECT 字段名 FROM 表名 WHERE 条件语句;
可以用比较运算符:> 、< 、<= 、>= 、= 、<> , !=
- 还有BETWEEN...AND,表示查询的值在某个范围,例如:
#从emp表中查询deptno为10-30的员工的姓名#
SELECT ename from emp WHERE deptno BETWEEN 10 AND 30;
注意:这样查询只显示ename这一列
这样查询的是表中所有符合deptno在10-30之间的数据
SELECT * from emp WHERE deptno BETWEEN 10 AND 30;
- 若想查询deptno既等于30又等于10的数据
SELECT * from emp WHERE deptno in(10,30);
- 查询不等于10和30在in 前面加not即可。
- 查询comm为null的数据不能用comm=null,否则就是
null有两种含义
- null代表什么都没存,内存中没有这个东西。
- null代表一个值,这个值为空值,但在内存中可以找到。
comm=null就代表这个值是个空值,他代表的是一个值。
- 用comm is null 来查询comm为null的情况
SELECT* from emp WHERE comm is NULL
- 模糊查询
SELECT *FROM 表名 where 字段名 like ..
LIKE 通配符:
“%”:匹配任意多个字符串
“—”:匹配一个字符
演示:#查询mgr中最后一位是6的数据#
SELECT* from emp WHERE mgr LIKE "%6";
%代表6前面的多个字符
#查询mgr中第三位是6的数据#
SELECT* from emp WHERE mgr LIKE "__6%";
或
SELECT* from emp WHERE mgr LIKE "__6_";
排序
SELECT *FROM 表名 ORDER BY 字段名 (ASC||DESC)
默认asc(升序),可以不加
- 若条件查询和排序同时运用,先进行条件查询后进行排序。
聚合函数
SQL中的聚合函数 | 作用 |
max( 列名) | 求这一列的最大值 |
min( 列名) | 求这一列的最小值 |
avg( 列名) | 求这一列的平均值 |
count( 列名) | 统计这一列有多少条记录 |
sum( 列名) | 对这一列求总和 |
演示:
SELECT MAX(sal) from emp
若想知道sal为最大值时的ename,不能直接写成SELECT MAX(sal),ename from emp
这样只会查询的是第一个ename
要写成SELECT ename from emp WHERE sal=(SELECT MAX(sal) FROM emp)
后面的条件语句不能直接写聚合函数,但是可以“套娃”
分组
分组查询是指使用 GROUP BY 语句对查询信息进行分组,相同数据作为一组
SELECT 字段 1, 字段 2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];
GROUP BY 将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。
分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
注意:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的
having 与where的区别:
子名 | 作用 |
where 子句 | 1) 对查询结果进行分组前,将不符合 where 条件的行去掉,即在分组之前过滤数据,即先过滤再分组。 2) where 后面不可以使用聚合函数 |
having 子句 | 1) having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。 2) having 后面可以使用聚合函数 |
分页limit语句
LIMIT 是限制的意思,所以 LIMIT 的作用就是限制查询记录的条数。
SELECT *| 字段列表 [as 别名] FROM 表名 [WHERE 子句] [GROUP BY 子句][HAVING 子句][ORDER BY 子句][LIMIT子句];
LIMIT offset,length;
offset :起始行数,从 0 开始计数,如果省略,默认就是 0
length : 返回的行数(记录数)
-- 查询学生表中数据,从第 3 条开始显示,显示 6 条。
select * from student3 limit 2,6;
-- 如果第一个参数是 0 可以省略写:
select * from student3 limit 5;
-- 最后如果不够 5 条,有多少显示多少
select * from student3 limit 10,5;
起始行数=(当前页-1)*记录数