13534 字
68 分钟
01:mysql之基础

[TOC]

01:mysql之基础#

今日工作任务路线图

一、工作场景#

咱公司最近业务拓展,新入职了好多员工。HR部门要管理员工信息、部门信息和工资信息,财务部门每月得核算工资,老板也想随时了解各部门的人力成本。之前用 Excel 管理,数据多了又乱又容易出错。现在打算用 MySQL 数据库来管理这些数据。但大家都是小白,得先学会 MySQL 安装、密码管理、图形化软件安装,还得会用单表查询、日期函数、聚集函数、case 函数,才能从员工表、部门表、工资表中获取想要的信息,解决工作中的难题。

二、为什么学mysql数据库#

为啥要学这些东西呢?想象一下,要是不会 MySQL 安装,就没办法搭建数据库来管理公司的员工、部门和工资信息,那还不得乱成一锅粥。密码管理也很重要,要是密码泄露,公司的重要数据就可能被坏人拿走,损失可就大了。图形化软件能让操作更简单,就像玩游戏一样轻松。单表查询能让你快速找到需要的数据,日期函数可以处理和日期相关的信息,聚集函数能帮你统计数据,case 函数能根据不同条件输出不同结果。学会这些,工作效率蹭蹭往上涨,升职加薪不是梦!

三、构建mysql服务器#

当前任务环节

3.1 安装mysql服务#

1)准备1台虚拟机,要求如下:

IP地址主机名
192.168.90.50mysql50

2)配置IP地址和主机名

Terminal window
[root@localhost ~]# nmcli connection【肯耐申】 modify ens160 ipv4.addresses 192.168.90.50/24 autoconnect yes
参数详解​​:
* nmcli:NetworkManager 的命令行工具,用于管理网络连接
* connection【肯耐申】 modify:修改现有网络连接的配置
* ens160:网络接口的名称(通常是以太网接口)
* ipv4.addresses 192.168.90.50/24:
* 设置 IPv4 地址为 192.168.90.50
* 子网掩码为 255.255.255.0(/24表示前24位是网络位)
* autoconnect yes:设置系统启动时自动连接此网络接口
* ​​效果​​:将 ens160网络接口配置为使用静态 IP 地址 192.168.90.50,并确保系统重启后自动启用该连接。
[root@localhost ~]# nmcli connection【肯耐申】 up ens160
参数详解​​:
* connection【肯耐申】 up:激活指定的网络连接
* ens160:要激活的网络接口名称
* ​​效果​​:立即应用对 ens160接口的配置更改,使新的 IP 地址生效。相当于重启网络服务或启用网络接口。
[root@mysql50 ~]# hostnamectl set-hostname mysql50
​参数详解​​:
* hostnamectl:系统主机名管理工具
* set-hostname:设置新的主机名
* mysql50:新的主机名称
* ​​效果​​:将系统的主机名永久更改为 mysql50。主机名用于在网络中标识该系统。

3)安装mysql-server服务软件

Terminal window
[root@mysql50 ~]# yum -y install mysql-server
[root@mysql50 ~]# rpm -q mysql-server
mysql-server-8.0.41-2.el9_5.x86_64
#启动服务
root@mysql50 ~]# systemctl【西斯听头】 start【s 达儿】 mysqld
[root@mysql50 ~]# systemctl【西斯听头】 enable【an 内 步】 mysqld

4)查看端口

Terminal window
[root@mysql50 ~]# ss -utnlp | grep 【哥瑞普】 3306 #查看端口
tcp LISTEN 0 70 *:33060 *:* users:(("mysqld",pid=21912,fd=22))
tcp LISTEN 0 128 *:3306 *:* users:(("mysqld",pid=21912,fd=25))
[root@mysql50 ~]#
[root@mysql50 ~]# netstat【劣 s 塔】 -utnlp | grep 【哥瑞普】 mysqld #仅查看mysqld进程
tcp6 0 0 :::33060 :::* LISTEN 21912/mysqld
tcp6 0 0 :::3306 :::* LISTEN 21912/mysqld
选项含义作用
-t(—tcp)显示 TCP 连接过滤只显示 TCP 协议的网络连接
-u(—udp)显示 UDP 连接过滤只显示 UDP 协议的网络连接
-n(—numeric)数字格式显示不解析主机名和服务名,直接显示 IP 和端口号
-l(—listening)只显示监听端口只显示正在监听的套接字(服务端)
-p(—processes)显示进程信息显示使用该端口的进程信息

说明:

MySQL 8中的3306端口是MySQL服务默认使用的端口,主要用于建立客户端与MySQL服务器之间的连接。

MySQL 8中的33060端口是MySQL Shell默认使用的管理端口,主要用于执行各种数据库管理任务。远程管理MySQL服务器:使用MySQL Shell连接到MySQL服务,并在远程管理控制台上执行各种数据库管理操作,例如创建、删除、备份和恢复数据库等。

3.2 连接服务#

说明: 数据库管理员本机登陆默认没有密码

Terminal window
[root@mysql50 ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection【肯耐申】 id is 8
Server version【沃申】: 8.0.41 Source distribution
Copyright (c) 2000, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> exit【诶西特】
Bye
[root@mysql50 ~]#

3.3 mysql必备命令#

mysql> select【涩莱克特】 version【沃申】() ; //查看数据库软件版本
+------------------+
| version【沃申】() |
+------------------+
| 8.0.41 |
+------------------+
1 row in set (0.00 sec)
mysql> select【涩莱克特】 user() ; //查看登陆的用户和客户端地址
+----------------+
| user() |
+----------------+
| root@localhost | 管理员root本机登陆
+----------------+
1 row in set (0.00 sec)
mysql> show【瘦】 databases;【得塔-贝斯】 //查看已有的库
+----------------------------------------------+
| Database【得塔-贝斯】 |
+----------------------------------------------+
| information【因弗梅申】_schema【斯京(白话)磨】 |
| mysql |
| performance【破佛曼斯】_schema【斯京(白话)磨】 |
| sys |
+----------------------------------------------+
4 rows in set (0.00 sec)

说明:

默认4个库 不可以删除,存储的是 服务运行时加载的不同功能的程序和数据。

information【因弗梅申】_schema【斯京(白话)磨】:是MySQL数据库提供的一个虚拟的数据库,存储了MySQL数据库中的相关信息,比如数据库、表、列、索引、权限、角色等信息。它并不存储实际的数据,而是提供了一些视图和存储过程,用于查询和管理数据库的元数据信息。

mysql:存储了MySQL服务器的系统配置、用户、账号和权限信息等。它是MySQL数据库最基本的库,存储了MySQL服务器的核心信息。

performance【破佛曼斯】_schema【斯京(白话)磨】】:存储了MySQL数据库的性能指标、事件和统计信息等数据,可以用于性能分析和优化。

sys:是MySQL 8.0引入的一个新库,它基于 information【因弗梅申】_schema【斯京(白话)磨和performance【破佛曼斯】_schema【斯京(白话)磨】视图,提供了更方便、更直观的方式来查询和管理MySQL数据库的元数据和性能数据。

mysql> select【涩莱克特】 database();【得塔-贝斯】 //查看当前在那个库里 null【nò】 表示没有在任何库里
+------------+
| database() |【得塔-贝斯】
+------------+
| NULL【nò】 |
+------------+
1 row in set (0.00 sec)
mysql> use mysql ; //切换到mysql库
mysql> select【涩莱克特】 database();【得塔-贝斯】 // 再次显示所在的库
+------------+
| database() |【得塔-贝斯】
+------------+
| mysql |
+------------+
1 row in set (0.00 sec)
mysql> show【瘦】 tables;【忒-部s】 //显示库里已有的表
+------------------------------------------------------+
| Tables【忒-部s】_in_mysql |
+------------------------------------------------------+
| columns_priv |
| component |
| db |
| default_roles |
| engine_cost |
| func |
| general_log |
| global_grants |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table【忒-部】_stats |
| password_history |
| plugin |
| procs_priv |
| proxies_priv |
| replication_asynchronous_connection【肯耐申】_failover |
| replication_asynchronous_connection【肯耐申】_failover_managed |
| replication_group_configuration_version【沃申】 |
| replication_group_member_actions |
| role_edges |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables【忒-部s】_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+------------------------------------------------------+
37 rows in set (0.00 sec)
mysql> exit【诶西特】 ; #断开连接
Bye
[root@mysql50 ~]#

四、密码管理#

当前任务环节

4.1 问题#

1) 在192.168.90.50主机做如下练习:

  1. 设置root密码为moershi
  2. 修改root密码为123qqq…A
  3. 破解root密码为NSD123456…a

4.2 步骤#

实现此案例需要按照如下步骤进行。

步骤一:设置root密码为moershi

命令操作如下所示:

2行输出是警告而已不用关心

