SELECT * FROM <tablename>;
SELECT是SQL关键字,SQL关键字是不区分大小写的,但是表名是区分大小写的。SELECT关键字表示查询操作,而*表示查询所有字段。FROM是SQL关键字,表示从哪张表查询。tablename是表名。分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的 SQL 语句。另外MySQL要求每条SQL语句的结束都需要加上分号。
例如:
SELECT * FROM students;
SELECT语句还可以单独使用,通常用来检查当前数据库连接是否有效。通常是使用SELECT 1;来进行判断。
SELECT语句可以通过WHERE
条件来设定查询条件。格式如下:
SELECT * FROM <tablename> WHERE <condition>;
WHERE是SQL的关键字,condition是限制条件。
例如:
SELECT * FROM students WHERE score >= 90;
其中条件表达式可以使用AND,OR,NOT关键字来进行条件之间的组合。AND,OR,NOT的意思和C语言中的&&,||,! 没有区别。下面来分别展示一下相关的查询实例。
SELECT * FROM students WHERE score >= 80 AND id = 1;
SELECT * FROM students WHERE score >= 90 OR score <= 60;
SELECT * FROM students WHERE NOT id = 3;
AND, NOT, OR之间存在优先级关系。NOT优先级最高,其次是AND,最后是OR。同样,和C语言中建议的一样,我们在使用它们的时候,为了使程序方便阅读,建议加上括号。例如:
SELECT * FROM students WHERE (NOT class_id = 3) AND (score >= 80);
无论是基础查询还是条件查询,最终的结果都是显示了所有字段。即:包含了id, class_id, name, gender, score。如果我们只关心name字段,那么查询语句应该按照如下格式:
SELECT <字段列表> FROM <表名>;
下面是一个实例,展示了如何指定相关字段进行查询。
SELECT class_id, name FROM students WHERE class_id = 1;
查询结果显示了表中一班所有的同学。如果你不想显示class_id,那么查询语句可以改为如下。
SELECT name FROM students WHERE class_id = 1;
注意到,我们使用SELECT * FROM students;默认按照id升序来排列。其实我们可以指定排序的字段,使用ORDER BY关键字即可。语句格式如下:
SELECT * FROM students ORDER BY score;
这样的查询默认是按照升序排列的,如果需要按照降序排列,那么需要加上DESC。
SELECT * FROM students ORDER BY score DESC;
有时候,分数相同,你可能会进一步按照其他规则来排列,例如按照class_id来排列。那么就还需要加上class_id。下面展示的是score和class_id都是按照DESC(降序)来排列。
SELECT name,score,class_id FROM students ORDER BY score,classid DESC;
我们还可以指定score按照DESC排列,但是class_id按照升序排列。
SELECT name,score,class_id FROM students ORDER BY score DESC,class_id;
实际上,默认是升序是ASC。但是ASC可以省略,即:ORDER BY score ASC;和ORDER BY score;是一样的。下面,结合WHERE条件查询,给出一个例子,查询1班的成绩,按照降序输出。
SELECT class_id,name,score FROM students WHERE class_id = 1 ORDER BY score DESC;
有时候数据量很大,很多,一页根本显示不下,但是你又必须看看数据库中的数据。那么这时候,你就需要分页显示。子句格式如下。
LIMIT <M> OFFSET <N>
LIMIT 3表示最多显示3个记录,OFFSET 0表示从0号记录开始显示。那么查询下一页的命令应该如下:
SELECT class_id,name,score FROM students ORDER BY score LIMIT 3 OFFSET 3;
以此类推,查询下下一页应该是LIMIT 3 OFFSET 6;一直到LIMIT 3 OFFSET 9;会把剩下的都显示出来,因为我们就只有10条信息。
OFFSET
是可选的,如果只写LIMIT 15
,那么相当于LIMIT 15 OFFSET 0
。在MySQL中,LIMIT 15 OFFSET 30
还可以简写成LIMIT 30, 15
。使用LIMIT <M> OFFSET <N>
分页时,随着N
越来越大,查询效率也会越来越低。
SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询。下面以使用SQL内置的COUNT()
函数查询为例进行说明。
COUNT(*)
表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT(*)。
通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果:
SELECT COUNT(*) num FROM students;
实际上,COUNT(*)和COUNT(id)的效果是一致的。
除了COUNT()
函数外,SQL还提供了如下聚合函数:
函数 | 说明 |
---|---|
SUM | 计算某一列的合计值,该列必须为数值类型 |
AVG | 计算某一列的平均值,该列必须为数值类型 |
MAX | 计算某一列的最大值 |
MIN | 计算某一列的最小值 |
例如计算总分和平均分。
还可以加上条件限制,例如计算一班的平均分。
多表查询的结果是表的乘积,不是显示多个表。这个非常不好用,因为很容易就导致表很大。下面是个例子。
SELECT * FROM students,classes;
其实就是这张表变成了40行记录了,如果你有两张1万行记录的表,你去查询它,那么将导致表的记录变成了1亿。
连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。
现在,我们希望结果集同时包含所在班级的名称,上面的结果集只有class_id
列,缺少对应班级的name
列。我们可以将students表作为主表,把classes表中的name列连接在主表上。
SELECT s.id,
s.class_id,
c.name class_name,
s.name,
s.gender,
s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;
ON后面是限制条件,表示students
表的class_id
列与classes
表的id
列相同的行需要连接。INNER JOIN是内连接。除此之外,还有外连接(OUTER JOIN)。把上面的内连接改成外连接。
SELECT s.id,
s.class_id,
c.name class_name,
s.name,
s.gender,
s.score
FROM students s
RIGHT OUTER JOIN classes c
ON s.class_id = c.id;
INNER JOIN只返回同时存在于两张表的行数据,由于students
表的class_id
包含1,2,3,classes
表的id
包含1,2,3,4,所以,INNER JOIN根据条件s.class_id = c.id
返回的结果集仅包含1,2,3。
RIGHT OUTER JOIN返回右表都存在的行。如果某一行仅在右表存在,那么结果集就会以NULL
填充剩下的字段。
LEFT OUTER JOIN则返回左表都存在的行。如果我们给students表增加一行,并添加class_id=5,由于classes表并不存在id=5的行,所以,LEFT OUTER JOIN的结果会增加一行,对应的class_name
是NULL
:
SELECT s.id, s.class_id, c.name class_name, s.name,s.gender, s.score FROM students s LEFT OUTER JOIN classes c ON s.class_id = c.id;
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有