五、mysql查询语句(一)

本文转载至微信公众号:我们都是小青蛙

一、准备工作

我们先创建两个表:
学生基本信息表的结构
number :学号,
name :姓名,
sex :性别,
id_number :身份证号,
department :学院,
major :专业,
enrollment_time :入学时间

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));

学生成绩表的结构
number :学号,
subject :学科,
score :分数

CREATE TABLE student_score (    number INT,    subject VARCHAR(30),    score TINYINT,    PRIMARY KEY (number, subject),    CONSTRAINT FOREIGN KEY(number) REFERENCES student_info(number));

我们给这两个表插入一些数据,
学生基本信息表:

学号姓名性别身份证号学院专业入学时间
20180101杜子腾15817719901044792计算机学院计算机科学与工程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

学生成绩表:

学号科目成绩
20180101母猪的产后护理78
20180101论萨达姆的战争准备88
20180102母猪的产后护理100
20180102论萨达姆的战争准备88
20180103母猪的产后护理59
20180103论萨达姆的战争准备61
20180104母猪的产后护理55
20180104论萨达姆的战争准备46

好了,表的填充工作也已经做完了~ 终于可以开始查询数据了!

二、查询语句

2.1 查询单个列

查看某个表中的某一列的数据的通用格式是这样:
SELECT 列名 FROM 表名;
比如查看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列,因为查询的结果也是由一条一条记录组成的,像记录的集合一样,所以有时候我们会把得到的查询结果称为结果集
小贴士:你可能发现查询出的数据并不是有序的,这个我们稍后就会说到,稍安勿躁列的别名
我们也可以为结果集中的列重新定义一个别名,命令格式如下:
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了。

2.2 查询多个列

如果想查询多个列的数据,可以在SELECT后边写多个列名,用逗号,分隔开就好:SELECT 列名1, 列名2, ... 列名n FROM 表名;
我们把多个查询对象组成的列表称为查询列表,需要注意的是,查询列表中的列名可以按任意顺序摆放,结果集将按照我们给出的列名顺序显示。比如我们查询student_info中的多个列:
在这里插入图片描述
本例中的查询列表就是number,name,id_number,major,所以结果集中列的顺序就按找这个顺序来显示。当然,我们也可以用别名来输出这些数据:
在这里插入图片描述

如果你乐意,同一个查询对象可以在查询列表处重复出现(虽然这通常没什么卵用),比如这样:
在这里插入图片描述

2.3 查询所有列

如果需要把记录中的所有列都查出来,MySQL也提供一个省事儿的办法,我们之前也介绍过,就是直接用星号*来表示要查询的东西,就像这样:
SELECT * FROM 表名;
不过需要注意的是,除非你确实需要表中的每个列,否则一般最好别使用星号*来查询所有列,虽然星号*看起来很方便,不用明确列出所需的列,但是查询不需要的列通常会降低性能。

2.4 去除相同的查询结果

2.4.1 去除单列的重复结果

有的时候我们查询某个列的数据时会有一些重复的结果,比如我们查询一下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)

看到结果只剩下不重复的信息了。

2.4.2去除多列的重复结果

对于查询多列的情况,两条记录重复的意思是:两条记录的每一个列中的值都相同。比如查询学院和专业信息:
在这里插入图片描述
查询结果中第1、2行记录中的department和major列都相同,所以这两行记录就是重复的,同理,第3、4行也是重复的。如果我们想对多列查询的结果去重的话,可以直接把DISTINCT放在被查询的列的最前边
SELECT DISTINCT 列名1, 列名2, ... 列名n FROM 表名;
比如这样:
在这里插入图片描述

DISTINCT注意事项
DISTINCT不能做到一部分查询列去重,另一部分不去重。因为查询结果是以行为单位展示的,如果你只对department去重,那department那一列只剩下4行数据,对major列不去重,那major列剩下了8行数据,那结果应该怎么展示呢?所以我们规定DISTINCT只能用来对全部列的值都相同的记录来进行去重。

2.5 限制查询结果条数

有时候查询结果的条数会很多,都显示出来可能会撑爆屏幕~ 所以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 6, 2;
Empty set (0.00 sec)
mysql>

如果查询的结果条数小于限制条数,那就可以全部显式出来:
在这里插入图片描述
从第4条开始的记录有两条,限制条数为3,所以结果都可以显示出来。
使用默认的开始行
LIMIT后边也可以只有一个参数,那这个参数就代表着限制行数。也就是说我们可以不指定开始行,默认的开始行就是第0行,比如我们可以这么:
在这里插入图片描述
查询结果就展示了从第0条开始的3条记录。

2.6 对查询结果排序

