25.1 MySQL SELECT语句

news2024/7/6 20:14:20

image-20231018162800076

1. SQL概述

1.1 SQL背景知识

1946, 世界上诞生了第一台电脑, 而今借由这台电脑的发展, 互联网已经成为一个独立的世界.
在过去几十年里, 许多技术和产业在互联网的舞台上兴衰交替.
然而, 有一门技术却从未消失, 甚至日益强大, 那就是SQL.

SQL(Structured Query Language,结构化查询语言)是一种使用关系模型的数据库应用语言m 它的设计初衷是用来与数据直接交互.
上世纪70年代, IBM的研究员发布了一篇关于数据库技术的论文<<SEQUEL: 一门结构化的英语查询语言>>, 这可以说是SQL的奠基之作.
而到了现如今, 虽然有一些细微的变化, 但SQL作为一门结构化的查询语言并没有发生太大的变化.

无论是前端工程师还是后端算法工程师, 都需要与数据打交道, 并且需要了解如何高效地提取他们所需的数据.
尤其是对于数据分析师而言, 他们的工作就是与数据打交道, 整理不同的报告以引导业务决策.

SQL有多个版本和标准, 最重要的是SQL92和SQL99.
它们分别代表了1992年和1999年发布的SQL标准.
我们今天使用的SQL语言仍然遵循这些标准.

需要提醒的是, 不同的数据库厂商支持SQL语句, 但每个厂商可能会有一些特殊的内容或扩展.
因此, 在使用SQL时需要根据具体的数据库系统来选择合适的语法和功能.
TIOBE编程语言排行榜是一个根据搜索引擎查询结果和编程语言讨论的数据来评估编程语言受欢迎程度的指标.

SQL之所以一直保持高排名, 是因为它作为一种用于管理关系型数据库的标准语言, 被广泛应用于各个行业和领域.
无论是大型企业还是小型公司, 几乎都需要使用关系型数据库进行数据存储和查询.
而SQL作为关系型数据库的标准查询语言, 成为了处理和管理数据的核心工具.

排行榜地址: https://www.tiobe.com/tiobe-index/

image-20231017110723771

1.2 SQL分类

SQL是一种用于管理和操作关系型数据库的标准化查询语言.
根据应用领域和功能特点, 可以将SQL分为以下几个主要的分类:
* 1. 数据定义语言(DDL): DDL语句用于定义和管理数据库的结构, 包括创建, 修改和删除数据库, , 索引, 视图等.
     常见的DDL语句包括CREATE, ALTER和DROP等.

* 2. 数据操作语言(DML): DML语句用于对数据库中的数据进行操作, 包括查询, 插入, 更新和删除数据.
     常见的DML语句包括SELECT, INSERT, UPDATE和DELETE等.

* 3. 数据查询语言(DQL): DQL语句用于从数据库中提取数据, 常用于查询和检索数据的需求.
     DQL的核心命令是SELECT语句, 可以通过选择特定的列, 过滤条件和排序来获取需要的数据.

* 4. 数据控制语言(DCL): DCL语句用于控制数据库用户的访问权限和数据完整性, 包括授权和回收权限, 事务处理和数据约束等.
     常见的DCL语句包括GRANT, REVOKE和COMMIT等.

* 5. 事务控制语言(TCL): TCL语句用于管理和控制事务, 可用于维护数据的一致性和完整性.
     常见的TCL语句包括BEGIN TRANSACTION, COMMIT和ROLLBACK等.

* 6. 数据库管理语言(DML): DML语句用于管理数据库的元数据, 包括数据库, 表和索引的创建, 修改和删除.
     常见的DML语句包括CREATE DATABASE, CREATE TABLE和CREATE INDEX等.

除了以上分类, 还有其他一些衍生的SQL语言和扩展, 如存储过程语言(如PL/SQL和T-SQL), 面向对象数据库语言(如SQL/OLB),
它们通过扩展SQL的功能, 提供了更强大和灵活的数据库操作能力.

1.3 SQL语言规则和约定

当涉及到使用SQL语言时, 遵守一些规则和规范是至关重要的.
遵守以下的规则和规范将有助于提高SQL代码的可读性, 可维护性和一致性.
以下是SQL语言的一些常用规则和约定:
* 1. 编写风格:
     - 为了增加可读性, 可以将SQL语句写在一行或多行, 并使用适当的缩进.
     - 每条命令应以分号(;), \g或\G结束, 标志着命令的结束.