Terminal window
[root@mysql50 ~]# mysqladmin -uroot -p password "moershi"
Enter password: //敲回车
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection【肯耐申】 to ensure password safety.
[root@mysql50 ~]#
[root@mysql50 ~]# mysql //无密码连接被拒绝
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@mysql50 ~]#
[root@mysql50 ~]# mysql -uroot –pmoershi //连接时输入密码
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection【肯耐申】 id is 14
Server version【沃申】: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> 登陆成功

步骤二:修改root密码为123qqq…A

命令操作如下所示:

Terminal window
[root@mysql50 ~]# mysqladmin -uroot -pmoershi password "123qqq...A" //修改密码
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection【肯耐申】 to ensure password safety.
[root@mysql50 ~]#
[root@mysql50 ~]# mysql -uroot –pmoershi //旧密码无法登陆
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
[root@mysql50 ~]#
[root@mysql50 ~]# mysql -uroot -p123qqq...A //新密码登陆
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection【肯耐申】 id is 18
Server version【沃申】: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> 登陆成功

步骤三:破解root密码为NSD123456…a

说明:在mysql50主机做此练习

命令操作如下所示:

Terminal window
[root@mysql50 ~]# mysql -uroot -pNSD123456...a //破解前登陆失败
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
[root@mysql50 ~]#
[root@mysql50 ~]# vim /etc/my.cnf.d/mysql-server.cnf //修改主配置文件
[mysqld]
skip-grant-tables【忒-部s】 //手动添加此行 作用登陆时不验证密码
:wq
[root@mysql50 ~]#
[root@mysql50 ~]# systemctl【西斯听头】 restart【 率 s 达r】 mysqld //重启服务 作用让服务以新配置运行
[root@mysql50 ~]#
[root@mysql50 ~]# mysql //连接服务
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection【肯耐申】 id is 7
Server version【沃申】: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
//查看存放密码的表头名
Mysql>
Mysql> desc mysql.user ;
//把mysql库下user表中 用户root的密码设置为无;
Mysql>
mysql> update mysql.user set authentication_string="" where【威尔】 user="root";
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Mysql>
mysql> exit【诶西特】; 断开连接
Bye
Terminal window
[root@mysql50 ~]#
[root@mysql50 ~]# vim /etc/my.cnf.d/mysql-server.cnf 编辑配置文件
[mysqld]
#skip-grant-tables【忒-部s】 //注释添加的行
:wq
[root@mysql50 ~]#
[root@mysql50 ~]# systemctl【西斯听头】 restart【 率 s 达r】 mysqld //重启服务 作用让注释生效
[root@mysql50 ~]#
[root@localhost ~]# mysql 无密码登陆
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection【肯耐申】 id is 8
Server version【沃申】: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
//设置root用户本机登陆密码
Mysql>
mysql> alter user root@"localhost" identified by "NSD123456...a";
Query OK, 0 rows affected (0.00 sec)
Mysql>
mysql> exit【诶西特】 断开连接
Bye
Terminal window
[root@mysql50 ~]#
[root@localhost ~]# mysql 不输密码无法登陆
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@mysql50 ~]#
[root@localhost ~]# mysql -uroot -pNSD123456...a 使用破解的密码登陆
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection【肯耐申】 id is 10
Server version【沃申】: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> #登陆成功
Mysql>
mysql> show【瘦】 databases;【得塔-贝斯】 查看已有的库
+----------------------------------------------+
| Database【得塔-贝斯】 |
+----------------------------------------------+
| information【因弗梅申】_schema【斯京(白话)磨】 |
| mysql |
| performance【破佛曼斯】_schema【斯京(白话)磨】 |
| sys |
+----------------------------------------------+
4 rows in set (0.01 sec)

五、筛选条件#

当前任务环节

5.1导入数据#

拷贝moershi.sql文件到mysql50主机里,然后使用moershi.sql创建练习使用的数据。

//恢复数据
[root@mysql50 ~]# mysql -uroot -pNSD123456...a < /root/moershi.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
//连接服务
[root@mysql50 ~]# mysql -uroot -pNSD123456...a
mysql>
mysql> show【瘦】 databases;【得塔-贝斯】 //查看库
+----------------------------------------------+
| Database【得塔-贝斯】 |
+----------------------------------------------+
| information【因弗梅申】_schema【斯京(白话)磨】 |
| mysql |
| performance【破佛曼斯】_schema【斯京(白话)磨】 |
| sys |
| moershi | 恢复的库
+----------------------------------------------+
5 rows in set (0.00 sec)
mysql>
mysql> use moershi; //进入库
Reading table【忒-部】 information【因弗梅申】 for completion of table【忒-部】 and column names
You can turn off this feature to get a quicker startup【s 达 啊普】 with -A
Database【得塔-贝斯】 changed
mysql>
mysql> show【瘦】 tables;【忒-部s】 //查看表
+------------------+
| Tables【忒-部s】_in_moershi |
+------------------+
| departments | 部门表
| employees | 员工表
| salary | 工资表
| user | 用户表
+------------------+
4 rows in set (0.00 sec)

5.2 使用user 表做查询练习#

user表里存储的是 系统用户信息( 就是 /etc/passwd 文件的内容)

mysql> desc moershi.user; //查看表头
+----------+-------------+------+-----+----------------+----------------+
| Field | Type | Null【nò】 | Key | Default | Extra |
+----------+-------------+------+-----+----------------+----------------+
| id | int(11) | NO | PRI | NULL【nò】 | auto_increment |行号
| name | char(20) | YES | | NULL【nò】 | |用户名
| password | char(1) | YES | | NULL【nò】 | |密码占位符
| uid | int(11) | YES | | NULL【nò】 | | uid号
| gid | int(11) | YES | | NULL【nò】 | | gid号
| comment | varchar(50) | YES | | NULL【nò】 | | 描述信息
| homedir | varchar(80) | YES | | NULL【nò】 | | 家目录
| shell | char(30) | YES | | NULL【nò】 | | 解释器
+----------+-------------+------+-----+----------------+----------------+
8 rows in set (0.00 sec)

5.3 select【涩莱克特】命令格式演示#

语法格式1 select【涩莱克特】 字段列表 FROM【弗乱】 库名.表名;

语法格式2 select【涩莱克特】 字段列表 FROM【弗乱】 库名.表名 where【威尔】 筛选条件;

mysql> select【涩莱克特】 name from【弗乱】 moershi.user; //查看一个表头
+-----------------+
| name |
+-----------------+
| root |
| bin |
| daemon |
| adm |
| lp |
| sync |
| shutdown |
| halt |
| mail |
| operator |
| games |
| ftp |
| nobody |
| systemd-network |
| dbus |
| polkitd |
| sshd |
| postfix |
| chrony |
| rpc |
| rpcuser |
| nfsnobody |
| haproxy |
| plj |
| apache |
| mysql |
| bob |
+-----------------+
27 rows in set (0.00 sec)
mysql> select【涩莱克特】 name ,uid from【弗乱】 moershi.user; //查看多个表头
+-----------------+-------+
| name | uid |
+-----------------+-------+
| root | 0 |
| bin | 1 |
| daemon | 2 |
| adm | 3 |
| lp | 4 |
| sync | 5 |
| shutdown | 6 |
| halt | 7 |
| mail | 8 |
| operator | 11 |
| games | 12 |
| ftp | 14 |
| nobody | 99 |
| systemd-network | 192 |
| dbus | 81 |
| polkitd | 999 |
| sshd | 74 |
| postfix | 89 |
| chrony | 998 |
| rpc | 32 |
| rpcuser | 29 |
| nfsnobody | 65534 |
| haproxy | 188 |
| plj | 1000 |
| apache | 48 |
| mysql | 27 |
| bob | NULL【nò】 |
+-----------------+-------+
27 rows in set (0.00 sec)
mysql> select【涩莱克特】 * from【弗乱】 moershi.user; //查看所有表头
+----+-----------------+----------+-------+-------+----------------------------+--------------------+----------------+
| id | name | password | uid | gid | comment | homedir | shell |
+----+-----------------+----------+-------+-------+----------------------------+--------------------+----------------+
| 1 | root | x | 0 | 0 | root | /root | /bin/bash |
| 2 | bin | x | 1 | 1 | bin | /bin | /sbin/nologin |
| 3 | daemon | x | 2 | 2 | daemon | /sbin | /sbin/nologin |
| 4 | adm | x | 3 | 4 | adm | /var/adm | /sbin/nologin |
| 5 | lp | x | 4 | 7 | lp | /var/spool/lpd | /sbin/nologin |
| 6 | sync | x | 5 | 0 | sync | /sbin | /bin/sync |
| 7 | shutdown | x | 6 | 0 | shutdown | /sbin | /sbin/shutdown |
| 8 | halt | x | 7 | 0 | halt | /sbin | /sbin/halt |
| 9 | mail | x | 8 | 12 | mail | /var/spool/mail | /sbin/nologin |
| 10 | operator | x | 11 | 0 | operator | /root | /sbin/nologin |
| 11 | games | x | 12 | 100 | games | /usr/games | /sbin/nologin |
| 12 | ftp | x | 14 | 50 | FTP User | /var/ftp | /sbin/nologin |
| 13 | nobody | x | 99 | 99 | Nobody | / | /sbin/nologin |
| 14 | systemd-network | x | 192 | 192 | systemd Network Management | / | /sbin/nologin |
| 15 | dbus | x | 81 | 81 | System message bus | / | /sbin/nologin |
| 16 | polkitd | x | 999 | 998 | User for polkitd | / | /sbin/nologin |
| 17 | sshd | x | 74 | 74 | Privilege-separated SSH | /var/empty/sshd | /sbin/nologin |
| 18 | postfix | x | 89 | 89 | | /var/spool/postfix | /sbin/nologin |
| 19 | chrony | x | 998 | 996 | | /var/lib/chrony | /sbin/nologin |
| 20 | rpc | x | 32 | 32 | Rpcbind Daemon | /var/lib/rpcbind | /sbin/nologin |
| 21 | rpcuser | x | 29 | 29 | RPC Service User | /var/lib/nfs | /sbin/nologin |
| 22 | nfsnobody | x | 65534 | 65534 | Anonymous NFS User | /var/lib/nfs | /sbin/nologin |
| 23 | haproxy | x | 188 | 188 | haproxy | /var/lib/haproxy | /sbin/nologin |
| 24 | plj | x | 1000 | 1000 | | /home/plj | /bin/bash |
| 25 | apache | x | 48 | 48 | Apache | /usr/share/httpd | /sbin/nologin |
| 26 | mysql | x | 27 | 27 | MySQL Server | /var/lib/mysql | /bin/false |
| 27 | bob | NUL【nò】L | NULL【nò】 | NULL【nò】 | NULL【nò】 | NULL【nò】 | NULL【nò】 |
+----+-----------------+----------+-------+-------+----------------------------+--------------------+----------------+
27 rows in set (0.00 sec)

