五数据导入与基本的 SELECT 语句
Posted Amo Xiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五数据导入与基本的 SELECT 语句相关的知识,希望对你有一定的参考价值。
文章目录
数据查询是指从数据库中获取所需要的数据,是数据库操作中最常用也是最重要的操作。通过不同的查询方式可以获得不同的数据,用户可以根据自己对数据的需求使用不同的查询方式。在 mysql 中使用 SELECT 语句来查询数据。本章将对查询语句的基本语法、在单表上查询数据等内容进行详细讲解,帮助读者了解查询数据的语句。
一、数据导入指令
在进行 SELECT 语句学习之前,数据库中需要存在演示数据,在命令行客户端登录 mysql,使用 source 指令导入,如下所示:
SOURCE xxxx.sql(填写你自己的sql脚本路径)
mysql> SOURCE E:\\mysql_study.sql
mysql> USE mysql_study;
Database changed
mysql> SHOW TABLES;
+-----------------------+
| Tables_in_mysql_study |
+-----------------------+
| countries |
| departments |
| emp_details_view |
| employees |
| job_grades |
| job_history |
| jobs |
| locations |
| order |
| regions |
| test1 |
| test2 |
| test3 |
+-----------------------+
13 rows in set (0.00 sec)
二、基本查询语句
SELECT 语句是最常用的查询语句,它的使用方式有些复杂,但功能相当强大。SELECT 语句的基本语法如下:
SELECT
* | <字段列名>
[
FROM <表 1>, <表 2>…
[WHERE <表达式>
[GROUP BY <group by definition>
[HAVING <expression> [<operator> <expression>…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
]
其中,各条子句的含义如下:
*|<字段列名>
包含星号通配符的字段列表,表示所要查询字段的名称。<表 1>,<表 2>…
,表 1 和表 2 表示查询数据的来源,可以是单个或多个。WHERE <表达式>
是可选项,如果选择该项,将限定查询数据必须满足该查询条件。GROUP BY< 字段 >
,该子句告诉 MySQL 如何显示查询出来的数据,并按照指定的字段分组。[ORDER BY< 字段 >]
,该子句告诉 MySQL 按什么样的顺序显示查询出来的数据,可以进行的排序有升序(ASC) 和降序(DESC),默认情况下是升序。[LIMIT[<offset>,]<row count>]
,该子句告诉 MySQL 每次显示查询出来的数据条数。HAVING <expression>
:查询时满足的第二条件。
SELECT 的可选参数比较多,读者可能无法一下完全理解。不要紧,接下来将从最简单的参数开始,一步一步深入学习之后,读者会对各个参数的作用有清晰的认识,下面先介绍 SELECT 语句的简单应用。补充: 学号、姓名、年龄、性别、专业表示列。如下图所示:
其中使用的子句将在后面逐个介绍。下面先介绍 SELECT 语句的简单应用。
2.1 SELECT …
SELECT 类似于编程语言中的输出语句,如 Python 中 print,如下:
mysql> USE mysql_study;
Database changed
mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> SELECT 1+1;
+-----+
| 1+1 |
+-----+
| 2 |
+-----+
1 row in set (0.00 sec)
mysql> SELECT 1+1 FROM DUAL;#DUAL 相当于一个伪表
+-----+
| 1+1 |
+-----+
| 2 |
+-----+
1 row in set (0.00 sec)
mysql>
2.2 使用 SELECT 语句查询一个数据表
使用 SELECT 语句时,首先要确定要查询的列。*
代表所有的列。例如,查询 mysql_study 数据库 employees 表中的所有数据,SQL 语句如下:
mysql> SELECT * FROM employees;
查询结果如下图所示:
这是查询整个表中所有列的操作,还可以针对表中的某一列或多列进行查询。
一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配符
*
。使用通配符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率。通配符的优势是,当不知道所需要的列的名称时,可以通过它获取它们。在生产环境下,不推荐直接使用 SELECT * 进行查询。
2.3 查询表中的一列或多列
针对表中的多列进行查询,只要在 SELECT 后面指定要查询的列名即可,多列之间用 ,
分隔。例如,查询 employees 表中的 employee_id、first_name、last_name 列数据,SQL 语句如下:
SELECT employee_id, first_name, last_name FROM employees;
查询结果如下图所示:
三、单表查询
单表查询是指从一个表中查询需要的数据,所有查询操作都比较简单。
3.1 用 DISTINCT 关键字去除结果中的重复行
在 MySQL 中使用 SELECT 语句执行简单的数据查询时,返回的是所有匹配的记录。如果表中的某些字段没有唯一性约束,那么这些字段就可能存在重复值。为了实现查询不重复的数据,MySQL 提供了 DISTINCT 关键字。
DISTINCT 关键字的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据给用户。
使用 DISTINCT 关键字可以去除查询结果中的重复记录,语法格式如下:
SELECT DISTINCT 字段名1,字段名2,字段名3... FROM 表名;
使用 DISTINCT 关键字去除 employees 表中 department_id 字段中的重复记录。SQL 语句如下:
SELECT DISTINCT department_id FROM employees;
查询结果如下图所示:
使用 DISTINCT 关键字时需要注意以下几点:
DISTINCT 关键字只能在 SELECT 语句中使用
在对一个或多个字段去重时,DISTINCT 关键字必须在所有字段的最前面
如果 DISTINCT 关键字后有多个字段,则会对多个字段进行组合去重,也就是说,只有多个字段组合起来完全是一样的情况下才会被去重
因为 DISTINCT 只能返回它的目标字段,而无法返回其它字段,所以在实际情况中,我们经常使用 DISTINCT 关键字来返回不重复字段的条数。查询 employees 表中 department_id 字段去重之后记录的条数,SQL 语句和运行结果如下:
mysql> SELECT COUNT(DISTINCT department_id) FROM employees;
+-------------------------------+
| COUNT(DISTINCT department_id) |
+-------------------------------+
| 11 |
+-------------------------------+
1 row in set (0.00 sec)
结果显示,employees 表中对 department_id 字段去重之后有 11 条记录。COUNT() 函数在后续会进行详细讲解,这里不过多进行赘述。
3.2 使用 AS 设置别名
为了查询方便,MySQL 提供了 AS 关键字来为表和字段指定别名。本小节主要讲解如何为表和字段指定一个别名。为表指定别名: 当表名很长或者执行一些特殊查询的时候,为了方便操作,可以为表指定一个别名,用这个别名代替表原来的名称。为表指定别名的基本语法格式为:
<表名> [AS] <别名>
<表名>:数据库中存储的数据表的名称
<别名>:查询时指定的表的新名称
AS关键字可以省略,省略后需要将表名和别名用空格隔开(最好不省略)
下面为 employees 表指定别名 emp,SQL 语句如下:
SELECT last_name FROM employees AS emp;
SELECT last_name FROM employees emp;
为字段指定别名: 在使用 SELECT 语句查询数据时,MySQL 会显示每个 SELECT 后面指定输出的字段。有时为了显示结果更加直观,我们可以为字段指定一个别名。为字段指定别名的基本语法格式为:
<字段名> [AS] <别名>
<字段名>: 为数据表中字段定义的名称。
<字段别名>: 字段新的名称。别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。
AS关键字可以省略,省略后需要将字段名和别名用空格隔开
查询 employees 表,为 first_name 指定别名 fname,为 last_name 指定别名 lname,SQL 语句如下:
SELECT first_name AS "fname", last_name AS "lname" FROM employees AS emp;
查询结果如下图所示:
注意: 表别名只在执行查询时使用,并不在返回结果中显示。而字段定义别名之后,会返回给客户端显示,显示的字段为字段的别名。
3.3 着重号
我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,请在 SQL 语句中使用一对 ``(着重号) 引起来。错误示范如下:
正确示范如下:
在 DOS 窗口中看着不太清晰,在 Navicat 中演示,如下图所示:
SELECT 查询还可以对常数进行查询。对的,就是在 SELECT 查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据表中动态取出的。你可能会问为什么我们还要对常数进行查询呢?
SQL 中的 SELECT 语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。
举例:我们想对 employees 数据表中的员工姓名进行查询,同时增加一列字段 corporation,这个字段固定值为 CSDN
,可以这样写:
3.4 运算符
同其他语言一样,MySQL 数据库也有自己的运算符和流程控制语句。本小节将对 MySQL 的运算符进行详细介绍。
3.4.1 算术运算符
算术运算符是 MySQL 中最常用的一类运算符。MySQL 支持的算术运算符包括加、减、乘、除、求余。下表所示为算术运算符的符号和作用:
【示例1】加法与减法运算符。
mysql> USE mysql_study;
Database changed
mysql> SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5 FROM DUAL;
+-----+---------+---------+----------+--------------+------------+------------+
| 100 | 100 + 0 | 100 - 0 | 100 + 50 | 100 + 50 -30 | 100 + 35.5 | 100 - 35.5 |
+-----+---------+---------+----------+--------------+------------+------------+
| 100 | 100 | 100 | 150 | 120 | 135.5 | 64.5 |
+-----+---------+---------+----------+--------------+------------+------------+
1 row in set (0.00 sec)
由运算结果可以得出如下结论:
- 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数; 一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;
- 加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的;
- 在 Java 中,+的左右两边如果有字符串,那么表示字符串的拼接。但是在 MySQL 中+只表示数值相加。如果遇到非数值类型,先尝试转成数值,如果转失败,就按0计算。(补充:MySQL 中字符串拼接要使用字符串函数 CONCAT() 实现)
mysql> SELECT 100 + 'a'; +-----------+ | 100 + 'a' | +-----------+ | 100 | +-----------+ 1 row in set, 1 warning (0.00 sec) mysql> SELECT 100 + '10'; +------------+ | 100 + '10' | +------------+ | 110 | +------------+ 1 row in set (0.00 sec)
- 与空值 NULL 参与运算,结果都为 NULL
mysql> SELECT 10 - NULL, 100 + NULL; +-----------+------------+ | 10 - NULL | 100 + NULL | +-----------+------------+ | NULL | NULL | +-----------+------------+ 1 row in set (0.00 sec)
【示例2】乘法与除法运算符。
mysql> SELECT 100*1, 100*0.1, 100/1.0, 100/2, 100+2*5/2, 100/3, 100/0, 10 DIV 0;
+-------+---------+----------+---------+-----------+---------+-------+----------+
| 100*1 | 100*0.1 | 100/1.0 | 100/2 | 100+2*5/2 | 100/3 | 100/0 | 10 DIV 0 |
+-------+---------+----------+---------+-----------+---------+-------+----------+
| 100 | 10.0 | 100.0000 | 50.0000 | 105.0000 | 33.3333 | NULL | NULL |
+-------+---------+----------+---------+-----------+---------+-------+----------+
1 row in set (0.00 sec)
由运算结果可以得出如下结论:
- 一个数乘以整数1和除以整数1后仍得原数;
- 一个数乘以浮点数1和除以浮点数1后变成浮点数,数值与原数相等; 一个数除以整数后,不管是否能除尽,结果都为一个浮点数;
- 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后4位;
- 乘法和除法的优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同。
- 在数学运算中,0不能用作除数,在 MySQL 中,一个数除以0为 NULL。
【示例3】计算出员工的年基本工资。
#LIMIT 5只输出5条 后续会详细讲解
mysql> SELECT employee_id, salary, salary*12 AS "员工的年基本工资" FROM employees LIMIT 5;
+-------------+----------+------------------+
| employee_id | salary | 员工的年基本工资 |
+-------------+----------+------------------+
| 100 | 24000.00 | 288000.00 |
| 101 | 17000.00 | 204000.00 |
| 102 | 17000.00 | 204000.00 |
| 103 | 9000.00 | 108000.00 |
| 104 | 6000.00 | 72000.00 |
+-------------+----------+------------------+
5 rows in set (0.00 sec)
【示例4】求模(求余)运算符。
mysql> SELECT 12 % 3, 12 MOD 5 FROM dual;
+--------+----------+
| 12 % 3 | 12 MOD 5 |
+--------+----------+
| 0 | 2 |
+--------+----------+
1 row in set (0.00 sec)
可以看到,12对3求模后的结果为0,对5求模后的结果为2。
3.4.2 比较运算符
比较运算符是查询数据时最常用的一类运算符。SELECT 语句中的条件语句经常使用比较运算符。通过比较运算符,可以判断表中的哪些记录是符合条件的。比较运算符的符号、名称和应用示例如下表所示:
1、等号运算符。 等号运算符(=)判断等号两边的值、字符串或表达式是否相等,如果相等则返回1,不相等则返回0。在使用等号运算符时,遵循如下规则:
- 如果等号两边的值、字符串或表达式都为字符串,则 MySQL 会按照字符串进行比较,其比较的是每个字符串中字符的 ANSI 编码是否相等。
- 如果等号两边的值都是整数,则 MySQL 会按照整数来比较两个值的大小。
- 如果等号两边的值一个是整数,另一个是字符串,则 MySQL 会将字符串转化为数字进行比较。 如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
【示例5】等号运算符。
mysql> SELECT 1=1,1='1',1=0,'a'='a',(5+3)=(2+6),''=NULL,NULL=NULL;
+-----+-------+-----+---------+-------------+---------+-----------+
| 1=1 | 1='1' | 1=0 | 'a'='a' | (5+3)=(2+6) | ''=NULL | NULL=NULL |
+-----+-------+-----+---------+-------------+---------+-----------+
| 1 | 1 | 0 | 1 | 1 | NULL | NULL |
+-----+-------+-----+---------+-------------+---------+-----------+
1 row in set (0.00 sec)
mysql> SELECT 1=2,0='abc',1='abc' FROM dual;
+-----+---------+---------+
| 1=2 | 0='abc' | 1='abc' |
+-----+---------+---------+
| 0 | 1 | 0 |
+-----+---------+---------+
1 row in set, 2 warnings (0.00 sec)
在 MySQL 中,如果需要有条件的从数据表中查询数据,可以使用 WHERE 关键字来指定查询条件。使用 WHERE 关键字的语法格式如下:
WHERE 查询条件 查询条件可以是
#1.带比较运算符和逻辑运算符的查询条件
#2.带 BETWEEN AND 关键字的查询条件
#3.带 IS NULL 关键字的查询条件
#4.带 IN 关键字的查询条件
#5.带 LIKE 关键字的查询条件等 下面结合刚刚学习过的等号运算符来给大家进行演示
【示例6】查询 salary=10000,注意在Java、Python等编程语言中比较是==。
mysql> SELECT employee_id,salary FROM employees WHERE salary=10000;
+-------------+----------+
| employee_id | salary |
+-------------+----------+
| 150 | 10000.00 |
| 156 | 10000.00 |
| 169 | 10000.00 |
| 204 | 10000.00 |
+-------------+----------+
4 rows in set (0.00 sec)
【示例7】安全等于运算符。
mysql> SELECT 1<=>'1',1<=>0,'a'<=>'a',(5+3)<=>(2+6),''<=>NULL,NULL<=>NULL FROM dual;
+---------+-------+-----------+---------------+-----------+-------------+
| 1<=>'1' | 1<=>0 | 'a'<=>'a' | (5+3)<=>(2+6) | ''<=>NULL | NULL<=>NULL |
+---------+-------+-----------+---------------+-----------+-------------+
| 1 | 0 | 1 | 1 | 0 | 1 |
+---------+-------+-----------+---------------+-----------+-------------+
1 row in set (0.00 sec)
使用安全等于运算符时,两边的操作数的值都为 NULL 时,返回的结果为1而不是 NULL,其他返回结果与等于运算符相同。
切记空值(NULL) 不能使用
=
来判断,可以使用 安全等于运算符
【示例8】查询 employees 表中 commission_pct 值为 NULL 的数据。
mysql> SELECT employee_id,commission_pct FROM employees WHERE commission_pct = NULL LIMIT 5;
Empty set (0.00 sec)
mysql> SELECT employee_id,commission_pct FROM employees WHERE commission_pct <=> NULL LIMIT 5;
+-------------+----------------+
| employee_id | commission_pct |
+-------------+----------------+
| 100 | NULL |
| 101 | NULL |
| 102 | NULL |
| 103 | NULL |
| 104 | NULL |
+-------------+----------------+
5 rows in set (0.00 sec)
【示例9】使用运算符 >
来判断数据表 employees 中的 commission_pct 字段值是否大于0.3,是则返回1;否则,返回0,空值返回 NULL。运算结果如下所示:
mysql> SELECT employee_id,salary,commission_pct>0.3 FROM employees WHERE employee_id>=144 LIMIT 5;
+-------------+----------+--------------------+
| employee_id | salary | commission_pct>0.3 |
+-------------+----------+--------------------+
| 144 | 2500.00 | NULL |
| 145 | 14000.00 | 1 |
| 146 | 13500.00 | 0 |
| 147 | 12000.00 | 0 |
| 148 | 11000.00 | 0 |
+-------------+----------+--------------------+
5 rows in set (0.00 sec)
2、运算符 IS NULL。 IS NULL 用来判断操作数是否为空值(NULL)。操作数为 NULL 时,结果返回1;否则,返回0。IS NOT NULL 刚好与 IS NULL 相反。【示例10】测试运算符 IS NULL。
十一子查询详解