# 多行书写, 分号结束.
SELECT column1, column2
FROM table_name
WHERE condition;
* 2. 标点符号:
     - 必须使用成对的括号, 单引号和双引号, 并正确结束.
     - 在输入SQL时,请使用英文状态下的半角输入方式。
     - 用单引号表示字符串型和日期时间类型的数据. (双引号可以使用, 但是不推荐.)
     - 可以使用双引号("")给列取别名, 并尽使用as关键字取别名. (单引号可以使用, 但是不推荐.)
SELECT id AS 编号, name AS 姓名 FROM t_stu;  # 字段别名使用AS关键字来指定
SELECT id 编号, name 姓名 FROM t_stu;  # 如果字段别名中不包含空格或特殊字符, 那么AS关键字可以省略
SELECT id AS "编 号", name AS "姓 名" FROM t_stu;  # 如果字段别名中有空格, 那么不能省略""
* 3. 大小写规范(建议遵守):
     - 在Windows环境下, MySQL对大小写不敏感(因为Windows系统对大小写不敏感); 
       在Linux环境下, MySQL对大小写敏感.
     - 数据库名, 表名, 表的别名和变量名是区分大小写的.
     - SQL关键字, 函数名, 列名和列的别名不区分大小写.
     - 建议采用统一的书写规范, 例如数据库名, 表名, 表别名, 字段名和字段别名都使用小写, 而SQL关键字和函数名则使用大写.
# 不区分大小写, 都可以执行成功.
show databases;
SHOW DATABASES;


# 关键字大写, 表名, 字段小写.
SELECT column1, column2
FROM table_name
WHERE condition;
* 4. 注释:
     - 可以使用适当的注释结构来注释代码, 增加代码的可读性和可理解性.
     - 行级注释: # 注释单行 (MySQL特有的方式)
     - 行级注释:-- 注释单行 (-- 后面必须包含一个空格)
     - 块级注释:/* 注释多行 */
# 注释

-- 注释

/*
注释1
注释2
...
*/
* 5. 命名规则:
     - 数据库名和表名不得超过30个字符, 变量名限制为29个字符.
     - 对象名只能包含A–Z, a–z, 09和下划线, 共计63个字符.
     - 对象名中不应包含空格.
     - 在同一个MySQL软件中, 数据库名和表名应保持唯一性.
     - 如果字段名与保留字, 数据库系统或常用方法冲突, 应使用``(着重号)引起来.
# 创建表格
# create table student info(...); # 表名错误, 因为表名有空格
CREATE CREATE student_info(...);

# order与关键字重复, 还想使用需要``包裹.
CREATE TABLE `order`();
* 6. 保持字段名和类型的一致性:
     - 在为字段命名并指定其数据类型时, 应确保一致性.
     - 如果一个表中的某一字段是整数类型, 同名字段在其他表中也应保持整数类型.
# 保持字段类型的一致.
CREATE CREATE student(id int, name varchat, ...)
CREATE CREATE teacher(id int, name varchat, ...)

2. 导入数据

首先学习数据的查询, 这里准备了一张表, 将数据导入到数据自己MySQL数据库中.

2.1 命令导入

导入数据命令: source sql文件路径
-- MySQL 8.1 使用命令导入的方式, 语句不需要;结尾
mysql> source C:\Users\13600\Desktop\atguigudb.sql
Query OK, 0 rows affected, 1 warning (0.00 sec)
...

image-20231017195156923

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| atguigudb          |  -- 增加这个库
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
+--------------------+
6 rows in set (0.02 sec)

2.2 Navicat导入

* 1. 先使用Navicat 连接MySQL 5.7 的服务器.

image-20231017201723054

* 2. 选中数据右击选择运行SQL文件.

image-20231017202011524

* 3.选择sql文件的路径. 点击开始进行导入.

image-20231017202200081

* 4. 导入成功后点开关闭.

image-20231017202323883

* 5. 刷新后展示数据库.

image-20231017202644717

3. 查看结构

查看表结构: desc 表名称;
-- 使用数据库
mysql> use atguigudb
Database changed

