MySQL基本的SELECT语句的操作练习-笔记-03章:基本的SELECT语句

写在前面的话( •̀ .̫ •́ )✧

即将学习数据库系统的课程,此文为预习与自学,自学配套课程链接为: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

    • 作用:提交当前事务,使所有对数据库的修改操作(如 INSERTUPDATEDELETE)成为永久性更改。

    • 语法:

      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 DUALDUAL 是一个特殊的虚拟表,在一些 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 空值参与运算

  1. 空值:null,可能代表目前处于未知状态
  2. null不等同于0,’ ',‘null’
  3. 空值参与运算:所有运算符或列值遇到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:如果 expressionNULL,则返回这个值。
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 题目及要求

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

    要求显示如下:
    在这里插入图片描述

  2. 查询员工年收入,即年工资+奖金

    要求显示如下:
    在这里插入图片描述
    在这里插入图片描述

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

    要求显示如下,查询结果应有19条数据。
    在这里插入图片描述

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

    要求显示如下:
    在这里插入图片描述

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

    要求显示如下:
    在这里插入图片描述

  6. 显示表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;
本篇Over!撒花!(●'◡'●)
  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值