查询
select:返回从表中查出的数据,返回到的是一张虚拟表
基本查询
SELECT 字段1,字段2,… FROM 表名;
1)字段顺序与原表无关
2)字段个数根据需求而定
3)返回的虚拟表字段顺序与原表无关,与select后的字段顺序有关
– 查询所有列:
SELECT * FROM 表名
SELECT sid,sname,age,gender,score,cid,groupLeaderId FROM stu;
-- 查询指定列
-- 查询学生学号和姓名
SELECT sid,sname FROM stu;
--查询学生学号和成绩
SELECT sid,score FROM stu;
– ========================================
条件查询
返回符合条件的数据
条件查询需要在 基础查询语句后,使用where 字段 运算符 值;
条件查询关系符号: > < >= <= != = and, or ,
in (set)
(set)是说in后是集合,集合数据不重复,查询的数据满足集合中的条件,即可返回
not in , butween and
-- 查询学号为1的学生信息
SELECT * FROM stu WHERE sid = 1001;
-- 查询学生性别为女,并且年龄小于50的记录
SELECT * FROM stu WHERE gender = '女'AND age<50;
-- 查询学生学号为1001,或者姓名为李四的记录
SELECT * FROM stu WHERE sid = 1001 OR sname = '李四';
-- 查询学号为1001,1002,1003的记录
-- SELECT * FROM stu WHERE sid=1001 OR sid=1002 OR sid=1003;错误的
SELECT * FROM stu WHERE sid IN(1001,1002,1003);
-- 查询学号不是1001,1002,1003的记录
-- SELECT * FROM stu WHERE sid != 1001 AND sid != 1002 AND sid !=1003;
SELECT * FROM stu WHERE sid NOT IN(1001,1002,1003);
-- 查询学生年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
-- 查询性别非男的学生记录
SELECT * FROM stu WHERE gender != '男';
-- 查询学生分数大于60的学生id 姓名 分数,SELECT sid ,sname,score FROM stu WHERE score >60;
-- ============
模糊查询
WHERE 字段 LIKE ‘%或者_值’
% 匹配任意个数的字符
%张->以’张’结尾,前边任意
张%->以’张’开头,后边任意
%张% ->只要内容包含’张’ 即可。
_匹配一个任意字符
– 查询姓名以’张’开头的学生记录
SELECT * FROM stu WHERE sname LIKE '%张';
-- %张 以张结尾SELECT * FROM stu WHERE sname LIKE '张%';
-- 以张开头, 后面任意SELECT * FROM stu WHERE sname LIKE '_张';
-- 以张开头 一个_代表一个字SELECT * FROM stu WHERE sname LIKE '张_';
-- 查询姓名中包含“三”的学生记录
SELECT * FROM stu WHERE sname like '%三%';
-- =
===========================================
排序查询
基础查询后使用, ORDER BY 字段 排序类型;排序类型: 升序 ASC,降序 DESC 默认是升序,可以不写.
注意:如果没有条件查询,ORDER BY放在基础查询后,如果有条件查询, 规定必须要放在条件查询后.
-- 查询所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY age;
-- 查询所有学生记录,按年龄降序排序
SELECT * FROM stu ORDER BY age DESC;
-- 查询所有学生记录,按年龄升序排序,如果年龄相同时,按编号降序排序
SELECT * FROM stu ORDER BY age ,sid DESC;
-- 查询成绩达于60的学生id,姓名,成绩,并根据成绩降序
SELECT * FROM stu WHERE score>60 ORDER BY score desc ;
聚合函数
计算多行数据,返回一个值 count(字段) :计算制定列非空(不是null)行数的数量
""空字符串不是nullsum :计算指定列 数值数据的和
不计算null值,略过
如果有字符串参与求和,结果为0
max :返回指定列 最大值
min :返回指定列 最小值
按照数字大小返回
如果是字符串,按照字符顺序排序a
vg :计算指定列 平均值
如果有值为null,就不参与求和与平均值计算
所有聚合函数不能出现在where后
SELECT 聚合函数,聚合函数,其他字段(分组后) FROM 表名 [条件][排序];
-- 查询stu表中记录数:
SELECT COUNT(*) FROM stu;
-- 查询stu表中有成绩的人数:S
ELECT COUNT(score) FROM stu;SELECT COUNT(gender) FROM stu;#个数为10 空字符串不是null
-- 查询stu表中成绩大于60的人数:
SELECT COUNT(*) FROM stu WHERE score>60;
-- 查询所有学生成绩和:
SELECT SUM(score) FROM stu;
-- 如果有字符串参与求和,结果为0
SELECT SUM(sname) FROM stu;
-- 统计所有学生平均成绩
SELECT AVG(score) FROM stu;
-- 查询最高成绩和最低成绩:
SELECT MAX(score) , MIN(score) FROM stu;
SELECT MAX(sname) AS '最大值' , MIN(sname) '最小值' FROM stu;
别名
给查询的列取别名:字段后使用 as '别名', as可以省略,别名可以在条件中使用;
-- 查询编号为1 的信息[表名取别名,条件中使用别名]
SELECT * FROM stu WHERE sid = 1001;
SELECT * FROM stu s WHERE s.sid =1001 ;
-- 查询学生成绩和姓名,并根据成绩降序[字段取别名,条件中使用别名]
SELECT sname,score AS s FROM stu ORDER BY s DESC;
去重查询
DISTINCT(列名):一般不会单独使用,配合count使用
-- 查询年龄不重复的人的信息
-- SELECT DISTINCT(age),sid,sname FROM stu;#没有达到年龄去重的效果SELECT COUNT(DISTINCT(age)) FROM stu;
分组查询 使用group by 字段(列名) 对数据进行分组特点:
分成几组,返回的虚拟表数据就有几行,每一组只展示一行,及每一行代表一组
与聚合函数一起出现在select 后的字段(列名),要出现在group by 后
一般情况下,分组查询智慧和聚合函数使用,因为查询其他字段无意义
SELECT * FROM stu [条件 WHERE][分组 GROUP BY][排序 ORDER BY]
-- 查询男生多少人,女生多少人,且每个分组中的人数,和每个分组中年龄最大值SELECT gender,COUNT(sid),MAX(age) FROM stu GROUP BY gender;
-- 查询每个班级的班级编号和每个班级的成绩和:
SELECT cid,COUNT(sid),SUM(score) FROM stu GROUP BY cid;
-- 查询每个班级的班级编号以及每个班级的人数:
SELECT cid'班号',COUNT(sid)'人数' FROM stu GROUP BY cid;
-- 查询成绩总和大于200的班级编号以及成绩和:[先分组再过滤] **分组前过滤用where 分组后过滤用having ,与where类似,用于条件过滤 HAVING age > 20;
SELECT cid'班号',SUM(score)'总分' FROM stu GROUP BY cid HAVING SUM(score)>200;
-- 查询成绩总和大于200的班级编号以及成绩和并根据成绩总和降序
SELECT cid '班号',SUM(score) 总分FROM stuGROUP BY cidHAVING 总分 > 200ORDER BY 总分 DESC;
分页查询
LIMIT限制查询/限制输出==>分页
特点: limit放在查询语句最后
格式: limit 起始下标,条数;数据下表从开始,即第一行下标是0
作用: 只会让查询到的数据, 从起始下标开始,输出指定条数
-- 查询出学生表前两条数据
SELECT * FROM stu LIMIT 0,2;
-- 查询出学生第5条至第六条的数据
SELECT * FROM stu LIMIT 4,2;
-- 查询成绩大于60的学生信息,并按照成绩降序,输出其中前两条数据
-- 输出两条成绩大于60且按照成绩降序后的学生信息
SELECT * FROM stu WHERE score > 60 ORDER BY score DESC LIMIT 0,2;
每页条数pageSize:
已知当前页pageNo:
已知总条数total:count计数
总页数pageCount = (total%pageSize)==0?total/pageSize:(total/pageSize)+1*/
-- 已知有total条数据,每页展示3条数据
-- 第一页
pageSizeSELECT * FROM stu LIMIT 0,3;
-- 第二页
SELECT * FROM stu LIMIT 3,3;
-- 第三页S
ELECT * FROM stu LIMIT 6,3;
-- 第四页
SELECT * FROM stu LIMIT 9,3;
-- 第五页
SELECT * FROM stu LIMIT (pageNo-1)*pageSize,pageSize;
书写顺序
SELECT
* FROM
TABLENAME WHRER
XX=XX GROUP BY
XX HAVING
ORDER BY
XX DESC LIMIT
X,Z;
SELECT
->FROM
->WHERE
->GROUP
->HAVING
->ORDER
->LIMIT
执行顺序
- From 先查出全表数据
- Where 再过滤一部分
- Group by 过滤之后再分组
- Having 分组后再过滤
- Select 准备展现
- Order 展现时按照顺序排序
- Limit 展现时按照要求限制输出
流程控制函数
流程控制函数
CASE
WHEN 条件1 THEN 执行语句1
WHEN 条件2 THEN 执行语句2
ELSE 执行语句3
END
几个when 语句,与Java中的 else if 类似,满足条件,执行语句, 不满足条件,执行下个when语句 一旦执行了某个then语句,case结构结束,不再执行 如果when都不满足,执行else后语句[CASE WHEN THEN ELSE END] 整体当作一个字段出现在select 后,可以取别名
-- 输出学生id,姓名,成绩,及成绩等级(0-59差 60-79中 80-90良 91-100优)
SELECT sid'学号',sname'姓名',score'成绩' ,CASE WHEN score <60 THEN '差' WHEN score <80 THEN '中' WHEN score <90 THEN '良' ELSE '优'END AS '成绩等级' FROM stu;
IF(expr1,expr2,expr3)如果 expr1是true,则IF()的返回值为expr2;否则返回值则为expr3。IF()的返回值为数字值或字符串值
SELECT if(1<0,'大','小') FROM DUAL;
-- 查询学生id,姓名,成绩,如果成绩为null,显示缺考
-- ISNULL()函数
-- ISNULL(字段) 如果是null, 返回1 否则返回0
SELECT sid,sname,if(ISNULL(score)=0,score,'缺考')成绩 FROM stu;
IFNULL(expr1,expr2)加入expr1 不为null,则IFNULL() 的返回值为expr1;
否则其返回值为expr2.IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境
SELECT sid,sname,IFNULL(score,'缺考')成绩 FROM stu;
不知道是记性不好了 ,还是咋了 ,看得再多都是记不住 , 还是要多敲代码啊,我给我自己的奖励 “大嘴巴子”,加油。