加筛选条件

mysql> select【涩莱克特】 * from【弗乱】 moershi.user where【威尔】 name =root”; //查找root用户信息
+----+------+----------+------+------+---------+---------+-----------+
| id | name | password | uid | gid | comment | homedir | shell |
+----+------+----------+------+------+---------+---------+-----------+
| 1 | root | x | 0 | 0 | root | /root | /bin/bash |
+----+------+----------+------+------+---------+---------+-----------+
1 row in set (0.00 sec)
mysql>
mysql> select【涩莱克特】 * from【弗乱】 moershi.user where【威尔】 id = 2 ; //查找第2行用户信息
+----+------+----------+------+------+---------+---------+--------------+
| id | name | password | uid | gid | comment | homedir | shell |
+----+------+----------+------+------+---------+---------+--------------+
| 2 | bin | x | 1 | 1 | bin | /bin | /sbin/nologin |
+----+------+----------+------+------+---------+---------+--------------+
1 row in set (0.00 sec)

5.4 练习数值比较#

比较符号:

符号意义
=相等
!=不相等
>大于
>=大于等于
<小于
<=小于等于

符号两边要是数字或数值类型的表头 符号左边与符号右边做比较

//查看第3行的行号、用户名、uid、gid 四个表头的值
mysql>
mysql> select【涩莱克特】 id,name,uid,gid from【弗乱】 moershi.user where【威尔】 id = 3;
+----+--------+------+------+
| id | name | uid | gid |
+----+--------+------+------+
| 3 | daemon | 2 | 2 |
+----+--------+------+------+
1 row in set (0.00 sec)
//查看前2行的行号用户名、uid、gid 四个表头的值
mysql>
mysql> select【涩莱克特】 id,name,uid,gid from【弗乱】 moershi.user where【威尔】 id < 3;
+----+------+------+------+
| id | name | uid | gid |
+----+------+------+------+
| 1 | root | 0 | 0 |
| 2 | bin | 1 | 1 |
+----+------+------+------+
2 rows in set (0.00 sec)
//查看前3行的行号、用户名、uid、gid 四个表头的值
mysql>
mysql> select【涩莱克特】 id,name,uid,gid from【弗乱】 moershi.user where【威尔】 id <= 3;
+----+--------+------+------+
| id | name | uid | gid |
+----+--------+------+------+
| 1 | root | 0 | 0 |
| 2 | bin | 1 | 1 |
| 3 | daemon | 2 | 2 |
+----+--------+------+------+
3 rows in set (0.00 sec)
//查看前uid号大于6000的行号、用户名、uid、gid 四个表头的值
mysql>
mysql> select【涩莱克特】 id,name,uid,gid from【弗乱】 moershi.user where【威尔】 uid > 6000;
+----+-----------+-------+-------+
| id | name | uid | gid |
+----+-----------+-------+-------+
| 22 | nfsnobody | 65534 | 65534 |
+----+-----------+-------+-------+
1 row in set (0.00 sec)
//查看前uid号大于等于1000的行号、用户名、uid、gid 四个表头的值
mysql>
mysql> select【涩莱克特】 id,name,uid,gid from【弗乱】 moershi.user where【威尔】 uid >= 1000;
+----+-----------+-------+-------+
| id | name | uid | gid |
+----+-----------+-------+-------+
| 22 | nfsnobody | 65534 | 65534 |
| 24 | plj | 1000 | 1000 |
+----+-----------+-------+-------+
2 rows in set (0.00 sec)
//查看uid号和gid号相同的行 仅显示行号、用户名、uid、gid 四个表头的值
mysql>
mysql> select【涩莱克特】 id,name,uid,gid from【弗乱】 moershi.user where【威尔】 uid = gid;
+----+-----------------+-------+-------+
| id | name | uid | gid |
+----+-----------------+-------+-------+
| 1 | root | 0 | 0 |
| 2 | bin | 1 | 1 |
| 3 | daemon | 2 | 2 |
| 13 | nobody | 99 | 99 |
| 14 | systemd-network | 192 | 192 |
| 15 | dbus | 81 | 81 |
| 17 | sshd | 74 | 74 |
| 18 | postfix | 89 | 89 |
| 20 | rpc | 32 | 32 |
| 21 | rpcuser | 29 | 29 |
| 22 | nfsnobody | 65534 | 65534 |
| 23 | haproxy | 188 | 188 |
| 24 | plj | 1000 | 1000 |
| 25 | apache | 48 | 48 |
| 26 | mysql | 27 | 27 |
+----+-----------------+-------+-------+
15 rows in set (0.00 sec)
//查看uid号和gid号不一样的行 仅显示行号、用户名、uid、gid 四个表头的值
mysql>
mysql> select【涩莱克特】 id,name,uid,gid from【弗乱】 moershi.user where【威尔】 uid != gid;
+----+----------+------+------+
| id | name | uid | gid |
+----+----------+------+------+
| 4 | adm | 3 | 4 |
| 5 | lp | 4 | 7 |
| 6 | sync | 5 | 0 |
| 7 | shutdown | 6 | 0 |
| 8 | halt | 7 | 0 |
| 9 | mail | 8 | 12 |
| 10 | operator | 11 | 0 |
| 11 | games | 12 | 100 |
| 12 | ftp | 14 | 50 |
| 16 | polkitd | 999 | 998 |
| 19 | chrony | 998 | 996 |
+----+----------+------+------+
11 rows in set (0.00 sec)
mysql>

5.5 练习范围匹配#

in(值列表) //在…里
not【呐-特】 in(值列表) //不在…里
between【B豚ing】数字1 and 数字2 //在…之间
操作符语法描述示例返回值说明
INcolumn_name IN (value1, value2, ...)检查列值是否在指定的值列表中SELECT * FROM products WHERE category_id IN (1, 3, 5);返回 category_id 为 1、3 或 5 的所有产品
NOT【呐-特】 INcolumn_name NOT【呐-特】 IN (value1, value2, ...)检查列值是否不在指定的值列表中SELECT * FROM users WHERE country NOT【呐-特】 IN ('USA', 'Canada');返回不在美国和加拿大的所有用户
BETWEEN【B豚ing】column_name BETWEEN【B豚ing】 value1 AND value2检查列值是否在指定的范围内(包含边界值)SELECT * FROM orders WHERE order_date BETWEEN【B豚ing】 '2023-01-01' AND '2023-01-31';返回 2023 年 1 月期间的所有订单
NOT BETWEEN【B豚ing】column_name NOT【呐-特】 BETWEEN【B豚ing】 value1 AND value2检查列值是否不在指定的范围内SELECT * FROM employees WHERE salary NOT【呐-特】 BETWEEN【B豚ing】 30000 AND 60000;返回薪资低于 30,000 或高于 60,000 的所有员工

