[TOC]
01:mysql之基础
今日工作任务路线图

一、工作场景
咱公司最近业务拓展,新入职了好多员工。HR部门要管理员工信息、部门信息和工资信息,财务部门每月得核算工资,老板也想随时了解各部门的人力成本。之前用 Excel 管理,数据多了又乱又容易出错。现在打算用 MySQL 数据库来管理这些数据。但大家都是小白,得先学会 MySQL 安装、密码管理、图形化软件安装,还得会用单表查询、日期函数、聚集函数、case 函数,才能从员工表、部门表、工资表中获取想要的信息,解决工作中的难题。
二、为什么学mysql数据库
为啥要学这些东西呢?想象一下,要是不会 MySQL 安装,就没办法搭建数据库来管理公司的员工、部门和工资信息,那还不得乱成一锅粥。密码管理也很重要,要是密码泄露,公司的重要数据就可能被坏人拿走,损失可就大了。图形化软件能让操作更简单,就像玩游戏一样轻松。单表查询能让你快速找到需要的数据,日期函数可以处理和日期相关的信息,聚集函数能帮你统计数据,case 函数能根据不同条件输出不同结果。学会这些,工作效率蹭蹭往上涨,升职加薪不是梦!
三、构建mysql服务器
当前任务环节

3.1 安装mysql服务
1)准备1台虚拟机,要求如下:
| IP地址 | 主机名 |
|---|---|
| 192.168.90.50 | mysql50 |
2)配置IP地址和主机名
[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服务软件
[root@mysql50 ~]# yum -y install mysql-server[root@mysql50 ~]# rpm -q mysql-servermysql-server-8.0.41-2.el9_5.x86_64
#启动服务root@mysql50 ~]# systemctl【西斯听头】 start【s 达儿】 mysqld[root@mysql50 ~]# systemctl【西斯听头】 enable【an 内 步】 mysqld4)查看端口
[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/mysqldtcp6 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 连接服务
说明: 数据库管理员本机登陆默认没有密码
[root@mysql50 ~]# mysqlWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection【肯耐申】 id is 8Server 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 itsaffiliates. Other names may be trademarks of their respectiveowners.
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主机做如下练习:
- 设置root密码为moershi
- 修改root密码为123qqq…A
- 破解root密码为NSD123456…a
4.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:设置root密码为moershi
命令操作如下所示:
2行输出是警告而已不用关心
[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 14Server version【沃申】: 8.0.26 Source distributionCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 登陆成功步骤二:修改root密码为123qqq…A
命令操作如下所示:
[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 18Server version【沃申】: 8.0.26 Source distributionCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 登陆成功步骤三:破解root密码为NSD123456…a
说明:在mysql50主机做此练习
命令操作如下所示:
[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 7Server version【沃申】: 8.0.26 Source distributionCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.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: 0Mysql>mysql> exit【诶西特】; 断开连接Bye[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 8Server version【沃申】: 8.0.26 Source distributionCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.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[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 10Server version【沃申】: 8.0.26 Source distributionCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.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.sqlmysql: [Warning] Using a password on the command line interface can be insecure.//连接服务[root@mysql50 ~]# mysql -uroot -pNSD123456...amysql>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 namesYou can turn off this feature to get a quicker startup【s 达 啊普】 with -ADatabase【得塔-贝斯】 changedmysql>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 //在…之间 |
| 操作符 | 语法 | 描述 | 示例 | 返回值说明 |
|---|---|---|---|---|
| IN | column_name IN (value1, value2, ...) | 检查列值是否在指定的值列表中 | SELECT * FROM products WHERE category_id IN (1, 3, 5); | 返回 category_id 为 1、3 或 5 的所有产品 |
| NOT【呐-特】 IN | column_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 的所有员工 |
补充说明
- IN 和 NOT【呐-特】 IN 适用于离散值的匹配,可以用于数字、字符串、日期等数据类型
- BETWEEN【B豚ing】 适用于连续范围的匹配,通常用于数字和日期范围
- BETWEEN【B豚ing】 操作包含边界值,即
BETWEEN【B豚ing】 10 AND 20包含 10 和 20 - 对于日期范围,建议使用标准日期格式(如 ‘YYYY-MM-DD’)以避免歧义
- 这些操作符可以组合使用,并与其他 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表头的值 在 10 到 20 之间即可 包括 10 和 20 本身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 | 括号 () | 括号内的表达式最先计算 |
| 2 | NOT | 逻辑非 |
| 3 | AND | 逻辑与 |
| 4 | OR | 逻辑或 |
命令操作如下所示:
//逻辑非例子,查看解释器不是/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值不在 10 到 20 之间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, unknown | WHERE 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,否则返回 expr2 | SELECT 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ò】,否则返回 expr1 | SELECT 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输出: JohnJane |
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 table1UNION [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. 选择题
-
MySQL 中,预设的拥有最高权限的超级用户的用户名为( D ) A. test B. administrator C. DBA D. root
-
实现将 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’;
-
要启动 MySQL 服务,在 Linux 系统下可以使用的命令是(C ) A. service mysql start B. systemctl start mysql C. both A and B D. mysql -u root -p
-
在
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; -
在
moershi.user表中,查询uid在 100 到 200 之间的记录,使用的关键字是( A ) A. BETWEEN B. IN C. LIKE D. AND -
在
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’; -
在
moershi.user表中,查询id大于 10 并且gid小于 20 的记录,使用的逻辑运算符是(B ) A. OR B. AND C. NOT D. XOR -
在
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 != ”; -
在
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; -
在
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 mysqldservice mysqld stop -
重启 MySQL 服务(常用于配置更改后):
Terminal window systemctl restart mysqldservice mysqld restart -
重新加载配置(不重启服务):
Terminal window systemctl reload mysqld# 或通过 MySQL 内部命令mysqladmin -u root -p reload
2. 服务状态监控
-
检查服务状态:
Terminal window systemctl status mysqldservice 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 mysqldchkconfig mysqld on # 适用于 SysVinit 系统 -
禁用开机自动启动:
Terminal window systemctl disable mysqldchkconfig mysqld off # 适用于 SysVinit 系统 -
查看自动启动状态:
Terminal window systemctl is-enabled mysqldchkconfig --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.plperl 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
- mysqltuner:一个常用的脚本,用于分析配置和提供建议。
-
优化表(定期维护):
OPTIMIZE TABLE table_name;# 或使用 mysqlcheckmysqlcheck -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` 表的查询权限。
```sqlmysql> 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)