-- 查看员工表数据
mysql> desc employees;                    
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| employee_id    | int         | NO   | PRI | 0       |       |
| first_name     | varchar(20) | YES  |     | NULL    |       |
| last_name      | varchar(25) | NO   |     | NULL    |       |
| email          | varchar(25) | NO   | UNI | NULL    |       |
| phone_number   | varchar(20) | YES  |     | NULL    |       |
| hire_date      | date        | NO   |     | NULL    |       |
| job_id         | varchar(10) | NO   | MUL | NULL    |       |
| salary         | double(8,2) | YES  |     | NULL    |       |
| commission_pct | double(2,2) | YES  |     | NULL    |       |
| manager_id     | int         | YES  | MUL | NULL    |       |
| department_id  | int         | YES  | MUL | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
11 rows in set (0.01 sec)
其中, 各个字段的含义分别解释如下:
* 1. Field: 表示字段名称.
* 2. Type: 表示字段类型, 这里barcode, goodsname是文本型的, price是整数类型的.
* 3. Null: 表示该列是否可以存储NULL值.
* 4. Key: 表示该列是否已编制索引.
     PRI表示该列是表主键的一部分;
     UNI表示该列是UNIQUE索引的一部分;
     MUL表示在列中某个给定值允许出现多次.
* 6. Default: 表示该列是否有默认值.
* 6. Extra: 表示可以获取的与给定列有关的附加信息, 例如AUTO_INCREMENT(自动递增主键).

4. SELECT语句

-- 在SQL中, SELECT 1; 是一个简单的查询语句, 它的含义是从数据源中选择并返回一个值为1的列.
mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

-- 执行 SELECT 9/2; 这个查询语句后, 将返回结果为4.5的列.
mysql> SELECT 9/2;
+--------+
| 9/2    |
+--------+
| 4.5000 |
+--------+
1 row in set (0.00 sec)

5. SELECT … FROM语句

SELECT ... FROM语句有两种语法: 
* 1. 选择全部字段查询语法: SELECT * FROM 表名;
* 2. 选择字段查询语法:  SELECT 字段1, ... FROM 表名;
一般情况下, 除非需要使用表中所有的字段数据, 最好不要使用通配符"*".
使用通配符虽然可以节省输入查询语句的时间, 但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率.
通配符的优势是, 当不知道所需要的列的名称时, 可以通过它获取它们.
在生产环境下, 不推荐你直接使用 SELECT * 进行查询.
-- 查看整张部门表的数据
mysql> SELECT * FROM departments;
+---------------+----------------------+------------+-------------+
| department_id | department_name      | manager_id | location_id |
+---------------+----------------------+------------+-------------+
|            10 | Administration       |        200 |        1700 |
|            20 | Marketing            |        201 |        1800 |
|            30 | Purchasing           |        114 |        1700 |
|            40 | Human Resources      |        203 |        2400 |
|            50 | Shipping             |        121 |        1500 |
|           ... | ...                  |         ...|         ... |  -- 省略
|           260 | Recruiting           |       NULL |        1700 |
|           270 | Payroll              |       NULL |        1700 |
+---------------+----------------------+------------+-------------+
27 rows in set (0.00 sec)
-- 查看一部分部门表的数据
mysql> SELECT department_id, department_name FROM departments;
+---------------+----------------------+
| department_id | department_name      |
+---------------+----------------------+
|            10 | Administration       | 
|            20 | Marketing            | 
|            30 | Purchasing           | 
|            40 | Human Resources      | 
|            50 | Shipping             | 
|           ... | ...                  |  -- 省略
|           260 | Recruiting           |
|           270 | Payroll              |
+---------------+----------------------+
27 rows in set (0.00 sec)
Navicat的查询方式:
* 1. 点击菜单栏的查询 --> 点击新建查询.

image-20231017202904229

* 2. 选择服务器名称与数据库.

image-20231017203253459

查询方式1: 输入命令后点击运行, 会执行编辑器上所有的命令.
          在下面的信息栏中可以点开结果的信息查看.

image-20231017213913110

查询方式2: 选中想要运行命令, 这是执行选项会变成运行与选择的命令.

image-20231017214026574

美化SQL功能.

image-20231017220246431

6. 字段的别名

给字段起别名的好处主要包括以下几点:
* 1. 增加可读性: 别名可以使得数据更易于理解和解释.
     在某些情况下, 原始字段名可能过于复杂或含糊不清, 使用别名可以解决这个问题.