补充说明#

  1. IN 和 NOT【呐-特】 IN 适用于离散值的匹配,可以用于数字、字符串、日期等数据类型
  2. BETWEEN【B豚ing】 适用于连续范围的匹配,通常用于数字和日期范围
  3. BETWEEN【B豚ing】 操作包含边界值,即 BETWEEN【B豚ing】 10 AND 20 包含 10 和 20
  4. 对于日期范围,建议使用标准日期格式(如 ‘YYYY-MM-DD’)以避免歧义
  5. 这些操作符可以组合使用,并与其他 WHERE 子句条件结合

命令操作如下所示:

//uid号表头的值 是 (1 , 3 , 5 , 7) 中的任意一个即可
mysql>
mysql> select【涩莱克特】 name,uid from【弗乱】 moershi.user where【威尔】 uid in (1 , 3 , 5 , 7);
+------+------+
| name | uid |
+------+------+
| bin | 1 |
| adm | 3 |
| sync | 5 |
| halt | 7 |
+------+------+
//shell 表头的的值 不是 "/bin/bash""/sbin/nologin" 即可
mysql>
mysql> select【涩莱克特】 name,shell from【弗乱】 moershi.user where【威尔】 shell not【呐-特】 in ("/bin/bash","/sbin/nologin");
+----------+----------------+
| name | shell |
+----------+----------------+
| sync | /bin/sync |
| shutdown | /sbin/shutdown |
| halt | /sbin/halt |
| mysql | /bin/false |
+----------+----------------+
//id表头的值 在 1020 之间即可 包括 1020 本身
mysql>
mysql> select【涩莱克特】 id,name,uid from【弗乱】 moershi.user where【威尔】 id between【B豚ing】 10 and 20 ;
+----+-----------------+------+
| id | name | uid |
+----+-----------------+------+
| 10 | operator | 11 |
| 11 | games | 12 |
| 12 | ftp | 14 |
| 13 | nobody | 99 |
| 14 | systemd-network | 192 |
| 15 | dbus | 81 |
| 16 | polkitd | 999 |
| 17 | sshd | 74 |
| 18 | postfix | 89 |
| 19 | chrony | 998 |
| 20 | rpc | 32 |
+----+-----------------+------+
11 rows in set (0.00 sec)mysql>

5.6 练习模糊匹配#

where【威尔】 字段名 like【赖特】 “表达式”;

通配符

_ 表示 1个字符

% 表示零个或多个字符

SQL 模糊匹配操作符参考表#

操作符/通配符语法描述示例匹配结果说明
LIKE【赖特】WHERE column_name LIKE【赖特】 'pattern'用于在WHERE子句中搜索列中的指定模式SELECT * FROM customers WHERE name LIKE【赖特】 'J%';返回所有名字以”J”开头的客户
_ (下划线)'_'匹配任意单个字符SELECT * FROM products WHERE code LIKE【赖特】 'A_1';匹配”A” + 任意一个字符 + “1”,如”A01”, “AB1”
% (百分号)'%'匹配零个或多个字符SELECT * FROM emails WHERE address LIKE【赖特】 '%@gmail.com';匹配所有Gmail邮箱地址
NOT LIKE【赖特】WHERE column_name NOT LIKE【赖特】 'pattern'查找不匹配指定模式的行SELECT * FROM files WHERE name NOT LIKE【赖特】 '%.tmp';返回所有不是临时文件(.tmp)的文件

组合使用示例#

模式示例描述
'_%'LIKE【赖特】 '_%'匹配至少有一个字符的值
'%@%'LIKE【赖特】 '%@%'匹配包含@符号的值(常用于邮箱验证)
'__-___-____'LIKE【赖特】 '__-___-____'匹配格式为XX-XXX-XXXX的值(如电话号码)
'A%Z'LIKE【赖特】 'A%Z'匹配以”A”开头并以”Z”结尾的值

命令操作如下所示:

//找名字必须是3个字符的 (没有空格挨着敲)
mysql> select【涩莱克特】 name from【弗乱】 moershi.user where【威尔】 name like【赖特】 "___";
+------+
| name |
+------+
| bin |
| adm |
| ftp |
| rpc |
| plj |
| bob |
+------+
6 rows in set (0.00 sec)
//找名字必须是4个字符的(没有空格挨着敲)
mysql> select【涩莱克特】 name from【弗乱】 moershi.user where【威尔】 name like【赖特】 "____";
+------+
| name |
+------+
| root |
| sync |
| halt |
| mail |
| dbus |
| sshd |
| null【nò】 |
+------+
7 rows in set (0.00 sec)
//找名字以字母a开头的(没有空格挨着敲)
mysql> select【涩莱克特】 name from【弗乱】 moershi.user where【威尔】 name like【赖特】 "a%";
//查找名字至少是4个字符的表达式
mysql> select【涩莱克特】 name from【弗乱】 moershi.user where【威尔】 name like【赖特】 "%____%";(没有空格挨着敲)
mysql> select【涩莱克特】 name from【弗乱】 moershi.user where【威尔】 name like【赖特】 "__%__";(没有空格挨着敲)
mysql> select【涩莱克特】 name from【弗乱】 moershi.user where【威尔】 name like【赖特】 "____%";(没有空格挨着敲)

5.7 练习逻辑比较#

多个判断条件

逻辑与 and (&&) 多个判断条件必须同时成立

逻辑或 or (||) 多个判断条件其中某个条件成立即可

逻辑非 not【呐-特】 (!) 取反

SQL 逻辑操作符参考表#

操作符语法描述示例结果说明
AND (逻辑与)condition1 AND condition2所有条件都必须为真,结果才为真SELECT * FROM users WHERE age > 18 AND country = 'USA';返回年龄大于18岁且来自美国的用户
OR (逻辑或)condition1 OR condition2至少一个条件为真,结果就为真SELECT * FROM products WHERE category = 'Electronics' OR price > 1000;返回电子产品或价格超过1000的产品
NOT (逻辑非)NOT condition反转条件的真假值SELECT * FROM orders WHERE NOT status = 'Cancelled';返回所有未取消的订单
&& (AND的替代符号)condition1 && condition2某些数据库系统中AND的替代写法SELECT * FROM users WHERE age > 18 && country = 'USA';与AND相同,但并非所有数据库都支持
|| (OR的替代符号)condition1 || condition2某些数据库系统中OR的替代写法SELECT * FROM products WHERE category = 'Electronics' || price > 1000;与OR相同,但并非所有数据库都支持
! (NOT的替代符号)!condition某些数据库系统中NOT的替代写法SELECT * FROM orders WHERE !status = 'Cancelled';与NOT相同,但并非所有数据库都支持

操作符优先级#

优先级操作符描述
1括号 ()括号内的表达式最先计算
2NOT逻辑非
3AND逻辑与
4OR逻辑或

命令操作如下所示:

//逻辑非例子,查看解释器不是/bin/bash 的
mysql> select【涩莱克特】 name,shell from【弗乱】 moershi.user where【威尔】 shell != "/bin/bash";
+-----------------+----------------+
| name | shell |
+-----------------+----------------+
| bin | /sbin/nologin |
| daemon | /sbin/nologin |
| adm | /sbin/nologin |
| lp | /sbin/nologin |
| sync | /bin/sync |
| shutdown | /sbin/shutdown |
| halt | /sbin/halt |
| mail | /sbin/nologin |
| operator | /sbin/nologin |
| games | /sbin/nologin |
| ftp | /sbin/nologin |
| nobody | /sbin/nologin |
| systemd-network | /sbin/nologin |
| dbus | /sbin/nologin |
| polkitd | /sbin/nologin |
| sshd | /sbin/nologin |
| postfix | /sbin/nologin |
| chrony | /sbin/nologin |
| rpc | /sbin/nologin |
| rpcuser | /sbin/nologin |
| nfsnobody | /sbin/nologin |
| haproxy | /sbin/nologin |
| apache | /sbin/nologin |
| mysql | /bin/false |
+-----------------+----------------+
24 rows in set (0.00 sec)
//not【呐-特】 也是取反 要放在表达式的前边
mysql> select【涩莱克特】 name,shell from【弗乱】 moershi.user where【威尔】 not【呐-特】 shell = "/bin/bash";
+-----------------+----------------+
| name | shell |
+-----------------+----------------+
| bin | /sbin/nologin |
| daemon | /sbin/nologin |
| adm | /sbin/nologin |
| lp | /sbin/nologin |
| sync | /bin/sync |
| shutdown | /sbin/shutdown |
| halt | /sbin/halt |
| mail | /sbin/nologin |
| operator | /sbin/nologin |
| games | /sbin/nologin |
| ftp | /sbin/nologin |
| nobody | /sbin/nologin |
| systemd-network | /sbin/nologin |
| dbus | /sbin/nologin |
| polkitd | /sbin/nologin |
| sshd | /sbin/nologin |
| postfix | /sbin/nologin |
| chrony | /sbin/nologin |
| rpc | /sbin/nologin |
| rpcuser | /sbin/nologin |
| nfsnobody | /sbin/nologin |
| haproxy | /sbin/nologin |
| apache | /sbin/nologin |
| mysql | /bin/false |
+-----------------+----------------+
24 rows in set (0.00 sec)
//id值不在 1020 之间
mysql> select【涩莱克特】 id,name from【弗乱】 moershi.user where【威尔】 not【呐-特】 id between【B豚ing】 10 and 20 ;
+----+-----------+
| id | name |
+----+-----------+
| 1 | root |
| 2 | bin |
| 3 | daemon |
| 4 | adm |
| 5 | lp |
| 6 | sync |
| 7 | shutdown |
| 8 | halt |
| 9 | mail |
| 21 | rpcuser |
| 22 | nfsnobody |
| 23 | haproxy |
| 24 | plj |
| 25 | apache |
| 26 | mysql |
| 27 | bob |
+----+-----------+
16 rows in set (0.00 sec)
//逻辑与 例子
mysql> select【涩莱克特】 name,uid from【弗乱】 moershi.user where【威尔】 name="root" and uid = 1;
Empty set (0.00 sec)
mysql> select【涩莱克特】 name,uid from【弗乱】 moershi.user where【威尔】 name="root" and uid = 0;
+------+------+
| name | uid |
+------+------+
| root | 0 |
+------+------+
1 row in set (0.00 sec)
//逻辑或 例子
mysql> select【涩莱克特】 name , uid from【弗乱】 moershi.user where【威尔】 name = "root" or name = "bin" or uid = 1;
+------+------+
| name | uid |
+------+------+
| root | 0 |
| bin | 1 |
+------+------+
mysql>

