[MySQL] 基本的SELECT语句

发布于:2023-02-15 ⋅ 阅读:(1305) ⋅ 点赞:(0)

请添加图片描述


资料

根据【MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!】 整理
资料链接:
百度网盘:
链接:https://pan.baidu.com/s/1KboU_3EZJxrezMWZ2klP6g
提取码:1234
阿里云盘
【MySQL】

1. 查询常量计算

语法:

SELECT 常量运算表达式1, 常量运算表达式2, ...
[ FROM dual ];
SELECT 1+1, 3*2;

查询常量不需要从表中进行查找,可以使用 dual (伪表)补全查询语句的结构。

SELECT 1+1, 3*2
FROM dual;

在这里插入图片描述

2. 查询语句的基本语法

查询语句的基本语法:

SELECT 字段1, 字段2, ... 
FROM 表名;

2.1 查询全部字段

语法:

SELECT * 
FROM 表名;
  • * 表示表中的所有字段。

查询employees 表中的所有字段:

SELECT * 
FROM employees;

在这里插入图片描述

一般情况下,除非需要使用表中所有的字段数据,否则最好不要使用通配符 *

使用通配符虽然可以节省 输入查询语句 的时间,但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率。

通配符的优势是,当不知道所需要的列的名称时,可以通过通配符获取它们。

在生产环境下,不推荐直接使用 SELECT * 进行查询。

2.2 查询指定字段

语法:

SELECT 字段1, 字段2, ... 
FROM 表名;

查询表中指定字段,需要保证字段在表中要存在,同时要保证字段名拼写要完全正确。

查询employees 表中 employee_id、last_name、salary字段:

SELECT employee_id, last_name, salary 
FROM employees;

在这里插入图片描述

3. 列的别名

查询时,需要对查询的字段进行重命名(取别名),可以使用关键字 AS (alias – 别名)。

查询employees 表中 employee_id、last_name、salary字段:

SELECT employee_id AS id, 
       last_name AS lname, 
       salary AS sal 
FROM employees;

AS 关键字可以省略

SELECT employee_id id, 
	   last_name lname, 
	   salary sal 
FROM employees;

字段的别名可以使用一对 双引号 引起来,不要使用单引号(由于MySQL语法不严谨,在 MySQL 中不会报错,但在有些数据库中会报错)。

补充:字符串使用单引号引起来,不要使用双引号,会报错。

SELECT employee_id AS "id", 
	   last_name AS "lname", 
	   salary AS "sal" 
FROM employees;

三个语句的查询结果相同:

在这里插入图片描述

字段的别名使用双引号引起来,以便在别名中包含空格或特殊的字符并区分大小写,别名中有空格一定要用双引号包裹。

SELECT employee_id emp_id,
	   last_name AS lname,
	   department_id "部门id",
	   salary * 12 AS "annual sal" 
FROM employees;

在这里插入图片描述

4. 去除重复行

默认情况下,查询会返回全部行,包括重复行。

查询员工表中一共有哪些部门id:
没有去重的情况:

SELECT department_id 
FROM employees;

在这里插入图片描述

去重的情况(使用关键字 DISTINCT ):

SELECT DISTINCT department_id 
FROM employees;

在这里插入图片描述

SELECT salary,DISTINCT department_id
FROM employees;

salary 没有进行去重会全部显示, DISTINCT department_id 会去重,两个发生了冲突,会报错。

[42000][1064] You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL 
server version for the right syntax to use 
near 'DISTINCT department_id FROM employees' 
at line 1

对 department_id, salary 两者的查询结果进行重复去重:

SELECT DISTINCT department_id, salary 
FROM employees;

只有当 department_id, salary 两个字段的值都一样的记录才会进行去重。

在这里插入图片描述

DISTINCT 其实是对后面所有列名的组合进行去重。
最后的结果是 74 条,因为这 74 个结果中部门 id 与 salary 组合后没有重复。如果想要看都有哪些不同的部门(department_id),只需要写 DISTINCT department_id 即可,后面不需要再加其他的列名。

5. 空值参与运算

空值:null

在 MySQL 中, 空值不等于空字符串。一个空字符串是长度为 0 的字符串,而一个空值是表示没有具体值。

null 不等同于 0 (数值为0,不为空),''(长度为0的字符串,不为空),'null'(字符串,不为空)。

SELECT * 
FROM employees;

在这里插入图片描述

空值参与运算,结果一定也为空。