我们之前查询number列的时候得到的记录并不是有序的,这是为什么呢?MySQL其实默认会按照这些数据底层存储的顺序来给我们返回数据,但是这些数据可能会经过更新或者删除,如果我们不明确指定按照什么顺序来排序返回结果的话,那我们可以认为该结果中记录的顺序是不确定的。换句话说如果我们想让返回结果中的记录按照某种特定的规则排序,那我们必须显式的指定排序规则。

2.6.1按照单个列的值进行排序

我们可以用下边的语法来指定返回结果的记录按照某一列的值进行排序:
ORDER BY 列名 ASC|DESC
ASC和DESC指的是排序方向。ASC是指按照指定列的值进行由小到大进行排序,也叫做升序,DESC是指按照指定列的值进行由大到小进行排序,也叫做降序,中间的|表示这两种方式只能选一个。这回我们用student_score表测试一下:
在这里插入图片描述
可以看到输出的记录就是按照成绩由小到大进行排序的。如果省略了 ORDER BY 语句中的排序方向,则默认按照从小到大的顺序进行排序也就是说ORDER BY 列名和ORDER BY 列名 ASC的语义是一样的,我们试一下:
在这里插入图片描述
再看一下从大到小排序的样子:
在这里插入图片描述

2.6.2按照多个列的值进行排序

我们也可以同时指定多个排序的列,多个排序列之间用逗号,隔开就好了,就是这样:ORDER BY 列1 ASC|DESC, 列2 ASC|DESC ...
比如我们想让对student_score的查询结果先按照subjuect排序,再按照score值从大到小的顺序进行排列,可以这么写:
在这里插入图片描述
当按照多列排序时,先按照第一列排序,排好序后,如果第一列的值相同的记录有多条,则针对这些记录再按照第二列排序,依此类推。
再提醒一遍,如果不指定排序方向,则默认使用的是ASC,也就是从小到大的升序规则。
小贴士:对于数字的排序还是很好理解的,但是字符串怎么排序呢?大写的A和小写的a哪个大哪个小?这个问题涉及到字符串使用的编码方式以及字符串排序规则,我们之后会详细的介绍它们,现在你只需要知道排序的语法就好了。
我们还可以让ORDER BY语句和LIMIT语句结合使用,不过 ORDER BY 语句必须放在 LIMIT 语句前边,比如这样:
在这里插入图片描述
这样就能找出成绩最低的那条记录了。

三、总结

  • 我们可以在SELECT后边指定要查询的列的列表,然后在FROM后边指定要查询的表,可以只查询单个列的值,也可以查询多个列的值,也可以使用*简单的代表查询所有列的值。
  • 如果我们想去除重复结果的话,可以使用DISTINCT放在被查询的列前边。需要注意的是,两条记录重复的意思是,所以使用DISTINCT在多个列上会把两条记录的每一个列中的值都相同的重复行去掉,而不能做到不能做到一部分列去重,另一部分不去重。
  • 使用LIMIT语句限制查询结果的行数,LIMIT子句可以携带两个参数,其中开始行指的是我们想从第几行数据开始查询,限制条数是查询结果最多返回的记录条数。参数开始行可以被省略,默认从第0行开始。
  • 如果我们想让返回结果中的记录按照某种特定的规则排序,那我们必须显式的使用ORDER BY指定排序规则。其中,ASC指按照指定列的值的升序排序,DESC指按照指定列的值的降序排序。如果ORDER BY子句后有多个列的话,会先按照前边的列进行排序,如果前边的列的值相同,在相同的这些行中再按照后边的列进行排序。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL是一种常用的关系型数据库管理系统,它支持使用SQL语言进行数据的查询、插入、更新和删除等操作。以下是一些常见的MySQL查询语句: 1. SELECT语:用于从数据库中检索数据。 示例:SELECT * FROM 表名; 2. WHERE子:用于在SELECT语中添加条件筛选。 示例:SELECT * FROM 表名 WHERE 条件; 3. ORDER BY子:用于对查询结果进行排序。 示例:SELECT * FROM 表名 ORDER BY 列名 ASC/DESC; 4. LIMIT子:用于限制查询结果的数量。 示例:SELECT * FROM 表名 LIMIT 数量; 5. JOIN语:用于在多个表之间建立关联。 示例:SELECT * FROM 表1 JOIN 表2 ON 表1.列 = 表2.列; 6. GROUP BY子:用于对查询结果进行分组。 示例:SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名; 7. HAVING子:用于在GROUP BY子后添加条件筛选。 示例:SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名 HAVING 条件; 8. INSERT INTO语:用于向数据库中插入新的数据。 示例:INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2); 9. UPDATE语:用于更新数据库中的数据。 示例:UPDATE 表名 SET 列名 = 值 WHERE 条件; 10. DELETE FROM语:用于从数据库中删除数据。 示例:DELETE FROM 表名 WHERE 条件; 这些只是MySQL查询语句的一部分,还有很多其他的语和功能可以用于满足不同的需求。如果你有具体的问题或者需要更详细的介绍,请告诉我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值