逻辑匹配什么时候需要加()

逻辑与and 优先级高于逻辑或 or

如果在筛选条件里既有and 又有 or 默认先判断and 再判断or

//没加() 的查询结果
select【涩莱克特】 name,uid from【弗乱】 moershi.user where【威尔】 name = "root" or name = "bin" and uid = 1 ;
+------+------+
| name | uid |
+------+------+
| root | 0 |
| bin | 1 |
+------+------+
2 rows in set (0.00 sec)
//加()的查询结果
select【涩莱克特】 name , uid from【弗乱】 moershi.user where【威尔】 (name = "root" or name = "bin") and uid = 1 ;
+------+------+
| name | uid |
+------+------+
| bin | 1 |
+------+------+
1 row in set (0.00 sec)
mysql>

5.8 练习字符比较/空/非空#

符号两边必须是字符 或字符类型的表头

= 相等比较

!= 不相等比较。

SQL 字符比较与空值判断操作符参考表#

操作符语法描述示例结果说明
= (等于)column_name = 'value'比较两个字符值是否相等SELECT * FROM users WHERE name = 'John';返回名字为’John’的用户
!=<> (不等于)column_name != 'value'column_name <> 'value'比较两个字符值是否不相等SELECT * FROM products WHERE category != 'Electronics';返回类别不是’Electronics’的产品
IS NULL【nò】 (为空)column_name IS NULL【nò】检查列值是否为NULL【nò】SELECT * FROM customers WHERE email IS NULL【nò】;返回没有填写邮箱的客户
IS NOT【呐-特】 NULL【nò】 (非空)column_name IS NOT【呐-特】 NULL【nò】检查列值是否不为NULL【nò】SELECT * FROM orders WHERE shipping_address IS NOT【呐-特】 NULL【nò】;返回已填写配送地址的订单

字符比较注意事项#

注意事项说明示例
大小写敏感在某些数据库系统中,字符比较可能区分大小写'Apple' = 'apple' 可能返回false
尾部空格比较时可能会忽略或考虑字符串尾部的空格'John ' = 'John' 可能返回true
字符集和排序规则比较结果受数据库字符集和排序规则设置影响不同字符集可能导致不同的比较结果

空值判断的特殊性#

特性说明示例
NULL【nò】与任何值的比较NULL【nò】与任何值(包括NULL【nò】本身)比较都返回未知(UNKNOWN)NULL【nò】 = NULL【nò】 返回NULL【nò】而不是true
三值逻辑SQL使用三值逻辑: true, false, unknownWHERE column = NULL【nò】 不会返回任何行
正确判断空值必须使用IS NULL【nò】或IS NOT【呐-特】 NULL【nò】判断空值WHERE column IS NULL【nò】 正确判断空值

命令操作如下所示:

//查看表里是否有名字叫apache的用户
mysql> select【涩莱克特】 name from【弗乱】 moershi.user where【威尔】 name="apache" ;
+--------+
| name |
+--------+
| apache |
+--------+
1 row in set (0.00 sec)
//输出解释器不是/bin/bash的用户名 及使用的解释器
mysql> select【涩莱克特】 name,shell from【弗乱】 moershi.user where【威尔】 shell != "/bin/bash";
+-----------------+----------------+
| name | shell |
+-----------------+----------------+
| bin | /sbin/nologin |
| daemon | /sbin/nologin |
| adm | /sbin/nologin |
| lp | /sbin/nologin |
| sync | /bin/sync |
| shutdown | /sbin/shutdown |
| halt | /sbin/halt |
| mail | /sbin/nologin |
| operator | /sbin/nologin |
| games | /sbin/nologin |
| ftp | /sbin/nologin |
| nobody | /sbin/nologin |
| systemd-network | /sbin/nologin |
| dbus | /sbin/nologin |
| polkitd | /sbin/nologin |
| sshd | /sbin/nologin |
| postfix | /sbin/nologin |
| chrony | /sbin/nologin |
| rpc | /sbin/nologin |
| rpcuser | /sbin/nologin |
| nfsnobody | /sbin/nologin |
| haproxy | /sbin/nologin |
| apache | /sbin/nologin |
| mysql | /bin/false |
+-----------------+----------------+
24 rows in set (0.00 sec)
mysql>

空 is null【nò】 表头下没有数据

非空 is not【呐-特】 null【nò】 表头下有数据

mysql服务 使用关键字 null【nò】 或 NULL【nò】 表示表头没有数据

MySQL 空值判断操作符参考表#

操作符语法描述示例结果说明
IS NULL【nò】column_name IS NULL【nò】检查列值是否为 NULL【nò】(空值)SELECT * FROM users WHERE email IS NULL【nò】;返回 email 字段为空的用户
IS NOT【呐-特】 NULL【nò】column_name IS NOT【呐-特】 NULL【nò】检查列值是否不为 NULL【nò】(非空)SELECT * FROM orders WHERE amount IS NOT【呐-特】 NULL【nò】;返回 amount 字段有值的订单

NULL【nò】 值的特殊性质#

特性说明示例
NULL【nò】 与空字符串的区别NULL【nò】 表示没有值,而空字符串(”)是一个有效的值NULL【nò】 != ''
NULL【nò】 的比较NULL【nò】 与任何值(包括 NULL【nò】 本身)比较都返回未知NULL【nò】 = NULL【nò】 返回 NULL【nò】
NULL【nò】 的计算任何包含 NULL【nò】 的计算结果通常都是 NULL【nò】5 + NULL【nò】 返回 NULL【nò】
NULL【nò】 的逻辑运算NULL【nò】 参与逻辑运算时通常返回未知NULL【nò】 AND TRUE 返回 NULL【nò】

处理 NULL【nò】 值的函数#

函数语法描述示例
IFNULL()IFNULL(expr1, expr2)如果 expr1 不为 NULL【nò】,返回 expr1,否则返回 expr2SELECT IFNULL(salary, 0) FROM employees;
COALESCE()COALESCE(expr1, expr2, ...)返回参数列表中第一个非 NULL【nò】 的值SELECT COALESCE(phone, mobile, '无联系方式') FROM contacts;
NULLIF()NULLIF(expr1, expr2)如果 expr1 = expr2,返回 NULL【nò】,否则返回 expr1SELECT NULLIF(salary, 0) FROM employees;
//添加新行 仅给行中的id 表头和name表头赋值
mysql> insert【因涩特】 into moershi.user(id,name) values(71,""); //零个字符
mysql> insert【因涩特】 into moershi.user(id,name) values(72,"null【nò】");//普通字母
mysql> insert【因涩特】 into moershi.user(id,name) values(73,NULL【nò】); //表示空
mysql> insert【因涩特】 into moershi.user(id,name) values(74,null【nò】); //表示空
//查看id表头值大于等于70 的行 仅显示行中 id表头 和 name 表头的值
mysql> select【涩莱克特】 id,name from【弗乱】 moershi.user where【威尔】 id >= 71;
+----+-------------+
| id | name |
+----+-------------+
| 71 | |
| 72 | null【nò】 |
| 73 | NULL【nò】 |
| 74 | NULL【nò】 |
+----+-------------+
//查看name 表头没有数据的行 仅显示行中id表头 和 naeme 表头的值
mysql> select【涩莱克特】 id,name from【弗乱】 moershi.user where【威尔】 name is null【nò】;
+----+-------------+
| id | name |
+----+-------------+
| 28 | NULL【nò】 |
| 29 | NULL【nò】 |
| 73 | NULL【nò】 |
| 74 | NULL【nò】 |
+----+-------------+
//查看name 表头是0个字符的行, 仅显示行中id表头 和 naeme 表头的值
mysql> select【涩莱克特】 id,name from【弗乱】 moershi.user where【威尔】 name="";
+----+------+
| id | name |
+----+------+
| 71 | |
+----+------+
1 row in set (0.00 sec)
//查看name 表头值是null【nò】的行, 仅显示行中id表头 和 naeme 表头的值
mysql> select【涩莱克特】 id,name from【弗乱】 moershi.user where【威尔】 name="null【nò】";
+----+------+
| id | name |
+----+------+
| 72 | null【nò】 |
+----+------+
1 row in set (0.00 sec)
//查看name 表头有数据的行, 仅显示行中id表头 和 name 表头的值
mysql> select【涩莱克特】 id,name from【弗乱】 moershi.user where【威尔】 name is not【呐-特】 null【nò】;
+----+-----------------+
| id | name |
+----+-----------------+
| 1 | root |
| 2 | bin |
| 3 | daemon |
| 4 | adm |
| 5 | lp |
....
....
| 27 | bob |
| 71 | |
| 72 | null【nò】 |
+----+-----------------+

