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;

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

<think> 我们有一个需求:查询余额高于10000的所有用户的名字和余额。除了使用公共表达式(CTE)之外,我们还可以使用多种方法。 根据引用[1]中提到的银行用户表结构(假设表名为“银行用户表”,有“姓名”和“余额”字段),我们可以编写SQL语句。 常见的其他方法包括: 1. 直接使用SELECT语句的WHERE子句进行过滤。 2. 使用子查询(虽然公共表达式也是子查询的一种,但这里指其他形式的子查询,比如在FROM子句中的子查询)。 3. 使用视图(但视图并不是一次性的查询,这里我们主要讨论一次性的查询语句)。 4. 使用临时表(但同样,我们主要讨论查询语句,临时表需要创建和删除,不太适合作为单一查询)。 因此,最直接的方法就是使用简单的SELECT语句。 根据引用[2]和引用[3],我们可以写出基本的SELECT语句,注意引用[3]中使用了别名,引用[5]中使用了ORDER BY排序(虽然这里不需要排序,但我们可以选择是否排序)。 因此,我们可以这样写: 方法1:直接查询 ```sql SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000; ``` 但是,我们也可以使用子查询(虽然在这个简单需求中子查询没有必要,但为了展示多种写法): 方法2:使用FROM子句中的子查询 ```sql SELECT 姓名, 余额 FROM ( SELECT 姓名, 余额 FROM 银行用户表 ) AS 用户余额表 WHERE 余额 > 10000; ``` 方法3:我们还可以使用内联视图(实际上就是方法2)。 另外,如果我们需要对结果进行排序(例如按余额降序排列),可以加上ORDER BY子句(引用[5]): ```sql SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000 ORDER BY 余额 DESC; ``` 注意:引用[4]提到了索引的问题。如果我们在“余额”列上建立索引,那么查询效率会更高。否则,数据库可能进行全表扫描。 因此,除了公共表达式(CTE)之外,我们可以使用上述的直接查询或子查询的方式。其中,直接查询是最简单和高效的。 下面给出一个完整的例子(假设表名为`银行用户表`): ```sql -- 方法1:简单查询 SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000; -- 方法2:使用子查询(虽然在这里没有优势) SELECT 姓名, 余额 FROM ( SELECT 姓名, 余额 FROM 银行用户表 ) AS 子查询表 WHERE 余额 > 10000; -- 如果需要排序(降序) SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000 ORDER BY 余额 DESC; ``` 总结:对于这个需求,最简单的就是直接使用WHERE子句过滤。公共表达式(CTE)通常用于更复杂的查询,比如需要递归或多次引用同一个子查询结果集时。在简单查询中,直接查询即可。 注意:如果表名或字段名是英文的,那么应该使用英文,比如表名可能是`bank_account`,字段名为`name`和`balance`。但根据引用[1]中的表名和字段名,我们使用了中文。如果实际表结构是英文的,则需要修改。 另外,引用[2]提到,关键字和字段名不区分大小写,但数据严格区分大小写。不过在我们这个查询中,余额是数值,不存在大小写问题。 因此,根据用户需求,我们给出了不使用公共表达式的其他写法。 相关问题: 1. 如果余额字段包含小数,那么查询条件中是否需要考虑浮点数精度问题? 2. 当数据量很大时,如何优化这个查询? 3. 在银行系统中,查询账户余额时需要注意哪些事务隔离级别? </think>根据您的需求,我提供了三种不使用公共表达式(CTE)的SQL写法来查询余额高于10000的用户信息: ### 方法1:基础WHERE过滤(最简洁) ```sql SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000; ``` **说明**: 直接使用`WHERE`子句过滤条件,这是最高效的写法。当`余额`列有索引时,数据库会使用索引扫描(Index Scan),否则执行全表扫描(Table Scan)[^4]。 --- ### 方法2:派生表子查询(适用于复杂过滤) ```sql SELECT 姓名, 余额 FROM ( SELECT 姓名, 余额 FROM 银行用户表 ) AS 用户余额 WHERE 余额 > 10000; ``` **说明**: 通过FROM子句中的子查询创建派生表,适合需要预先处理数据的场景。注意使用`AS`为派生表命名是必须的[^2]。 --- ### 方法3:视图查询(可复用方案) ```sql -- 第一步:创建视图 CREATE VIEW 高余额用户视图 AS SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000; -- 第二步:查询视图 SELECT * FROM 高余额用户视图; ``` **说明**: 视图将查询逻辑持久化,适合需要多次使用的场景。查询视图时等同于执行视图定义的SQL语句[^2]。 --- ### 性能说明 1. **索引优化**: 在`余额`列创建索引可大幅提升查询性能: ```sql CREATE INDEX idx_余额 ON 银行用户表(余额); ``` 有索引时执行**索引范围扫描**,无索引时执行**全表扫描**[^4]。 2. **结果排序**: 如需按余额降序排列,添加: ```sql ORDER BY 余额 DESC; -- DESC表示降序[^5] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值