SELECT employee_id, salary AS "月工资", 
	   salary*(1+commission_pct)*12 AS "年工资", 
	   commission_pct 
FROM employees;

由于有些记录的 commission_pct 中值为空,所以该记录对应的计算出来的“年工资”也为空。

在这里插入图片描述

实际问题的解决方案:引入 IFNULL()

SELECT
    employee_id,
    salary AS "月工资",
    # 如果 commission_pct 为空,使用 0 进行代替
    salary*(1+IFNULL(commission_pct, 0))*12 AS "年工资",
    commission_pct
FROM employees;

在这里插入图片描述

6. 着重号

着重号:` (键盘左上角,1旁边)

当表名或字段名与关键字一样时,需要使用着重号将表名或字段名引起来。

在这里插入图片描述

SELECT * 
FROM ORDER;

报错

[42000][1064] You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server 
version for the right syntax to use near 'ORDER' at line 1
SELECT * 
FROM `order`;

在这里插入图片描述

我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,在 SQL 语句中使用一对 `(着重号)引起来。

7. 查询常数

常数会与查询结果的每行进行拼接。

SELECT
    'hello',
    123,
    employee_id,
    last_name
FROM employees;

在这里插入图片描述

8. 显示表结构

语法:

DESCRIBE 表名;

简写:

DESC 表名;

显示employees表的结构:

DESCRIBE employees;
DESC employees;

在这里插入图片描述

查询结果,显示了表中字段的详细信息。

  • 其中,各个字段的含义分别解释如下:
    • (1) Field:表示字段名称。
    • (2) Type:表示字段类型
    • (3) Null:表示该列是否可以存储 NULL 值。
    • (4) Key:表示该列是否已编制索引。PRI 表示该列是表主键的一部分;UNI 表示该列是 UNIQUE 索引的一部分;MUL 表示在列中某个给定值允许出现多次。
    • (5) Default:表示该列是否有默认值,如果有,那么值是多少。
    • (6) Extra:表示可以获取的与给定列有关的附加信息,例如 AUTO_INCREMENT 等。

9. 过滤数据

使用 WHERE 字句,将不满足条件的行过滤掉,WHERE 子句紧随 FROM 子句,过滤条件声明在 FROM 结构的后面。

语法:

SELECT 字段1, 字段2, ...
FROM 表名
WHERE 过滤条件;

查询90号部门的员工信息:

SELECT *
FROM employees
WHERE department_id=90;

在这里插入图片描述

查询 last_name 为 ‘King’ 的员工信息:

SELECT *
FROM employees
WHERE last_name='King';

在这里插入图片描述

SELECT *
FROM employees
WHERE last_name='king';

该语句的查询结果与上面相同
原因:在 windows 环境下,对大小写不敏感导致 MySQL 中对大小写也不敏感,但是由于 MySQL 的不严谨导致字符串中的大小写也不进行区分,所以上面的两句结果相同。
在其他数据中不会出现这种情况。

在这里插入图片描述

在 windows 环境下不区分大小,指的是字段名,表名,关键字,不包括引号内的字符串。

10. 基本的SELECT语句练习

【题目】

# 1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY

# 2.查询employees表中去除重复的job_id以后的数据 

# 3.查询工资大于12000的员工姓名和工资 

# 4.查询员工号为176的员工的姓名和部门号 

# 5.显示表 departments 的结构,并查询其中的全部数据

【答案】

1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY

# 理解 1 :计算12月的基本工资
SELECT
    employee_id,
    last_name,
    salary*12 AS "ANNUAL SALARY"
FROM employees;

在这里插入图片描述

# 理解 2 :计算12月的基本工资和奖金
SELECT
    employee_id,
    last_name,
    salary*12*(1+IFNULL(commission_pct,0)) AS "ANNUAL SALARY"
FROM employees;

在这里插入图片描述

2.查询employees表中去除重复的job_id以后的数据

SELECT DISTINCT job_id
FROM employees;

在这里插入图片描述

3.查询工资大于12000的员工姓名和工资

SELECT
    last_name,
    salary
FROM employees
WHERE salary>12000;

在这里插入图片描述

4.查询员工号为176的员工的姓名和部门号

SELECT
    last_name,
    department_id
FROM employees
WHERE employee_id=176;

在这里插入图片描述

5.显示表 departments 的结构,并查询其中的全部数据

DESC departments;
DESCRIBE departments;

在这里插入图片描述

SELECT *
FROM departments;

在这里插入图片描述