2020-08-07

查询

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

执行顺序

  1. From 先查出全表数据
  2. Where 再过滤一部分
  3. Group by 过滤之后再分组
  4. Having 分组后再过滤
  5. Select 准备展现
  6. Order 展现时按照顺序排序
  7. 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;

不知道是记性不好了 ,还是咋了 ,看得再多都是记不住 , 还是要多敲代码啊,我给我自己的奖励 “大嘴巴子”,加油。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值