* 2. 简化操作: 通过给长字段名或复杂字段名设置别名, 可以简化查询和数据处理的操作.
* 3. 保护隐私: 在涉及到敏感数据的情况下, 别名可以用于隐藏原始字段名, 从而保护个人隐私.
* 4. 提高可维护性: 如果字段名需要更改, 只需更改别名而无需更改所有相关的查询和代码, 这可以降低维护成本.
总的来说, 别名可以使数据和查询更易于理解, 使用和维护.
-- 为字段其别名, 最好见名知意
mysql> SELECT department_id AS dept_id, department_name AS dept_name FROM departments;
+---------+----------------------+
| dept_id | dept_name            |
+---------+----------------------+
|      10 | Administration       |
|      20 | Marketing            |
|      30 | Purchasing           |
|      40 | Human Resources      |
|      50 | Shipping             |
|      60 | IT                   |
|     ... | ...                  | -- 省略
|     270 | Payroll              |
+---------+----------------------+
27 rows in set (0.00 sec)
-- 查看员工表的信息(名, 年收入)
mysql> SELECT first_name  "name", salary * 12 AS "Annual Salary" FROM employees;
+-------------+---------------+
| name        | Annual Salary |
+-------------+---------------+
| Steven      |     288000.00 |
| Neena       |     204000.00 |
| Lex         |     204000.00 |
| Alexander   |     108000.00 |
| Bruce       |      72000.00 |
| ...         |           ... | -- 省略
| Michael     |     156000.00 |
| Pat         |      72000.00 |
| Susan       |      78000.00 |
| Hermann     |     120000.00 |
| Shelley     |     144000.00 |
| William     |      99600.00 |
+-------------+---------------+
107 rows in set (0.00 sec)

7. 去除重复行

默认情况下, 查询会返回全部行, 这些行中就可能包含一些重复的信息.
-- 查看员工的部门id
mysql> SELECT department_id FROM employees;
+---------------+
| department_id |
+---------------+
|          NULL |
|            10 |
|            20 |
|            20 |
|            30 |
|            30 |
|            30 |
|           --- | -- 省略
|           110 |
|           110 |
+---------------+
107 rows in set (0.00 sec)
在SELECT语句中使用关键字DISTINCT去除重复行. 
-- 对员工的部门id去重.
mysql>  SELECT DISTINCT department_id FROM employees;
+---------------+
| department_id |
+---------------+
|          NULL |
|            10 |
|            20 |
|            30 |
|            40 |
|            50 |
|            60 |
|            70 |
|            80 |
|            90 |
|           100 |
|           110 |
+---------------+
12 rows in set (0.00 sec)
-- 对员工的部门id和薪资组合去重, 单这两个条件都一样时才会去重.
mysql> SELECT DISTINCT department_id, salary FROM employees;
+---------------+----------+
| department_id | salary   |
+---------------+----------+
|            90 | 24000.00 |
|            90 | 17000.00 |
|            60 |  9000.00 |
|            60 |  6000.00 |
|            60 |  4800.00 |
|            60 |  4200.00 |
|            .. |    ..... | -- 省略
|            40 |  6500.00 |
|            70 | 10000.00 |
|           110 | 12000.00 |
|           110 |  8300.00 |
+---------------+----------+
74 rows in set (0.00 sec)
注意事项:
* 1. DISTINCT 需要放到所有列名的前面, 如果写成 SELECT salary, DISTINCT department_id FROM employees 会报错.
* 2. DISTINCT 其实是对后面所有列名的组合进行去重, 最后的结果是74, 因为这74个部门id不同, 都有salary这个属性值.
     如果你想要看都有哪些不同的部门(department_id), 只需要写 DISTINCT department_id即可, 后面不需要再加其他的列名了.

8. 着重号

设计表名和字段时, 避免使用数据库的保留字或常用方法名称是非常重要的.
如果使用这些名称, 可能会导致SQL查询出现错误或混淆.