5.9 练习别名/去重/合并#

操作类型关键字/函数描述主要用途
别名AS 或空格为列或表赋予临时名称提高可读性、简化复杂查询
去重DISTINCT【迪斯定特】去除查询结果中的重复行获取唯一值列表
合并UNION / UNION ALL合并多个SELECT语句的结果集组合来自不同查询的数据

别名#

基本语法

-- 列别名
SELECT column_name AS alias_name FROM table_name;
SELECT column_name alias_name FROM table_name; -- 省略AS
-- 表别名
SELECT t.column_name FROM table_name AS t;
SELECT t.column_name FROM table_name t; -- 省略AS

使用场景

  • 简化复杂列名或表达式
  • 提高查询结果的可读性
  • 在多表连接中简化表引用

命令操作如下所示:

//定义别名使用 as 或 空格
mysql> select【涩莱克特】 name,homedir from【弗乱】 moershi.user;
+-----------------+--------------------+
| name | homedir |
+-----------------+--------------------+
| root | /root |
| bin | /bin |
| daemon | /sbin |
| adm | /var/adm |
| lp | /var/spool/lpd |
| sync | /sbin |
| shutdown | /sbin |
| halt | /sbin |
| mail | /var/spool/mail |
| operator | /root |
| games | /usr/games |
| ftp | /var/ftp |
| nobody | / |
| systemd-network | / |
| dbus | / |
| polkitd | / |
| sshd | /var/empty/sshd |
| postfix | /var/spool/postfix |
| chrony | /var/lib/chrony |
| rpc | /var/lib/rpcbind |
| rpcuser | /var/lib/nfs |
| nfsnobody | /var/lib/nfs |
| haproxy | /var/lib/haproxy |
| plj | /home/plj |
| apache | /usr/share/httpd |
| mysql | /var/lib/mysql |
| bob | NULL |
+-----------------+--------------------+
27 rows in set (0.00 sec)
mysql> select【涩莱克特】 name as 用户名,homedir 家目录 from【弗乱】 moershi.user;
+-----------------+--------------------+
| 用户名 | 家目录 |
+-----------------+--------------------+
| root | /root |
| bin | /bin |
| daemon | /sbin |
| adm | /var/adm |
| lp | /var/spool/lpd |
| sync | /sbin |
| shutdown | /sbin |
| halt | /sbin |
| mail | /var/spool/mail |
| operator | /root |
| games | /usr/games |
| ftp | /var/ftp |
| nobody | / |
| systemd-network | / |
| dbus | / |
| polkitd | / |
| sshd | /var/empty/sshd |
| postfix | /var/spool/postfix |
| chrony | /var/lib/chrony |
| rpc | /var/lib/rpcbind |
| rpcuser | /var/lib/nfs |
| nfsnobody | /var/lib/nfs |
| haproxy | /var/lib/haproxy |
| plj | /home/plj |
| apache | /usr/share/httpd |
| mysql | /var/lib/mysql |
| bob | NULL |
+-----------------+--------------------+
27 rows in set (0.00 sec)

合并#

SQL 两种“合并”操作对比表

特性CONCAT() (字符串拼接)UNION / UNION ALL (结果集合并)
操作对象列内的数据(字符串、文本)查询结果集(行)
操作方向水平合并(将多个列的值拼接到一行里)垂直合并(将多个查询的结果上下堆叠)
目的生成新的格式化字符串组合来自不同查询的数据
语法示例SELECT CONCAT(first_name, ' ', last_name) FROM users;SELECT name FROM table1 UNION SELECT name FROM table2;
结果图示
输入: John Doe
输出: John Doe

输入:
查询1结果: John
查询2结果: Jane
输出:
John
Jane
1、 CONCAT() - 字符串拼接函数(横向合并)#

CONCAT() 用于将多个字符串字段或值连接成一个字符串。它是在单条记录内进行操作。 基本语法:

CONCAT(string1, string2, ..., stringN)
//拼接 concat【康(白话)凯特】()
mysql> select【涩莱克特】 concat【康(白话)凯特】(name,"-",uid) as 用户信息 from【弗乱】 moershi.user where【威尔】 uid <= 5;
+--------------+
| 用户信息 |
+--------------+
| root-0 |
| bin-1 |
| daemon-2 |
| adm-3 |
| lp-4 |
| sync-5 |
+--------------+
6 rows in set (0.00 sec)
//2列拼接
mysql> select【涩莱克特】 concat【康(白话)凯特】(name,"-",uid) as 用户信息 from【弗乱】 moershi.user where【威尔】 uid <= 5;
+--------------+
| 用户信息 |
+--------------+
| root-0 |
| bin-1 |
| daemon-2 |
| adm-3 |
| lp-4 |
| sync-5 |
+--------------+
6 rows in set (0.00 sec)
//多列拼接
mysql> select【涩莱克特】 concat【康(白话)凯特】(name,"-",uid ,"-",gid) as 用户信息 from【弗乱】 moershi.user where【威尔】 uid <= 5;
+--------------+
| 用户信息 |
+--------------+
| root-0-0 |
| bin-1-1 |
| daemon-2-2 |
| adm-3-4 |
| lp-4-7 |
| sync-5-0 |
+--------------+
2. UNION / UNION ALL - 结果集操作符(纵向合并)#

UNION 用于将两个或多个 SELECT 语句的结果集合并为一个结果集。它是在记录之间进行操作。

基本语法:

SELECT column1, column2 FROM table1
UNION [ALL]
SELECT column1, column2 FROM table2;
//把moershi.user表和moershi.departments的name数据纵向合并
mysql> select name from moershi.user union select dept_name from moershi.departments;
+-----------------+
| name |
+-----------------+
| root |
| bin |
| daemon |
| adm |
| lp |
| sync |
| shutdown |
| halt |
| mail |
| operator |
| games |
| ftp |
| nobody |
| systemd-network |
| dbus |
| polkitd |
| sshd |
| postfix |
| chrony |
| rpc |
| rpcuser |
| nfsnobody |
| haproxy |
| plj |
| apache |
| mysql |
| bob |
| 人事部 |
| 财务部 |
| 运维部 |
| 开发部 |
| 测试部 |
| 市场部 |
| 销售部 |
| 法务部 |
+-----------------+
35 rows in set (0.00 sec)
//多列纵向合并
mysql> select id,name from moershi.user union select dept_id,dept_name from moershi.departments;
+----+-----------------+
| id | name |
+----+-----------------+
| 1 | root |
| 2 | bin |
| 3 | daemon |
| 4 | adm |
| 5 | lp |
| 6 | sync |
| 7 | shutdown |
| 8 | halt |
| 9 | mail |
| 10 | operator |
| 11 | games |
| 12 | ftp |
| 13 | nobody |
| 14 | systemd-network |
| 15 | dbus |
| 16 | polkitd |
| 17 | sshd |
| 18 | postfix |
| 19 | chrony |
| 20 | rpc |
| 21 | rpcuser |
| 22 | nfsnobody |
| 23 | haproxy |
| 24 | plj |
| 25 | apache |
| 26 | mysql |
| 27 | bob |
| 1 | 人事部 |
| 2 | 财务部 |
| 3 | 运维部 |
| 4 | 开发部 |
| 5 | 测试部 |
| 6 | 市场部 |
| 7 | 销售部 |
| 8 | 法务部 |
+----+-----------------+
35 rows in set (0.00 sec)

2. 去重#

去重显示 distinct【迪斯定特】 字段名列表 基本语法

SELECT DISTINCT【迪斯定特】 column1, column2 FROM table_name;

