写在前面的话( •̀ .̫ •́ )✧
即将学习数据库系统的课程,此文为预习与自学,自学配套课程链接为:MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板_哔哩哔哩_bilibili
本文主要内容是练习基本的SELECT语句,练习前需要先导入练习需要的数据库,使用的MySQL数据库服务器管理和开发工具是Navicat。重点内容为第四部分 最基本的SELECT语句,第五部分是针对第四部分的练习题。
所使用的数据库,文件比较小,无需转存直接下载就🆗:点击下载数据库文件
文章目录
03章:基本的SELECT语句
SQL(结构化查询语言)是一种用于管理和操作关系型数据库的标准语言。
不同的数据库生产厂商都支持SQL语句,但都有特有内容。
1. SQL语言的分类
1.1 DDL:数据定义语言
- 作用范围:DDL 主要用于定义和管理数据库的结构。它涉及数据库和表的创建、修改和删除等操作。
- 主要操作:
CREATE
:创建新的数据库、表、视图、索引等。ALTER
:修改已有数据库对象的结构,比如添加或删除表中的列。DROP
:删除数据库、表、视图、索引等对象。
- 影响范围:DDL 语句对数据库结构的改变是永久性的,对所有用户可见。一旦执行,所有相关的数据表或视图的结构会发生变化。
1.2 DML:数据操作语言
- 作用范围:DML 主要用于对数据库中的数据进行操作。它不涉及数据库结构的改变,而是对存储在表中的数据进行增、删、改、查等操作。
- 主要操作:
INSERT
:向表中插入新记录。UPDATE
:更新表中的现有记录。DELETE
:删除表中的记录。SELECT
:查询表中的数据。
- 影响范围:DML 语句对数据的改变是具体到记录级别的,改变的数据是可以被恢复的(如果数据库有相应的备份或事务控制机制)。
1.3 DCL:数据控制语言
作用范围:DCL 主要用于管理数据库的访问权限和事务控制。它控制谁可以对数据库对象执行特定操作,同时也管理事务的提交和回滚,以确保数据的一致性和完整性。
主要操作:
-
GRANT
:-
作用:授予用户或角色对数据库对象的特定权限。例如,可以授予用户对某个表的查询、插入或更新权限。
-
语法:
GRANT SELECT, INSERT ON my_table TO user_name;
-
影响范围:用户
user_name
被授予对my_table
表的 SELECT 和 INSERT 权限。权限的授予是即时生效的。
-
-
REVOKE
:-
作用:撤销已经授予的权限。例如,可以撤销用户对某个表的访问权限。
-
语法:
REVOKE SELECT, INSERT ON my_table FROM user_name;
-
影响范围:从用户
user_name
那里撤销了对my_table
表的 SELECT 和 INSERT 权限。权限的撤销是即时生效的。
-
-
COMMIT
:-
作用:提交当前事务,使所有对数据库的修改操作(如
INSERT
、UPDATE
、DELETE
)成为永久性更改。 -
语法:
COMMIT;
-
影响范围:所有在事务期间进行的修改将被永久保存,其他用户也可以看到这些更改。事务的操作在逻辑上被认为是完成的。
-
-
ROLLBACK
:-
作用:回滚当前事务,将数据库恢复到事务开始之前的状态。用于撤销所有未提交的更改。
-
语法:
ROLLBACK;
-
影响范围:撤销事务中所有对数据库的修改,恢复数据库到事务开始时的状态,确保数据的一致性。
-
-
SAVEPOINT
:-
作用:在事务中设置一个保存点,允许在事务执行过程中部分回滚到该保存点。
-
语法:
SAVEPOINT savepoint_name;
-
影响范围:允许事务在设置的保存点处进行部分回滚,提供了对事务的更精细控制。
-
2. SQL语言的规则与规范
2.1 基本规则
-
SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
-
每条命令以
;
或 \g 或 \G 结束(可以试一下:单行执行指令可以不加分号,但多行不加就会报错噜~) -
关键字不能被缩写也不能分行
-
关于标点符号
- 必须保证所有的()、单引号、双引号是成对结束的
- 必须使用英文状态下的半角输入方式
- 字符串型和日期时间类型的数据可以使用单引号(’ ')表示
- 列的别名,尽量使用双引号(" "),而且不建议省略as
2.2 SQL大小写规范
- MySQL 在 Windows 环境下大小写不敏感(因为Windows系统本身不区分大小写)
- MySQL 在 Linux 环境下大小写敏感
- 数据库名、表名、表的别名、变量名是严格区分大小写的
- 关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
- 推荐采用统一的书写规范:
- 数据库名、表名、表别名、字段名、字段别名等都小写
- SQL 关键字、函数名、绑定变量等都大写
2.3 注 释
可以使用如下格式的注释结构
单行注释:#注释文字(MySQL特有的方式)
单行注释:-- 注释文字(--后面必须包含一个空格。)
多行注释:/* 注释文字 */
3. 导入现有的数据表、表的数据
3.1 命令行导入
- 步骤1:source 文件的全路径名称(此方式需要在命令行执行)
sourse ****
为了避免下面出现的ERROR大家可以在路径中使用正斜杠 /
替代反斜杠 \
下面是含ERROR版本(不影响导入):
下面是正常版本:
- 步骤2:检查是否导入成功
show databases;
- 步骤3:查看数据库中的表
use atguigudb;
show tables;
- 步骤4:简单查询表中的内容
select * from employees;
查询结果共107条
。
3.2 图形化界面工具导入
- 步骤1:右击点击运行SQL文件
找到并选中要导入的数据库,然后点击开始。
- 步骤2:成功运行后点击关闭
在左侧栏的空白处右击刷新或者按下F5
刷新键后,显示新导入的数据库
4. 最基本的SELECT语句
运行已选择的语句-------选中查询语句,按下
ctrl+R
SELECT语句精简总结
## 4. 最基本的SELECT语句
### 4.0
SELECT 1;
SELECT 1 + 1,3 * 2;
SELECT 1 + 1,3 * 2 FROM DUAL;
### 4.1
SELECT * FROM employees;
SELECT employee_id,last_name,salary
FROM employees;
### 4.2 列的别名
SELECT employee_id "emp_id",last_name AS lname,department_id 部门id
FROM employees;
### 4.3 去除重复行
#查询部门id
SELECT department_id
FROM employees;
### 4.4 空值参与运算
#空值:null
#null不等同于0,' ','null'
SELECT * FROM employees;
#空值参与运算
SELECT employee_id,salary "月工资",salary * (1 + commission_pct) * 12 "年工资"
FROM employees;
#空值修正
SELECT employee_id,salary "月工资",salary * (1 + IFNULL(commission_pct,0) ) * 12 "年工资"
FROM employees;
### 4.5着重号
SELECT * FROM `order`;
#错误的 SELECT * FROM order;
### 4.6查询常数
SELECT '标记' as corporation, last_name FROM employees;
### 4.7 显示表结构
DESCRIBE employees;
DESC employees;
### 4.8 过滤数据
#查询90号部分的员工信息
SELECT *
FROM employees
WHERE department_id = 90;
SELECT *
FROM employees
WHERE last_name = 'king';
SELECT语句详细讲解
4.0 SELECT…
无子句
SELECT 1;
SELECT 1 + 1,3 * 2;
SELECT 3 + 5;
查询结果如下:运行后输出结果分别显示在三个栏中
其实这里相当于下面的语句
SELECT 1 + 1,3 * 2 FROM DUAL;
FROM DUAL
:DUAL
是一个特殊的虚拟表,在一些 SQL 数据库系统(如 Oracle)中用于从中选择数据。MySQL 中是可以省略 FROM DUAL
的!
4.1 SELECT … FROM
- 语法:
SELECT 标识选择哪些列
FROM 标识从哪个表中选择
- *:表中的所有的字段(选择全部列)
SELECT * FROM employees;
查询结果如下:
- 只想要查询表中的某几列,中间用
,
隔开,注意是英文的逗号。
SELECT employee_id,last_name,salary
FROM employees;
查询结果如下:
4.2 列的别名
- 重命名一个列
- 便于计算
- 紧跟列名,也可以在列名和别名之间加入关键字AS,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。
- AS 可以省略
- 建议别名简短,见名知意
举第1个栗子:最简单的写法,原名-空格-别名
SELECT employee_id emp_id,last_name,department_id
FROM employees;
查询结果如下:
举第2个栗子:三种写法(加AS、加双引号、加空格),支持中文别名
SELECT employee_id "emp_id",last_name AS lname,department_id 部门id
FROM employees;
查询结果如下:
4.3 去除重复行
DISTINCT
用于去除查询结果中的重复数据,确保每个记录是唯一的。当你只关心某个列中的唯一值时,使用DISTINCT
可以帮助你找出所有不同的值。
- 默认情况下,查询会返回全部行,包括重复行。
SELECT department_id
FROM employees;
查询结果如下:
- 使用
DISTINCT
关键字用于去除查询结果中的重复记录,每个部门id仅显示一次,共12条数据
SELECT DISTINCT department_id
FROM employees;
查询结果如下:
- 错误的使用:
DISTINCT
关键字应该在SELECT
子句中直接应用于整个结果集或指定的列,而不能单独出现在某一列前面。
SELECT salary,DISTINCT department_id
- 大多数时候作用于整个结果是无意义的,这里仅仅去除了薪资重复且同时部门重复的数据。
SELECT DISTINCT salary,department_id
FROM employees;
查询结果如下:可以看到有些薪资不同,但是部门相同的数据也保留了下来
4.4 空值参与运算
- 空值:null,可能代表目前处于未知状态
- null不等同于0,’ ',‘null’
- 空值参与运算:所有运算符或列值遇到null值,运算的结果都为null
SELECT employee_id,salary "月工资",salary * (1 + commission_pct) * 12 "年工资"
FROM employees;
查询结果如下:commission_pct为null的人员年工资运算结果都为null
解决方式:IFNULL
是 SQL 中的一个函数,用于处理空值(NULL
)。它的作用是将 NULL
值替换为指定的其他值。在不同的数据库系统中,这个函数可能会有所不同,但一般的用法是类似的。
语法:
IFNULL(expression, value_if_null)
- expression:要检查是否为
NULL
的值或表达式。 - value_if_null:如果 expression 为
NULL
,则返回这个值。
SELECT employee_id,salary "月工资",salary * (1 + IFNULL(commission_pct,0) ) * 12 "年工资"
FROM employees;
查询结果如下:
4.5 着重号
我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,请在SQL语句中使用一对``(着重号)引起来。
ORDER
是一个关键字,查询这个字段应该加``,否则会报错哦!
SELECT * FROM `order`;
查询结果如下:
4.6 查询常数
SELECT 查询还可以对常数进行查询。对的,就是在 SELECT 查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据表中动态取出的。
为什么我们还要对常数进行查询呢?
SQL 中的 SELECT 语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。
比如说,我们想对 employees 数据表中的员工姓名进行查询,同时增加一列字段corporation
,这个字段固定值为“人物标记”,可以这样写:
SELECT '标记' as corporation, last_name FROM employees;
查询结果如下:
4.7 显示表结构
DESCRIBE employees;
或者
DESC employees;
查询结果如下:
其中,各个字段的含义分别解释如下:
- Field:表示字段名称。
- Type:表示字段类型,这里 barcode、goodsname 是文本型的,price 是整数类型的。
- Null:表示该列是否可以存储NULL值。
- Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
- Default:表示该列是否有默认值,如果有,那么值是多少。
- Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。
4.8 过滤数据
语法:
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件
- 使用WHERE 子句,将不满足条件的行过滤掉
- WHERE子句紧随 FROM子句之后
举第1个栗子:
仅查询部门为90号的员工信息
SELECT *
FROM employees
WHERE department_id = 90;
查询结果如下:
举第2个栗子:
仅查询last_name为"King"的员工信息
SELECT *
FROM employees
WHERE last_name = 'King';
查询结果如下:
5. SElECT语句练习
5.1 题目及要求
-
查询员工12个月的工资总和,并起名为ANNUAL SALARY
要求显示如下:
-
查询员工年收入,即年工资+奖金
要求显示如下:
-
查询employees表中去除重复的job_id以后的数据
要求显示如下,查询结果应有19条数据。
-
查询工资大于12000的员工姓名和工资
要求显示如下:
-
查询员工号为176的员工的姓名和部门号
要求显示如下:
-
显示表departments的结构,并查询其中的全部数据(共27条)
要求显示如下:
5.2 答案
#1.查询员工12个月的工资总和,并起名为ANNUAL SALARY
SELECT employee_id,last_name,salary * 12 "ANNUAL SALARY"
FROM employees;
#2.查询员工年收入,即年工资+奖金
SELECT employee_id,last_name,salary * (1 + IFNULL(commission_pct,0)) * 12 "年收入"
FROM employees;
#3.查询employees表中去除重复的job_id以后的数据
SELECT DISTINCT job_id
FROM employees;
#4.查询工资大于12000的员工姓名和工资
SELECT last_name,salary
FROM employees
WHERE salary > 12000;
#5.查询员工号为176的员工的姓名和部门号
SELECT last_name,department_id
FROM employees
WHERE employee_id = 176;
#6.显示表departments的结构,并查询其中的全部数据
DESC departments;
SELECT * FROM departments;