当名称冲突时, 可以使用反引号(`)将表名或字段名括起来; 反引号在键盘上通常与波浪号(~)共享一个键.
-- 查看所有表格, 其中有一张表是order, mysql中order是一个关键字, 主要用于对查询结果进行排序.
mysql> show tables;
+---------------------+
| Tables_in_atguigudb |
+---------------------+
| countries           |
| ...                 | -- 省略
| order               |
| regions             |
+---------------------+
10 rows in set (0.01 sec)
-- 错误的示例
mysql> SELECT * FROM order;
ERROR 1064 (42000): 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

错误 1064 (42000): 您的 SQL 语法有误;
请检查与您的 MySQL 服务器版本相对应的手册, 以了解在第 1'order' 附近应使用的正确语法.
-- 使用注重号
mysql> SELECT * FROM `order`;
+----------+------------+
| order_id | order_name |
+----------+------------+
|        1 | shkstart   |
|        2 | tomcat     |
|        3 | dubbo      |
+----------+------------+
3 rows in set (0.00 sec)

9. 查询常数

在SQL中, 可以使用SELECT语句对常数进行查询, 并在查询结果中添加一列固定的常数列.
这样做的原因可能是为了整合不同的数据源, 并使用常数列作为表的标记.

如果你想对employees数据表中的员工的姓进行查询, 
同时增加一列字段corporation(团队), 这个字段的固定值为'MySQL', 可以使用以下查询语句:
-- 增加额外字段并设置固定的值.
mysql> SELECT  'MySQL' AS corporation, last_name FROM employees;
+-------------+-------------+
| corporation | last_name   |
+-------------+-------------+
| MySQL       | King        |
| MySQL       | Kochhar     |
| MySQL       | De Haan     |
| MySQL       | Hunold      |
| MySQL       | Ernst       |
| ...         | ...         |  -- 省略
| MySQL       | Higgins     |
| MySQL       | Gietz       |
+-------------+-------------+
107 rows in set (0.00 sec)

10. 过滤数据

可以使用WHERE子句, 将不满足条件的行过滤掉.
注意事项: WHERE子句紧随FROM子句

语法: SELECT 字段1,字段2, ... FROM 表名 WHERE 过滤条件;
-- 例如, 过滤出部门编号为90的部分信息员工信息.
mysql> SELECT
    ->     employee_id,         -- 部门ID
    ->     first_name,          -- 名字
    ->     job_id,              -- 职位id
    ->     department_id        -- 部分id
    -> FROM
    ->     employees
    -> WHERE 
    ->     department_id = 90;  -- 匹配部门id = 90的行
+-------------+------------+---------+---------------+
| employee_id | first_name | job_id  | department_id |
+-------------+------------+---------+---------------+
|         100 | Steven     | AD_PRES |            90 |
|         101 | Neena      | AD_VP   |            90 |
|         102 | Lex        | AD_VP   |            90 |
+-------------+------------+---------+---------------+
3 rows in set (0.00 sec)

11. 空值与空字符串

MySQL中, 空值(NULL)和空字符串("")是两种不同的概念, 具有不同的特性和用法.

* 1. 空值: 表示数据项不存在或未知.
     在MySQL中, NULL是一种特殊的标记, 表示字段或数据项没有值或值未知.
     当一个字段被设置为NULL时, 表示该字段没有存储任何有效的数据.
     在存储NULL值的字段上, 不会分配任何实际的存储空间. 相反, MySQL会在记录中存储一个指示该字段为NULL的标记.
     在查询中, 需要使用 IS NULL  IS NOT NULL 运算符来判断某列是否为空值, 例如: SELECT * FROM table WHERE column IS NULL.

* 2. 空字符串: 则表示一个字符串中没有任何字符, 即长度为0的字符串.
     它是一个实际存在的值, 但与NULL不同, 空字符串是一个有效的数据项.
     在查询中, 空字符串可以与其他字符串进行比较, 例如: SELECT * FROM table WHERE column = "".
     空字符串对于可变长度字符串类型会占用1个字节的存储空间, 而对于固定长度字符串类型则会占用字段定义的存储空间.

以下是空值和空字符串的一些区别:
存储空间: NULL不需要占用实际的存储空间, 而空字符串("")需要占用一定的存储空间, 因为它是一个实际存在的值.
数据比较: 在MySQL中, NULL不能和任何其他值进行直接比较, 包括自身. 而空字符串("")可以进行比较操作.
数据处理: 在进行数据插入或更新操作时, 如果没有为字段指定值, MySQL将默认将其设置为NULL, 而不是空字符串("").
空值与任何其他值进行运算的结果通常都是NULL.
这是因为空值表示缺失或未知的值, 因此无法与其他值进行准确的运算.
mysql> SELECT
    ->     employee_id,                                       -- 员工id
    ->     salary,                                            -- 月薪
    ->     commission_pct,                                    -- 佣金
    ->     12 * salary * (1 + commission_pct) 
    -> AS 
    ->     "annual_sal"                                       -- 年薪
    -> FROM 
    ->    employees;
+-------------+----------+----------------+------------+
| employee_id | salary   | commission_pct | annual_sal |
+-------------+----------+----------------+------------+
|         100 | 24000.00 |           NULL |       NULL | -- NULL参数运算的结果还是NULL
|         ... |    ...   |            ... |        ... | -- 省略
|         145 | 14000.00 |           0.40 |  235200.00 |
+-------------+----------+----------------+------------+
107 rows in set (0.00 sec)
如果commission_pct的值可能为NULL, 那么在计算年薪时可能会出现问题, 因为NULL值会导致计算结果也是NULL.
为了处理这种情况, 可以使用COALESCE函数或IFNULL函数来将NULL值替换为0或其他默认值. 
: COALESCE(commission_pct, 0), 如果commission_pct的值为NULL, 则返回0; 否则返回commission_pct本身的值.
这样可以确保在计算年薪时不会因为NULL值而出现错误.

以下是使用COALESCE函数修改后的查询语句:
mysql> SELECT
    ->     employee_id,                                                     -- 员工id
    ->     salary,                                                          -- 月薪
    ->     commission_pct,                                                  -- 佣金
    ->     12 * salary * (1 + COALESCE(commission_pct, 0))
    -> AS
    ->     "annual_sal"                                                     -- 年薪
    -> FROM 
    ->    employees;
+-------------+----------+----------------+------------+
| employee_id | salary   | commission_pct | annual_sal |
+-------------+----------+----------------+------------+
|         100 | 24000.00 |           NULL |  288000.00 |
|         ... |    ...   |            ... |        ... | -- 省略
|         145 | 14000.00 |           0.40 |  235200.00 |
+-------------+----------+----------------+------------+

12. 练习

* 1.查询员工12个月的工资总和, 并起别名为ANNUAL SALARY.
mysql> SELECT
    -> 12 * salary * (1 + COALESCE(commission_pct, 0))
    -> AS
    ->     "ANNUAL SALARY"
    -> FROM
    ->     employees;
+---------------+
| ANNUAL SALARY |
+---------------+
|     288000.00 |
|     204000.00 |
|     204000.00 |
|     108000.00 |
|           ... |
+---------------+
107 rows in set (0.02 sec)
* 2. 查询employees表中去除重复的job_id以后的数据.
mysql> SELECT DISTINCT
    ->     job_id
    -> FROM
    ->     employees;
+------------+
| job_id     |
+------------+
| AC_ACCOUNT |
| AC_MGR     |
| AD_ASST    |
| ...        |
| SA_REP     |
| SH_CLERK   |
| ST_CLERK   |
| ST_MAN     |
+------------+
19 rows in set (0.01 sec)
* 3.查询工资大于12000的员工姓名和工资.
mysql> SELECT
    ->     first_name,
    ->     last_name,
    ->     salary
    -> FROM
    ->     employees
    -> WHERE
    ->     salary > 12000;
+------------+-----------+----------+
| first_name | last_name | salary   |
+------------+-----------+----------+
| Steven     | King      | 24000.00 |
| Neena      | Kochhar   | 17000.00 |
| Lex        | De Haan   | 17000.00 |
| John       | Russell   | 14000.00 |
| Karen      | Partners  | 13500.00 |
| Michael    | Hartstein | 13000.00 |
+------------+-----------+----------+
6 rows in set (0.00 sec)
* 4.查询员工号为176的员工的姓名和部门号.
mysql> SELECT
    -> first_name,
    ->     last_name,
    ->     department_id
    -> FROM
    ->    employees
    -> WHERE
    ->    employee_id = 176;
+------------+-----------+---------------+
| first_name | last_name | department_id |
+------------+-----------+---------------+
| Jonathon   | Taylor    |            80 |
+------------+-----------+---------------+
1 row in set (0.01 sec)
* 5.显示表departments的结构, 并查询其中的全部数据.
mysql> DESC departments;
+-----------------+-------------+------+-----+---------+-------+
| Field           | Type        | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| department_id   | int         | NO   | PRI | 0       |       |
| department_name | varchar(30) | NO   |     | NULL    |       |
| manager_id      | int         | YES  | MUL | NULL    |       |
| location_id     | int         | YES  | MUL | NULL    |       |
+-----------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> SELECT
    ->     *
    -> FROM
    ->    departments;
+---------------+----------------------+------------+-------------+
| department_id | department_name      | manager_id | location_id |
+---------------+----------------------+------------+-------------+
|            10 | Administration       |        200 |        1700 |
|            20 | Marketing            |        201 |        1800 |
|           ... | ...                  |        ... |         ... |
|           270 | Payroll              |       NULL |        1700 |
+---------------+----------------------+------------+-------------+
27 rows in set (0.01 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件工程】简单讲讲设计模式七大原则,以及代码简单举例

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 学软件或计算机专业的同学应该都会接触到一门课程《软件工程》&#xff0c;七大设计原则属于软件工程中的重要知识点。 目录 一、软件工程1.1、提供指导和规范1.2、确保软件质量1.3、提高…

【经验分享】解决vscode编码问题

目录 先看一下我遇到的问题和你们的一不一样 下面是我查到的解决办法&#xff1a; 简单点说就是 我们看看解决后的效果 先看一下我遇到的问题和你们的一不一样 我一开始以为就是编码问题。 下面是我查到的解决办法&#xff1a; 这个错误提示看起来仍然是中文乱码。可能是由于…

Flink学习之旅:(二)构建Flink demo工程并提交到集群执行

1.创建Maven工程 在idea中创建一个 名为 MyFlinkFirst 工程 2.配置pom.xml <properties><flink.version>1.13.0</flink.version><java.version>1.8</java.version><scala.binary.version>2.12</scala.binary.version><slf4j.ver…

Java构建Web项目

对无底线服务型的系统&#xff0c;业务代码和界面代码脚本化是及其重要的。一是脚本化能确保部署本地就是再用的代码&#xff0c;不存在为每个项目管理代码的问题。然后脚本化不需要人为编译和投放程序库。极大的简化维护难度和成本。能不能脚本化直接决定了能否全面铺开运维&a…

流量新玩法:微信问一问了解一下

来自一位不断探索的营销人的问题&#xff1a;微信“问一问”引流&#xff0c;一个问答引流1000精准粉&#xff0c;是不是真的&#xff1f;如果是真的&#xff0c;那该怎么做呢&#xff1f; 微信的问一问功能&#xff0c;支持图文回答&#xff0c;也支持用视频去回答&#xff0c…

Java使用javah命令:‘javah‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

前提是已安装jdk&#xff0c;配置JDK环境变量&#xff0c;并成功输出下图&#xff1a; 但在命令行窗口使用javah&#xff0c;找不到该命令&#xff1a; 原因&#xff1a;新版的Java不使用javah的命令了&#xff0c;而是使用javac -h 用法&#xff1a; javac -h <directory&…

低代码系列——可视化编辑器

前端社区里&#xff0c;低代码/无代码是被讨论的火热赛道。它通过用最少量的编程代码去开发应用程序&#xff0c;从而提高效率。由此&#xff0c;许多企业都在使用低代码平台进行业务的开发和升级。低代码平台可以大幅简化编码过程&#xff0c;并且可以快速构建定制化的应用程序…

C++ - 类型转换 - static_cast - reinterpret_cast - const_cast - dynamic_cast

目录 类型转换 C语言当中的类型转换 为什么C需要四种类型转换 &#xff08;讲解volatile关键字&#xff09; C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast&#xff08;动态转换&#xff09; RTTI 类型转换 C语言当中的类型转换 其实在 C语言当…

从理论到实践,实时湖仓功能架构设计与落地实战

在上篇文章中&#xff0c;我们向大家解释了为什么实时湖仓是当前企业数字化转型过程中的解决之道&#xff0c;介绍了实时计算和数据湖结合的应用场景。&#xff08;“数据驱动”时代&#xff0c;企业为什么需要实时湖仓&#xff1f;&#xff09; 在这篇文章中&#xff0c;我们…

使用Gitlab构建简单流水线CI/CD

什么是Gitlab Gitlab实质上是一套DevOps工具 目前看起来&#xff0c;Gitlab属于是内嵌了一套CI/CD的框架&#xff0c;并且可以提供软件开发中的版本管理、项目管理等等其他功能。 这里需要辨别一下Gitlab和Github Gitee的区别。 GIthub大家都很熟悉了&#xff0c;一般大家都会…

探索DeFi世界,MixGPT引领智能金融新时代

随着区块链技术的迅猛发展&#xff0c;DeFi&#xff08;去中心化金融&#xff09;正成为金融领域的新宠。在这个充满活力的领域里&#xff0c;MixTrust站在创新的前沿&#xff0c;推出了一款引领智能金融新时代的核心技术——MixGPT。 MixGPT&#xff1a;引领智能金融体验的大型…

Rust逆向学习 (1)

文章目录 Hello, Rust Reverse0x01. main函数定位0x02. main函数分析line 1line 2line 3line 4~9 0x03. IDA反汇编0x04. 总结 近年来&#xff0c;Rust语言的热度越来越高&#xff0c;很多人都对Rust优雅的代码和优秀的安全性赞不绝口。对于开发是如此&#xff0c;对于CTF也是如…

208. 开关问题 - 异或方程组

208. 开关问题 - AcWing题库 我们可以找每一个开关由哪些开关掌控&#xff0c;每一个开关的值设为动过为1&#xff0c;没动过为0 再看当前开关的状态与结果的状态是否一致&#xff0c;一致为0&#xff0c;说明掌控这个开关的开关门的异或值为0&#xff0c;不一致则为1&#xf…

彻底理解操作系统与内核的区别!

通用底盘技术 Canoo公司有一项核心技术专利&#xff0c;这就是它们的通用电动底盘技术&#xff0c;长得是这个样子&#xff0c;非常像一个滑板&#xff1a; 这个带轮子、有电池、能动的滑板已经包含了一辆车最核心的组件&#xff0c;差的就是一个外壳。这个看起来像滑板的东西…

【MATLAB源码-第50期】基于simulink的BPSK调制解调仿真,输出误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. Bernoulli Binary: 这个模块生成伯努利二进制随机数&#xff0c;即0或1。这些数字表示要传输的原始数字信息。 2. Unipolar to Bipolar Converter: 此模块将伯努利二进制数据从0和1转换为-1和1&#xff0c;这是BPSK调制的标…

AN动画基础——缓动动画

【AN动画基础——影片剪辑滤镜】 基础动画缓动动画缓动原理实例应用 本篇内容&#xff1a;了解曲线原理 重点内容&#xff1a;缓动动画 工 具&#xff1a;Adobe Animate 2022 基础动画 我们先做一个非缓动的效果的动画。 绘制一个矩形设置成元件—图形&#xff0c;30帧插入关…

SpringMVC源码分析(四)请求流程分析

a、http请求是怎么被Controller接受处理&#xff0c;然后返回结果的&#xff1f; 发出HTTP请求后&#xff0c;跳过网络层的东西&#xff0c;当被应用服务器Tomcat接受的时候。在Tomcat中存在一个servlet容器&#xff0c;它负责管理所有的servlet&#xff0c;包括SpringMVC的核…

MySQL绕过WAF实战技巧

一、前言 本人喜欢遇到好的东西&#xff0c;乐于分享&#xff0c;关注freebuf有段时间了&#xff0c;写过两篇文章&#xff0c;每次写写文章&#xff0c;不仅仅是为了挣点稿费。而是通过此平台能够认识一些安全圈的小伙伴&#xff0c;互相学习&#xff0c;共同进步。在安全行业…

为什么不可大张旗鼓地推动“汉字编程”?

为什么不可大张旗鼓地推动“汉字编程”&#xff1f; 没有不可。 我之前看到过一个vscode插件&#xff0c;是给一个不知道叫什么名字的编程语言用的&#xff0c;从代码到注释全是西里尔字母写的&#xff0c;反正就只有东欧那片区域用。最近很多小伙伴找我&#xff0c;说想要一些…

c++实现最大堆

前言 在写leetcode的时候&#xff0c;看到一道优先队列的题目&#xff0c;复习了一下最大堆&#xff0c;用c实现了一下。以前听网课的时候&#xff0c;根本看不懂实现&#xff0c;现在自己也能实现了。 参考文献 这个我觉得讲得挺好的&#xff0c;图很生动形象 代码 #incl…