使用场景

  • 获取某列的唯一值列表
  • 统计不重复的记录数量
  • 避免重复数据影响分析结果
//去重前输出
mysql> select【涩莱克特】 shell from【弗乱】 moershi.user where【威尔】 shell in ("/bin/bash","/sbin/nologin") ;
+---------------+
| shell |
+---------------+
| /bin/bash |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /sbin/nologin |
| /bin/bash |
| /sbin/nologin |
+---------------+
22 rows in set (0.00 sec)
//去重后查看
mysql> select【涩莱克特】 distinct【迪斯定特】 shell from【弗乱】 moershi.user where【威尔】 shell in ("/bin/bash","/sbin/nologin") ;
+---------------+
| shell |
+---------------+
| /bin/bash |
| /sbin/nologin |
+---------------+
2 rows in set (0.01 sec)
mysql>

六、作业#

1. 选择题#

  1. MySQL 中,预设的拥有最高权限的超级用户的用户名为( D ) A. test B. administrator C. DBA D. root

  2. 实现将 root 用户的密码修改为“123456”的语句,正确的是( A ) A. ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘123456’; B. ALTER USER ‘root’@‘localhost’ IDENTIFIED BY 123456; C. ALTER USER ‘root’@‘localhost’ =‘123456’; D. SET USER ‘root’@‘localhost’ =‘123456’;

  3. 要启动 MySQL 服务,在 Linux 系统下可以使用的命令是(C ) A. service mysql start B. systemctl start mysql C. both A and B D. mysql -u root -p

  4. moershi.user 表中,查询 id 大于 10 的记录,正确的 SQL 语句是( A ) A. select * FROM moershi.user where id > 10; B. select * FROM user where id > 10; C. select * FROM moershi.user where id >= 10; D. select * FROM user where id >= 10;

  5. moershi.user 表中,查询 uid 在 100 到 200 之间的记录,使用的关键字是( A ) A. BETWEEN B. IN C. LIKE D. AND

  6. moershi.user 表中,查询 name 以“a”开头的记录,SQL 语句是( A ) A. select * FROM moershi.user where name LIKE ‘a%’; B. select * FROM moershi.user where name LIKE ‘%a’; C. select * FROM moershi.user where name LIKE ‘%a%’; D. select * FROM moershi.user where name = ‘a’;

  7. moershi.user 表中,查询 id 大于 10 并且 gid 小于 20 的记录,使用的逻辑运算符是(B ) A. OR B. AND C. NOT D. XOR

  8. moershi.user 表中,查询 password 字段不为空的记录,SQL 语句是( A ) A. select * FROM moershi.user where password IS NOT NULL ; B. select * FROM moershi.user where password = ”; C. select * FROM moershi.user where password IS NULL ; D. select * FROM moershi.user where password != ”;

  9. moershi.user 表中,查询 name 字段并给它起别名 user_name,SQL 语句是( A ) A. select name AS user_name FROM moershi.user; B. select user_name FROM moershi.user; C. select name = user_name FROM moershi.user; D. select user_name = name FROM moershi.user;

  10. moershi.user 表中,查询 id 字段并去除重复值,使用的关键字是( B ) A. UNIQUE B. DISTINCT C. GROUP BY D. ORDER BY

2 简答题#

1. 简述 MySQL 密码管理的重要性以及常见的密码管理操作有哪些?#

​重要性:​​
安全性保障:防止未授权访问,保护敏感数据
权限控制:确保只有授权用户才能执行数据库操作
审计追踪:便于跟踪数据库访问和操作记录
合规要求:满足数据安全法规和行业标准
​​常见的密码管理操作:​​
设置/修改用户密码:ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
密码过期策略:ALTER USER 'username'@'host' PASSWORD EXPIRE;
密码复杂度要求:通过 validate_password 组件设置密码策略
密码加密存储:MySQL 使用加密算法存储密码
重置忘记的密码:通过安全模式启动 MySQL 重置密码
查看用户权限:SHOW GRANTS FOR 'username'@'host';

2. 说明 MySQL 服务管理包含哪些方面,以及如何在 Linux 系统下停止和重启 MySQL 服务?#

MySQL 服务管理包含的方面:​​
服务启动和停止
服务状态监控
服务自动启动配置
日志文件管理
配置文件管理
性能调优和监控
### 1. 服务启动和停止
- **启动 MySQL 服务**:
```bash
systemctl start mysqld
# 或使用 service 命令(适用于旧版系统)
service mysqld start
  • 停止 MySQL 服务

    Terminal window
    systemctl stop mysqld
    service mysqld stop
  • 重启 MySQL 服务(常用于配置更改后):

    Terminal window
    systemctl restart mysqld
    service mysqld restart
  • 重新加载配置(不重启服务):

    Terminal window
    systemctl reload mysqld
    # 或通过 MySQL 内部命令
    mysqladmin -u root -p reload

2. 服务状态监控#

  • 检查服务状态

    Terminal window
    systemctl status mysqld
    service mysqld status
  • 检查 MySQL 进程是否运行

    Terminal window
    ps aux | grep mysqld
  • 检查 MySQL 端口监听(默认 3306):

    Terminal window
    netstat -tlnp | grep 3306
    # 或使用 ss 命令
    ss -tlnp | grep 3306
  • 检查 MySQL 连接状态(使用 MySQL 客户端):

    Terminal window
    mysqladmin -u root -p status
    # 或进入 MySQL 后执行
    SHOW STATUS;
    SHOW PROCESSLIST;

3. 服务自动启动配置#

  • 启用开机自动启动

    Terminal window
    systemctl enable mysqld
    chkconfig mysqld on # 适用于 SysVinit 系统
  • 禁用开机自动启动

    Terminal window
    systemctl disable mysqld
    chkconfig mysqld off # 适用于 SysVinit 系统
  • 查看自动启动状态

    Terminal window
    systemctl is-enabled mysqld
    chkconfig --list mysqld # 适用于 SysVinit 系统

4. 日志文件管理#

MySQL 有多种日志类型,如错误日志、查询日志、慢查询日志等。日志位置通常在 /var/log/mysql//var/log/ 目录下,具体路径取决于配置文件。

  • 查看错误日志

    Terminal window
    tail -f /var/log/mysql/error.log
    # 如果路径不同,请检查配置文件 my.cnf 中的 log_error 设置
  • 查看通用查询日志

    Terminal window
    tail -f /var/log/mysql/mysql.log
  • 查看慢查询日志

    Terminal window
    tail -f /var/log/mysql/slow.log
  • 动态启用/禁用日志(需要在 MySQL 配置文件中设置,然后重启或重新加载服务):

    -- 在 MySQL 客户端中设置(临时生效)
    SET GLOBAL general_log = 'ON';
    SET GLOBAL slow_query_log = 'ON';
  • 日志轮转(使用 logrotate): 通常 MySQL 日志由 logrotate 管理,配置文件在 /etc/logrotate.d/mysql。手动轮转:

    Terminal window
    logrotate -f /etc/logrotate.d/mysql

5. 配置文件管理#

MySQL 配置文件通常是 /etc/my.cnf/etc/mysql/my.cnf,也可能包含在 /etc/mysql/conf.d/ 目录下。

  • 编辑配置文件

    Terminal window
    sudo nano /etc/my.cnf
    # 或使用其他编辑器
  • 检查配置文件语法

    Terminal window
    mysqld --verbose --help | grep -A1 -B1 "Default options"
    # 或使用
    mysqld --validate-config
  • 应用配置更改

    Terminal window
    # 重新加载配置(不重启服务)
    systemctl reload mysqld
    # 或重启服务
    systemctl restart mysqld

6. 性能调优和监控#

  • 监控实时性能

    Terminal window
    # 使用 mysqladmin 查看状态
    mysqladmin -u root -p extended-status
    # 或进入 MySQL 后执行
    SHOW GLOBAL STATUS;
    SHOW ENGINE INNODB STATUS;
  • 检查变量设置

    Terminal window
    mysql -u root -p -e "SHOW VARIABLES;"
    # 或特定变量
    mysql -u root -p -e "SHOW VARIABLES LIKE '%buffer%';"
  • 性能分析工具

    • mysqltuner:一个常用的脚本,用于分析配置和提供建议。
      Terminal window
      wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
      perl mysqltuner.pl --user root --pass
    • pt-query-digest:分析慢查询日志。
      Terminal window
      pt-query-digest /var/log/mysql/slow.log
    • mysqlslap:负载测试工具。
      Terminal window
      mysqlslap -u root -p --concurrency=50 --iterations=100 --auto-generate-sql
  • 优化表(定期维护):

    OPTIMIZE TABLE table_name;
    # 或使用 mysqlcheck
    mysqlcheck -u root -p --optimize --all-databases

附加提示#

  • 确保使用具有适当权限的 MySQL 用户(如 root)执行命令。
  • 对于生产环境,建议定期备份和监控。
  • 如果使用 Docker 或其他容器化部署,命令可能有所不同。

如果您有特定场景或问题,可以提供更多细节,我可以给出更具体的指导。

#### 3. 请解释 SQL 中的数值比较、范围匹配、模糊匹配、逻辑比较、字符比较/空/非空、别名/去重/合并的概念,并各举一个在 `moershi.user` 表中的应用示例。

数值比较​​:使用比较运算符(=, <>, <, >, <=, >=)比较数值 示例:SELECT * FROM moershi.user WHERE uid > 1000; ​​范围匹配​​:使用 BETWEEN 关键字匹配某个范围内的值 示例:SELECT * FROM moershi.user WHERE id BETWEEN 10 AND 20; ​​模糊匹配​​:使用 LIKE 关键字和通配符(%, _)进行模式匹配 示例:SELECT * FROM moershi.user WHERE name LIKE ‘a%’; ​​逻辑比较​​:使用逻辑运算符(AND, OR, NOT)组合多个条件 示例:SELECT * FROM moershi.user WHERE name = ‘root’ AND uid = 0; ​​字符比较/空/非空​​:比较字符串值或检查字段是否为 NULL 字符比较示例:SELECT * FROM moershi.user WHERE name = ‘root’; 空/非空示例:SELECT * FROM moershi.user WHERE homedir IS NOT NULL; ​​别名/去重/合并​​: 别名:使用 AS 关键字为列或表指定临时名称 示例:SELECT name AS username, homedir AS home_directory FROM moershi.user; 去重:使用 DISTINCT 关键字去除查询结果中的重复行 示例:SELECT DISTINCT shell FROM moershi.user; 合并:使用 UNION 或 UNION ALL 合并多个查询的结果集 示例:SELECT name FROM moershi.user UNION SELECT dept_name FROM moershi.departments;

### 3 操作题
#### 1.创建一个新的 MySQL 用户 `test_user`,密码为 `test_password`,并授予该用户对 `moershi.user` 表的查询权限。
```sql
mysql> create user if not exists 'test_user'@'%' identified by 'test_password';
Query OK, 0 rows affected (0.21 sec)
mysql> GRANT SELECT ON moershi.user TO 'test_user'@'%';
Query OK, 0 rows affected (0.16 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.05 sec)

