MySQL基础 - 简单查询
为简单起见,我们就复用之前在数据库xiaohaizi
下边创建的学生信息表student_info
和学生成绩表student_score
,你可能有点忘了这两个表长啥样了,我们先把两个表的结构回顾一下:
学生基本信息表的结构
CREATE TABLE student_info (number INT PRIMARY KEY,name VARCHAR(5),sex ENUM('男', '女'),id_number CHAR(18),department VARCHAR(30),major VARCHAR(30),enrollment_time DATE,UNIQUE KEY (id_number)
);
学生成绩表的结构
CREATE TABLE student_score (number INT,subject VARCHAR(30),score TINYINT,PRIMARY KEY (number, subject),CONSTRAINT FOREIGN KEY(number) REFERENCES student_info(number)
);
为表填入数据
我们给这两个表插入一些数据:
mysql> INSERT INTO student_info(number, name, sex, id_number, department, major, enrollment_time) VALUES-> (20180101, '杜子腾', '男', '158177199901044792', '计算机学院', '计算机科学与工程', '2018-09-01'),-> (20180102, '杜琦燕', '女', '151008199801178529', '计算机学院', '计算机科学与工程', '2018-09-01'),-> (20180103, '范统', '男', '17156319980116959X', '计算机学院', '软件工程', '2018-09-01'),-> (20180104, '史珍香', '女', '141992199701078600', '计算机学院', '软件工程', '2018-09-01'),-> (20180105, '范剑', '男', '181048199308156368', '航天学院', '飞行器设计', '2018-09-01'),-> (20180106, '朱逸群', '男', '197995199501078445', '航天学院', '电子信息', '2018-09-01');
Query OK, 6 rows affected (0.01 sec)
Records: 6 Duplicates: 0 Warnings: 0mysql> INSERT INTO student_score (number, subject, score) VALUES-> (20180101, '母猪的产后护理', 78),-> (20180101, '论萨达姆的战争准备', 88),-> (20180102, '母猪的产后护理', 100),-> (20180102, '论萨达姆的战争准备', 98),-> (20180103, '母猪的产后护理', 59),-> (20180103, '论萨达姆的战争准备', 61),-> (20180104, '母猪的产后护理', 55),-> (20180104, '论萨达姆的战争准备', 46);
Query OK, 8 rows affected (0.00 sec)
Records: 8 Duplicates: 0 Warnings: 0mysql>
现在这两个表中的数据就如下所示了:
student_info表
number | name | sex | id_number | department | major | enrollment_time |
---|---|---|---|---|---|---|
20180101 | 杜子腾 | 男 | 158177199901044792 | 计算机学院 | 计算机科学与工程 | 2018-09-01 |
20180102 | 杜琦燕 | 女 | 151008199801178529 | 计算机学院 | 计算机科学与工程 | 2018-09-01 |
20180103 | 范统 | 男 | 17156319980116959X | 计算机学院 | 软件工程 | 2018-09-01 |
20180104 | 史珍香 | 女 | 141992199701078600 | 计算机学院 | 软件工程 | 2018-09-01 |
20180105 | 范剑 | 男 | 181048200008156368 | 航天学院 | 飞行器设计 | 2018-09-01 |
20180106 | 朱逸群 | 男 | 197995199801078445 | 航天学院 | 电子信息 | 2018-09-01 |
student_score表
number | subject | score |
---|---|---|
20180101 | 母猪的产后护理 | 78 |
20180101 | 论萨达姆的战争准备 | 88 |
20180102 | 母猪的产后护理 | 100 |
20180102 | 论萨达姆的战争准备 | 98 |
20180103 | 母猪的产后护理 | 59 |
20180103 | 论萨达姆的战争准备 | 61 |
20180104 | 母猪的产后护理 | 55 |
20180104 | 论萨达姆的战争准备 | 46 |
好了,表的填充工作也已经做完了~ 终于可以开始查询数据了!
查询单个列
查看某个表中的某一列的数据的通用格式是这样:
SELECT 列名 FROM 表名;
也就是说把需要查询的列名放到单词SELECT
后边就好了,比如查看student_info
表中的number
列的数据可以这么写:
mysql> SELECT number FROM student_info;
+----------+
| number |
+----------+
| 20180104 |
| 20180102 |
| 20180101 |
| 20180103 |
| 20180105 |
| 20180106 |
+----------+
6 rows in set (0.00 sec)mysql>
可以看到查询结构中就把所有记录的number
列都展示了出来,我们有时候也把这个结果称之为结果集
。
小贴士: 你可能发现结果集中的数据并不是按照我们number列值的大小排序的,我们稍后就会说到如何指定结果集中数据的排序方式,稍安勿躁。
列的别名
我们也可以为结果集中的列重新定义一个别名
,命令格式如下:
SELECT 列名 [AS] 列的别名 FROM 表名;
我们看到AS
被加了个中括号,意味着可有可无,没有AS
的话,列名和列的别名之间用空白字符隔开就好了。比如我们想给number
列起个别名,可以使用下边这两种方式之一:
方式一
SELECT number AS 学号 FROM student_info;
方式二:
SELECT number 学号 FROM student_info;
我们执行一下:
mysql> SELECT number AS 学号 FROM student_info;
+----------+
| 学号 |
+----------+
| 20180104 |
| 20180102 |
| 20180101 |
| 20180103 |
| 20180105 |
| 20180106 |
+----------+
6 rows in set (0.00 sec)mysql>
看到黑框框里的结果集中显示的列名就不再是number
,而是我们刚刚定义的别名学号
了。不过需要注意的是:别名只是在本次查询的到的结果集中展示,而不会改变真实表中的列名。下一次查询中你对number
列取其他的别名也可以,比如这样:
mysql> SELECT number xuehao FROM student_info;
+----------+
| xuehao |
+----------+
| 20180104 |
| 20180102 |
| 20180101 |
| 20180103 |
| 20180105 |
| 20180106 |
+----------+
6 rows in set (0.00 sec)mysql>
这次输出的列名就是另一个别名xuehao
了。
查询多个列
如果想查询多个列的数据,可以在SELECT
后边写多个列名,用逗号,
分隔开就好:
SELECT 列名1, 列名2, ... 列名n FROM 表名;
我们把SELECT
语句后边跟随的多个列统称为查询列表
,需要注意的是,查询列表中的列名可以按任意顺序摆放,结果集将按照我们指定的列名顺序显示。比如我们查询student_info
中的多个列:
mysql> SELECT number, name, id_number, major FROM student_info;
+----------+-----------+--------------------+--------------------------+
| number | name | id_number | major |
+----------+-----------+--------------------+--------------------------+
| 20180101 | 杜子腾 | 158177199901044792 | 计算机科学与工程 |
| 20180102 | 杜琦燕 | 151008199801178529 | 计算机科学与工程 |
| 20180103 | 范统 | 17156319980116959X | 软件工程 |
| 20180104 | 史珍香 | 141992199701078600 | 软件工程 |
| 20180105 | 范剑 | 181048199308156368 | 飞行器设计 |
| 20180106 | 朱逸群 | 197995199501078445 | 电子信息 |
+----------+-----------+--------------------+--------------------------+
6 rows in set (0.00 sec)mysql>
本例中的查询列表就是number,name,id_number,major
,所以结果集中列的顺序就按照这个顺序来显示。当然,我们也可以用别名来输出这些数据:
mysql> SELECT number AS 学号, name AS 姓名, id_number AS 身份证号, major AS 专业 FROM student_info;
+----------+-----------+--------------------+--------------------------+
| 学号 | 姓名 | 身份证号 | 专业 |
+----------+-----------+--------------------+--------------------------+
| 20180101 | 杜子腾 | 158177199901044792 | 计算机科学与工程 |
| 20180102 | 杜琦燕 | 151008199801178529 | 计算机科学与工程 |
| 20180103 | 范统 | 17156319980116959X | 软件工程 |
| 20180104 | 史珍香 | 141992199701078600 | 软件工程 |
| 20180105 | 范剑 | 181048199308156368 | 飞行器设计 |
| 20180106 | 朱逸群 | 197995199501078445 | 电子信息 |
+----------+-----------+--------------------+--------------------------+
6 rows in set (0.00 sec)mysql>
如果你乐意,同一个列可以在查询列表处重复出现(虽然这通常没什么卵用),比如这样:
mysql> SELECT number, number, number FROM student_info;
+----------+----------+----------+
| number | number | number |
+----------+----------+----------+
| 20180104 | 20180104 | 20180104 |
| 20180102 | 20180102 | 20180102 |
| 20180101 | 20180101 | 20180101 |
| 20180103 | 20180103 | 20180103 |
| 20180105 | 20180105 | 20180105 |
| 20180106 | 20180106 | 20180106 |
+----------+----------+----------+
6 rows in set (0.00 sec)mysql>
查询所有列
如果需要把记录中的所有列都查出来,MySQL
也提供一个省事儿的办法,我们之前也介绍过,就是直接用星号*
来表示要查询的东西,就像这样:
SELECT * FROM 表名;
这个命令我们之前看过了,就不多唠叨了。不过需要注意的是,除非你确实需要表中的每个列,否则一般最好别使用星号*
来查询所有列,虽然星号*
看起来很方便,不用明确列出所需的列,但是查询不需要的列通常会降低性能。
查询结果去重
去除单列的重复结果
有的时候我们查询某个列的数据时会有一些重复的结果,比如我们查询一下student_info
表的学院信息:
mysql> SELECT department FROM student_info;
+-----------------+
| department |
+-----------------+
| 计算机学院 |
| 计算机学院 |
| 计算机学院 |
| 计算机学院 |
| 航天学院 |
| 航天学院 |
+-----------------+
6 rows in set (0.00 sec)
因为表里有6条记录,所以给我们返回了6条结果。但是其实好多都是重复的结果,如果我们想去除重复结果的话,可以将DISTINCT
放在被查询的列前边,就是这样:
SELECT DISTINCT 列名 FROM 表名;
我们对学院信息做一下去重处理:
mysql> SELECT DISTINCT department FROM student_info;
+-----------------+
| department |
+-----------------+
| 计算机学院 |
| 航天学院 |
+-----------------+
2 rows in set (0.00 sec)
看到结果集中就只剩下不重复的信息了。
去除多列的重复结果
对于查询多列的情况,两条结果重复的意思是:两条结果的每一个列中的值都相同。比如查询学院和专业信息:
mysql> SELECT department, major FROM student_info;
+-----------------+--------------------------+
| department | major |
+-----------------+--------------------------+
| 计算机学院 | 计算机科学与工程 |
| 计算机学院 | 计算机科学与工程 |
| 计算机学院 | 软件工程 |
| 计算机学院 | 软件工程 |
| 航天学院 | 飞行器设计 |
| 航天学院 | 电子信息 |
+-----------------+--------------------------+
6 rows in set (0.00 sec)
查询结果中第1、2行记录中的department
和major
列都相同,所以这两条记录就是重复的,同理,第3、4行也是重复的。如果我们想对多列查询的结果去重的话,可以直接把DISTINCT
放在被查询的列的最前边:
SELECT DISTINCT 列名1, 列名2, ... 列名n FROM 表名;
比如这样:
mysql> SELECT DISTINCT department, major FROM student_info;
+-----------------+--------------------------+
| department | major |
+-----------------+--------------------------+
| 计算机学院 | 计算机科学与工程 |
| 计算机学院 | 软件工程 |
| 航天学院 | 飞行器设计 |
| 航天学院 | 电子信息 |
+-----------------+--------------------------+
4 rows in set (0.00 sec)mysql>
限制查询结果条数
有时候查询结果的条数会很多,都显示出来可能会撑爆屏幕~ 所以MySQL
给我们提供了一种限制结果集中的记录条数的方式,就是在查询语句的末尾使用这样的语法:
LIMIT 开始行, 限制条数;
开始行
指的是我们想从第几行数据开始查询,限制条数
是结果集中最多包含多少条记录。
小贴士: 在生活中通常都是从1开始计数的,而在计算机中都是从0开始计数的,所以我们平时所说的第1条记录在计算机中算是第0条。比如`student_info`表里的6条记录在计算机中依次表示为:第0条、第1条、第2条、第3条、第4条、第5条。
比如我们查询一下student_info
表,从第0条记录开始,最多查询2条记录可以这么写:
mysql> SELECT number, name, id_number, major FROM student_info LIMIT 0, 2;
+----------+-----------+--------------------+--------------------------+
| number | name | id_number | major |
+----------+-----------+--------------------+--------------------------+
| 20180101 | 杜子腾 | 158177199901044792 | 计算机科学与工程 |
| 20180102 | 杜琦燕 | 151008199801178529 | 计算机科学与工程 |
+----------+-----------+--------------------+--------------------------+
2 rows in set (0.00 sec)mysql>
如果指定的开始行
大于结果中的行数,那查询结果就什么都没有:
mysql> SELECT number, name, id_number, major FROM student_info LIMIT 6, 2;
Empty set (0.00 sec)mysql>
如果查询的结果条数不超过限制条数
,那就可以全部显式出来:
mysql> SELECT number, name, id_number, major FROM student_info LIMIT 4, 3;
+----------+-----------+--------------------+-----------------+
| number | name | id_number | major |
+----------+-----------+--------------------+-----------------+
| 20180105 | 范剑 | 181048199308156368 | 飞行器设计 |
| 20180106 | 朱逸群 | 197995199501078445 | 电子信息 |
+----------+-----------+--------------------+-----------------+
2 rows in set (0.00 sec)mysql>
从第4条开始的记录有两条,限制条数
为3,所以这两条记录都可以被展示在结果集中。
使用默认的开始行
LIMIT
后边也可以只有一个参数,那这个参数就代表着限制行数
。也就是说我们可以不指定开始行
,默认的开始行就是第0行,比如我们可以这么写:
mysql> SELECT number, name, id_number, major FROM student_info LIMIT 3;
+----------+-----------+--------------------+--------------------------+
| number | name | id_number | major |
+----------+-----------+--------------------+--------------------------+
| 20180101 | 杜子腾 | 158177199901044792 | 计算机科学与工程 |
| 20180102 | 杜琦燕 | 151008199801178529 | 计算机科学与工程 |
| 20180103 | 范统 | 17156319980116959X | 软件工程 |
+----------+-----------+--------------------+--------------------------+
3 rows in set (0.00 sec)mysql>
查询结果就展示了从第0条开始的3条记录。
对查询结果排序
我们之前查询number
列的时候得到的记录并不是有序的,这是为什么呢?MySQL
其实默认会按照这些数据底层存储的顺序来给我们返回数据,但是这些数据可能会经过更新或者删除,如果我们不明确指定按照什么顺序来排序返回结果的话,那我们可以认为该结果中记录的顺序是不确定的。换句话说如果我们想让返回结果中的记录按照某种特定的规则排序,那我们必须显式的指定排序规则。
按照单个列的值进行排序
我们可以用下边的语法来指定返回结果的记录按照某一列的值进行排序:
ORDER BY 列名 ASC|DESC
ASC
和DESC
指的是排序方向。ASC
是指按照指定列的值进行由小到大进行排序,也叫做升序
,DESC
是指按照指定列的值进行由大到小进行排序,也叫做降序
,中间的|
表示这两种方式只能选一个。这回我们用student_score
表测试一下:
mysql> SELECT * FROM student_score ORDER BY score ASC;
+----------+-----------------------------+-------+
| number | subject | score |
+----------+-----------------------------+-------+
| 20180104 | 论萨达姆的战争准备 | 46 |
| 20180104 | 母猪的产后护理 | 55 |
| 20180103 | 母猪的产后护理 | 59 |
| 20180103 | 论萨达姆的战争准备 | 61 |
| 20180101 | 母猪的产后护理 | 78 |
| 20180101 | 论萨达姆的战争准备 | 88 |
| 20180102 | 论萨达姆的战争准备 | 98 |
| 20180102 | 母猪的产后护理 | 100 |
+----------+-----------------------------+-------+
8 rows in set (0.01 sec)mysql>
可以看到输出的记录就是按照成绩由小到大进行排序的。如果省略了 ORDER BY 语句中的排序方向,则默认按照从小到大的顺序进行排序,也就是说ORDER BY 列名
和ORDER BY 列名 ASC
的语义是一样的,我们试一下:
mysql> SELECT * FROM student_score ORDER BY score;
+----------+-----------------------------+-------+
| number | subject | score |
+----------+-----------------------------+-------+
| 20180104 | 论萨达姆的战争准备 | 46 |
| 20180104 | 母猪的产后护理 | 55 |
| 20180103 | 母猪的产后护理 | 59 |
| 20180103 | 论萨达姆的战争准备 | 61 |
| 20180101 | 母猪的产后护理 | 78 |
| 20180101 | 论萨达姆的战争准备 | 88 |
| 20180102 | 论萨达姆的战争准备 | 98 |
| 20180102 | 母猪的产后护理 | 100 |
+----------+-----------------------------+-------+
8 rows in set (0.01 sec)
再看一下从大到小排序的样子:
mysql> SELECT * FROM student_score ORDER BY score DESC;
+----------+-----------------------------+-------+
| number | subject | score |
+----------+-----------------------------+-------+
| 20180102 | 母猪的产后护理 | 100 |
| 20180102 | 论萨达姆的战争准备 | 98 |
| 20180101 | 论萨达姆的战争准备 | 88 |
| 20180101 | 母猪的产后护理 | 78 |
| 20180103 | 论萨达姆的战争准备 | 61 |
| 20180103 | 母猪的产后护理 | 59 |
| 20180104 | 母猪的产后护理 | 55 |
| 20180104 | 论萨达姆的战争准备 | 46 |
+----------+-----------------------------+-------+
8 rows in set (0.00 sec)mysql>
按照多个列的值进行排序
我们也可以同时指定多个排序的列,多个排序列之间用逗号,
隔开就好了,就是这样:
ORDER BY 列1 ASC|DESC, 列2 ASC|DESC ...
比如我们想让对student_score
的查询结果先按照subjuect
排序,再按照score
值从大到小的顺序进行排列,可以这么写:
mysql> SELECT * FROM student_score ORDER BY subject, score DESC;
+----------+-----------------------------+-------+
| number | subject | score |
+----------+-----------------------------+-------+
| 20180102 | 母猪的产后护理 | 100 |
| 20180101 | 母猪的产后护理 | 78 |
| 20180103 | 母猪的产后护理 | 59 |
| 20180104 | 母猪的产后护理 | 55 |
| 20180102 | 论萨达姆的战争准备 | 98 |
| 20180101 | 论萨达姆的战争准备 | 88 |
| 20180103 | 论萨达姆的战争准备 | 61 |
| 20180104 | 论萨达姆的战争准备 | 46 |
+----------+-----------------------------+-------+
8 rows in set (0.00 sec)mysql>
再提醒一遍,如果不指定排序方向,则默认使用的是ASC
,也就是从小到大的升序规则。
小贴士: 对于数字的排序还是很好理解的,但是字符串怎么排序呢?大写的A和小写的a哪个大哪个小?这个问题涉及到字符串使用的编码方式以及字符串排序规则,我们之后会详细的介绍它们,现在你只需要知道排序的语法就好了。
我们还可以让ORDER BY
语句和LIMIT
语句结合使用,不过 ORDER BY 语句必须放在 LIMIT 语句前边,比如这样:
mysql> SELECT * FROM student_score ORDER BY score LIMIT 1;
+----------+-----------------------------+-------+
| number | subject | score |
+----------+-----------------------------+-------+
| 20180104 | 论萨达姆的战争准备 | 46 |
+----------+-----------------------------+-------+
1 row in set (0.00 sec)mysql>
这样就能找出成绩最低的那条记录了。
MySQL基础 - 简单查询相关推荐
- MySQL基础之查询数据
MySQL基础之查询数据 一.DQL操作表中记录环境搭建 细节:查询只是查看数据,不会修改表中数据 创建商品表(goods2)包含: 商品名称(name),商品价格(price),商品销量(sales ...
- MySQL 基础 ———— 子查询
引言 承接<MySQL 基础 ---- 连接查询>,本文介绍和展示SQL中子查询的使用. 子查询是出现在其他语句中的select 语句,也称为内查询.外部的查询语句,称为主查询或外查询. ...
- MySQL 基础 ———— 连接查询
引言 本篇文章承接<数据库与SQL语句>专栏,进入DQL的重要环节,可以说,这一部分的内容应该占据SQL语言的大部分使用场景. 本篇的连接查询知识,和后面的一些重要的查询知识总结,共同构成 ...
- MySQL 基础 ———— 分组查询
引言 承接上一篇<MySQL 基础 ----高频函数总结>,本篇单独针对分组查询进行简单的总结和归纳,并为后续更为复杂的DQL 语句做好铺垫. 查询语句: SELECT AVG(salar ...
- 2019-7-27 [MySQL] DQL 简单查询[别名/去重/运算] 条件查询 排序查询 聚合查询 分组查询 导出与导入 多表操作[一对多/多对多][创外键 创联合主键 约束 添加 删除 测试]
文章目录 5 SQL语句(DQL) 5.1DQL准备工作和语法 5.1.1准备工作 5.1.2 DQL语法: 5.2 简单查询 5.2.1 查询所有的商品 5.2.2 查询商品名和商品价格. 5.2. ...
- 4、MySQL数据库-简单查询
四.SQL-查询 1.简单查询 1.1查询单个字段 语法:select 查询列表 from 表名;#例子:查询单个字段-查询员工姓名 select ename from emp; 1.2查询多个字段 ...
- MySQL基础之查询语句
导入学习数据库 source /opt/yiibaidb.sql SQL是什么?MySQL是什么? SQL是结构化查询语言(Structured Query Language). SQL是一种专门用来 ...
- MYSQL的简单查询
1.创建学生成绩(xscj)数据库,在数据库中创建student.course.score.teachers四张数据表. create database xscj; use xscj; CREATE ...
- mysql数据库简单查询试题_面试题: mysql数据库 已看1 简单的sql练习
1.根据部门号从高到低,工资从低到高列出员工的信息 select * from employee order by dept_id desc,salary 2.union和union all的区别 用 ...
- mysql group by笔试题_[PBN笔试题]mysql 一个简单查询中的group by 和 order by 的使用
具体我忘记了,大概内容差不多如下. 两张表,内容如下: +--------+-------+------+ | z_code | mgr | pigs | +--------+-------+---- ...
最新文章
- 开源 java CMS - FreeCMS2.3会员注册
- node 常见的一些系统问题
- ES5-1 发展史、ECMA、编程语言、变量、JS值
- 爬虫软件python彻底卸载_Python爬虫实践:如何优雅地删除豆瓣小组的帖子
- python游戏循环设置_Pygame:游戏循环前的初始菜单
- Visibiltity:none与Display:none区别
- Android中动态初始化布局参数以及ConstraintLayout使用中遇到的坑
- 设计模式20_观察者
- Teraco公司投资9000万美元扩建其在南非数据中心
- python怎么爬取一个网页图片_python爬虫怎么实现爬取网站图片?
- tomcat配置重定向_在Tomcat上配置SSL以及从HTTP到HTTPS的设置自动重定向的步骤
- dsp 有fft程序吗_Python 中 FFT 快速傅里叶分析
- matlab仿真元件,matlab电力系统仿真元件[高等教育]
- 【离散数学】数理逻辑 第一章 命题逻辑(6) 析取范式和合取范式、主析取范式和主合取范式及两者联系
- html格式转换word清除格式,word文档如何清除格式(原来Word可以一键去除格式)...
- 多线程,内附所有源代码和概念
- Integer division by zero
- C/C++常用的文件函数注释格式
- Soul向港交所递交上市申请,持续发力社交元宇宙赛道
- Matlab之netCDF格式文件读取方法
热门文章
- AUTOMATE THE BORING STUFF WITH PYTHON读书笔记 - 第18章:SENDING EMAIL AND TEXT MESSAGES
- 【一文搞懂】FD_SET的使用
- cors数据类型_CORS账号和南方RTK连接怎样操作使用?步骤说明
- CCNP-OSPF中SPF(最短路径树)算法剖析,建树过程示例
- 国家图书馆认证中国长峰制定的《婴幼儿血管瘤临床路径》
- 从“无影”看云电脑的未来
- swift声明属性为某个类型同时遵循某协议
- 最简单的深度学习入门书《动手学深度学习》
- Module not found: Error: [CaseSensitivePathsPlugin]
- 如何更改计算机屏幕分辨率,换了显示器分辨率不对怎么办_换了电脑显示器不清晰怎么解决-win7之家...