2.请编写 SQL 语句,在 moershi.user 表中查询 id 大于 5 且 name 以“r”开头的记录。#

mysql> select id,name from moershi.user where id > 5 and name like "r%";
+----+---------+
| id | name |
+----+---------+
| 20 | rpc |
| 21 | rpcuser |
+----+---------+
2 rows in set (0.00 sec)

3.编写 SL 语句,将 moershi.user 表中 id 为 1 的记录的 password 字段更新为 new_password#

mysql> select id,name,password from moershi.user where id =1; --查询原始信息
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | root | x |
+----+------+----------+
1 row in set (0.00 sec)
mysql> UPDATE moershi.user SET password = 'new_password' WHERE id = 1; --这个错误表明 password字段的定义长度不足以存储 'new_password'这个值
ERROR 1406 (22001): Data too long for column 'password' at row 1
mysql> DESCRIBE moershi.user; --检查表原始结构信息
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | char(20) | YES | | NULL | |
| password | char(1) | YES | | NULL | |
| uid | int | YES | | NULL | |
| gid | int | YES | | NULL | |
| comment | varchar(50) | YES | | NULL | |
| homedir | varchar(80) | YES | | NULL | |
| shell | char(30) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
8 rows in set (0.01 sec)
mysql> ALTER TABLE moershi.user MODIFY password VARCHAR(50); --修改password结构大小
Query OK, 27 rows affected (2.64 sec)
Records: 27 Duplicates: 0 Warnings: 0
mysql> UPDATE moershi.user SET password = 'new_password' WHERE id = 1; --重新修改id=1的password字段
Query OK, 1 row affected (0.11 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select id,name,password from moershi.user where id =1; --查看修改后的信息
+----+------+--------------+
| id | name | password |
+----+------+--------------+
| 1 | root | new_password |
+----+------+--------------+
1 row in set (0.00 sec)
mysql>

4.编写 SQL 语句,删除 moershi.user 表中 id 小于 3 的记录。#

mysql> select * from moershi.user where id < 3;
+----+------+--------------+------+------+---------+---------+---------------+
| id | name | password | uid | gid | comment | homedir | shell |
+----+------+--------------+------+------+---------+---------+---------------+
| 1 | root | new_password | 0 | 0 | root | /root | /bin/bash |
| 2 | bin | x | 1 | 1 | bin | /bin | /sbin/nologin |
+----+------+--------------+------+------+---------+---------+---------------+
2 rows in set (0.00 sec)
mysql> delete from moershi.user where id < 3;
Query OK, 2 rows affected (0.09 sec)
mysql> select * from moershi.user where id < 3;
Empty set (0.00 sec)

5.编写 SQL 语句,将 moershi.user 表按照 id 字段降序排序,并取前 5 条记录。#

mysql>
mysql> select * from moershi.user order by id desc; --降序全部
+----+-----------------+----------+-------+-------+----------------------------+--------------------+----------------+
| id | name | password | uid | gid | comment | homedir | shell |
+----+-----------------+----------+-------+-------+----------------------------+--------------------+----------------+
| 27 | bob | NULL | NULL | NULL | NULL | NULL | NULL |
| 26 | mysql | x | 27 | 27 | MySQL Server | /var/lib/mysql | /bin/false |
| 25 | apache | x | 48 | 48 | Apache | /usr/share/httpd | /sbin/nologin |
| 24 | plj | x | 1000 | 1000 | | /home/plj | /bin/bash |
| 23 | haproxy | x | 188 | 188 | haproxy | /var/lib/haproxy | /sbin/nologin |
| 22 | nfsnobody | x | 65534 | 65534 | Anonymous NFS User | /var/lib/nfs | /sbin/nologin |
| 21 | rpcuser | x | 29 | 29 | RPC Service User | /var/lib/nfs | /sbin/nologin |
| 20 | rpc | x | 32 | 32 | Rpcbind Daemon | /var/lib/rpcbind | /sbin/nologin |
| 19 | chrony | x | 998 | 996 | | /var/lib/chrony | /sbin/nologin |
| 18 | postfix | x | 89 | 89 | | /var/spool/postfix | /sbin/nologin |
| 17 | sshd | x | 74 | 74 | Privilege-separated SSH | /var/empty/sshd | /sbin/nologin |
| 16 | polkitd | x | 999 | 998 | User for polkitd | / | /sbin/nologin |
| 15 | dbus | x | 81 | 81 | System message bus | / | /sbin/nologin |
| 14 | systemd-network | x | 192 | 192 | systemd Network Management | / | /sbin/nologin |
| 13 | nobody | x | 99 | 99 | Nobody | / | /sbin/nologin |
| 12 | ftp | x | 14 | 50 | FTP User | /var/ftp | /sbin/nologin |
| 11 | games | x | 12 | 100 | games | /usr/games | /sbin/nologin |
| 10 | operator | x | 11 | 0 | operator | /root | /sbin/nologin |
| 9 | mail | x | 8 | 12 | mail | /var/spool/mail | /sbin/nologin |
| 8 | halt | x | 7 | 0 | halt | /sbin | /sbin/halt |
| 7 | shutdown | x | 6 | 0 | shutdown | /sbin | /sbin/shutdown |
| 6 | sync | x | 5 | 0 | sync | /sbin | /bin/sync |
| 5 | lp | x | 4 | 7 | lp | /var/spool/lpd | /sbin/nologin |
| 4 | adm | x | 3 | 4 | adm | /var/adm | /sbin/nologin |
| 3 | daemon | x | 2 | 2 | daemon | /sbin | /sbin/nologin |
+----+-----------------+----------+-------+-------+----------------------------+--------------------+----------------+
25 rows in set (0.00 sec)
mysql> select * from moershi.user order by id desc limit 5; --提取降序后的前5
+----+---------+----------+------+------+--------------+------------------+---------------+
| id | name | password | uid | gid | comment | homedir | shell |
+----+---------+----------+------+------+--------------+------------------+---------------+
| 27 | bob | NULL | NULL | NULL | NULL | NULL | NULL |
| 26 | mysql | x | 27 | 27 | MySQL Server | /var/lib/mysql | /bin/false |
| 25 | apache | x | 48 | 48 | Apache | /usr/share/httpd | /sbin/nologin |
| 24 | plj | x | 1000 | 1000 | | /home/plj | /bin/bash |
| 23 | haproxy | x | 188 | 188 | haproxy | /var/lib/haproxy | /sbin/nologin |
+----+---------+----------+------+------+--------------+------------------+---------------+
5 rows in set (0.00 sec)
01:mysql之基础
https://fuwari.vercel.app/posts/数据库/01-mysql之单表查询/
作者
肥猫少杰
发布于
2026-06-03
许可协议
CC BY-NC-SA 4.0