零、
帮帮我,\\h,你想让我打电话求救吗?
mysql\\h
如需了解MySQL产品和服务,请访问:
http://www.mysql.com/
有关开发人员信息,包括MySQL 参考手册,请参阅:
http://dev.mysql.com/
要购买MySQL Enterprise 支持、培训或其他产品,请访问:
https://shop.mysql.com/
所有MySQL 命令列表:
请注意,所有文本命令必须位于行的开头,并且必须以“;”结尾。
? (\\?) “帮助”的同义词。
clear (\\c) 清除当前输入语句。
connect (\\r) 重新连接到服务器。可选参数是db 和host。
分隔符(\\d) 设置语句分隔符。
编辑(\\e) 使用$EDITOR 编辑命令。
ego (\\G) 向mysql 服务器发送命令并垂直显示结果。
exit (\\q) 退出mysql。和戒掉一样。
将go (\\g) 命令发送到您的mysql 服务器。
help (\\h) 显示此帮助。
nopager (\\n) 禁用寻呼机并打印到标准输出。
注意(\\t) 不要写入输出文件。
寻呼机(\\P) 设置寻呼机[to_pager]。通过PAGER输出查询结果。
print (\\p) 打印当前命令。
提示符(\\R) 更改mysql 提示符。
退出(\\q) 退出mysql。
rehash (\\#) 重建完成哈希。
source (\\.) 以文件名作为参数执行SQL 脚本文件。
status (\\s) 从服务器获取状态信息。
system (\\!) 执行系统shell 命令。
tee (\\T) 设置输出文件[to_outfile]。将所有内容附加到指定的输出文件。
use (\\u) 使用另一个数据库名称作为参数。
字符集(\\C) 切换到另一个字符集。处理具有多字节字符集的二进制日志时可能需要。
warnings (\\W) 在每个语句后显示警告。
nowarning (\\w) 不要在每个语句后显示警告。
resetconnection(\\x) 清理会话上下文。
要查看服务器端帮助,请键入帮助内容。
\\c 或ctrl+c 清除当前输入
登录mysql。
mysql [-u 用户名] [-h 主机名(或IP)] [-p 密码]
不写-u username 表示以root 身份登录。
不写-h主机名(ip)表示主机是localhost
-p 如果不写密码,则表示密码为空
显示类似“%character%”的变量。 like 相当于Linux 上的grep。
清屏:CTRL+L
一、Mysql格式化输出结果(Linux命令行)
1.使用G按行垂直显示结果
如果该行很长并且需要显示它,那么在Linux 命令行上看到结果会变得非常不愉快。要垂直打印每一行的值,请在SQL 语句或命令后使用G 代替分号。这也是大家最熟悉的MySQL区别于其他数据库工具的特点。
mysql 从db_archivelog\\G 选择*
************************** 1. 行****************** * *********
id: 1
check_day: 2008-06-26
db_name:TBDB1
圆弧尺寸: 137
弧数: 166
: 1.6 每秒
平均时间: 8.7
2.使用pager设置显示方式
如果您选择的结果集跨越多个屏幕,则以前的结果将飞逝而您将无法看到它们。寻呼机允许您在操作系统中设置更多或更少的调用来显示查询结果。这与在操作系统中使用more或less来显示大文件具有相同的效果。
使用more
mysql 分页器详细信息
将寻呼机设置为“更多”
使用less
mysql 无寻呼机
将PAGER 设置为“较少”
还原成stdout
mysqlnopager
将PAGER 设置为标准输出
3.使用tee保存运行结果到文件
命令行的所有结果都可以保存到外部文件(如果不指定文件路径,则默认为mysql命令执行的路径)。如果指定现有文件,结果将附加到该文件。
mysql tee 输出.txt
记录到文件“output.txt”
关闭:
mysql 笔记
输出文件已禁用。
4.执行Linux系统命令
mysql 系统名称
Linux
或者
mysql\\!
Linux
5.执行SQL文件
如果不指定文件路径,则默认在执行mysql命令的路径中搜索文件。
mysql源码测试.sql
+——————-+
| 当前日期() |
+——————-+
| 2008-06-28 |
+——————-+
一组1 行(0.00 秒)
6.以html格式输出结果
mysql客户端参数–html自动将所有SQL查询结果生成为html表代码。
$ mysql -uroot –html
欢迎使用MySQL 监视器。命令以; 或\\g 结尾。
MySQL连接ID为15
服务器版本: 5.7.42 MySQL 社区服务器(GPL)
输入“help;”或“\\h”以获取帮助,或输入“\\c”以清除缓冲区。
7.以xml格式输出结果
如上所述,使用-xml 选项以XML 格式输出结果。
$ mysql -uroot –xml
欢迎使用MySQL 监视器。命令以; 或\\g 结尾。
MySQL连接ID为15
服务器版本: 5.7.42 MySQL 社区服务器(GPL)
输入“help;”或“\\h”以获取帮助,或输入“\\c”以清除缓冲区。
8.修改命令提示符
提示命令允许您在mysql 提示符下显示当前用户、数据库、时间和其他信息。
通过提示设置当前时间显示,因此您可以轻松地在日志文件中看到每个操作的时间。
更改提示符可以通过使用mysql –prompt=\’ \’选项、进入mysql命令行环境后使用prompt命令、或者修改配置文件的方式。
登录的时候设置
mysql -uroot -p –prompt=\’\\u@\\h:[\\d] \\r:\\m:\\s\’
mysql命令行中设置
提示符\\u@\\h:[\\d]\\r:\\m:\\s
配置文件中设置
将[mysql] 部分添加到/etc/my.cnf 配置文件中。
我们建议在配置文件中使用双斜杠。
[mysql]
提示=\\\\u@\\\\h:[\\\\d] \\\\r:\\\\m:\\\\s
\\u:当前连接的用户
\\h:当前连接的主机
\\d:当前连接的数据库
\\r:\\m:\\s:显示当前时间
其他参数请使用man mysql。
源博客
https://blog.csdn.net/qq_36411874/article/details/63251141
二、配置文件
[client] 代表客户端的默认设置。
[mysql]表示使用mysql命令登录mysql数据库时的默认设置。
[mysqld] 代表数据库本身的默认设置。
三、数据库mysql详解
MySQL在安装的时候会自动创建一个名为mysql的数据库,mysql数据库中存放的是用户权限表。当用户登录时,MySQL根据这些权限表的内容授予每个用户相应的权限。
mysql 显示来自mysql 的表。
+————————————————+
| mysql 中的表|
+————————————————+
| 栏目权限|
| 组件|
|数据库|
| 默认角色|
| 发动机成本|
| 特点|
| 一般日志|
| 全球赠款|
|gtid_执行|
| 帮助_类别|
| 帮助_关键字|
| 帮助_关系|
| 帮助主题|
| innodb_index_stats |
| innodb_表_统计|
| 密码历史|
| 插件|
| procs_priv |
| 代理权限|
| 卷边|
| 服务器成本|
| 服务器|
| 从主信息|
| 从机中继日志信息|
| 奴隶工人信息|
| 慢日志|
| 表权限|
| 时区|
| timezone_leap 秒|
| 时区名称|
| 时区转换|
| 时区转换类型|
| 用户|
+————————————————+
33 行组(0.02 秒)
0. 系统默认用户
MySQL版本:8.0.11
从mysql.user 中选择用户、主机、帐户锁定和身份验证字符串。
用户说明
root是MySQL中的一个特权帐户;该用户拥有所有权限,可以执行任何操作。 user1 是您创建的用户。 mysql.sys 用户用于定义sys 模式中的对象。使用mysql.sys 用户可以避免DBA 重命名或删除root 用户时出现的问题。用户被锁定,客户端无法连接。 mysql.session 用户由插件内部使用来访问服务器。用户被锁定,客户端无法连接。 mysql.infoschema是mysql 8版本中添加的新系统用户,但在mysql 5版本中没有。该用户为MySQL数据库系统用户,用于管理和访问系统自身实例information_schema样例。用户被锁定,客户端无法连接。
1. user(全局级别权限)
用户表是MySQL中最重要的权限表,用于记录允许连接服务器的帐户信息。请注意,在用户表上启用的所有权限都是全局的,并且适用于所有数据库。
用户表中的字段大致分为四类:用户列、权限列、安全列和资源控制列。下面主要介绍这些字段的含义。
用户列
用户列存储用户在连接到MySQL 数据库时必须输入的信息。请注意,MySQL 5.7版本不再使用Password作为密码字段,并已将其更改为authentication_string。
MySQL 5.7版本的用户列表如下表所示。
字段名称字段类型是否为空默认值说明Hostchar (60) NO 无主机名Userchar (32) NO 无用户名authentication_stringtextYES 无密码
当用户登录时,如果这三个字段同时匹配,则MySQL数据库系统允许用户登录。当您创建新用户时,这三个字段的值也会被设置。更改用户的密码实际上会更改用户表中的authentication_string字段的值。因此,这三个字段决定了用户是否可以登录。
[笔记]:
在“Host”列中指定用户登录时使用的IP,如user=root Host=192.168.1.1。这意味着root用户只能通过192.168.1.1的客户端访问它。
% 是通配符。 Host=192.168.1.% 表示IP 地址前缀为“192.168.1”的客户端可以连接。 Host=%表示允许所有IP连接。
在mysql 5.7 和mysql 8.0 版本中,% 包括localhost。
权限列
权限列中的字段用于确定用户的权限并描述全局范围内允许对数据和数据库进行的操作。
权限分为两大类:高级管理权限和常规权限。
高级管理权限主要对数据库进行管理,比如关闭服务的能力、超级权限、加载用户的能力等。常规权限主要对数据库进行操作,如查询权限、修改权限等。
users 表中的权限列包括Select_priv、Insert_priv 以及其他以priv 结尾的字段。这些字段值的唯一数据类型是Y 和N。 Y表示该用户有相应的权限。N表示该用户没有相应的权限。出于安全原因,这些字段的默认值为N。
字段名称字段类型为空? 说明Select_privenum(\’N\’,\’Y\’)NON 是否可以通过SELECT 命令查询数据? Insert_privenum(\’N\’,\’Y\’)NON 是否可以使用INSERT 命令插入数据? update_privenum(\’N\’,\’Y\’)NON UPDATE 命令是否可以修改现有数据Delete_privenum(\’N\’,\’Y\’)NON DELETE 命令是否可以删除现有数据Create_privenum(\’N\’ , \’Y\’)NON 可以创建新的数据库和表Drop_privenum(\’N\’,\’Y\’)NON 可以删除现有的数据库和表Reload_privenum(\’N\’,\’Y\’)NON 可以刷新和重新加载可以运行用于MySQL 特定命令的各种内部缓存(日志、权限、主机、查询、表等) Shutdown_privenum(\’N\’,\’Y\’)NON MySQL 服务器是否可以关闭。向root 帐户以外的用户授予此权限时应格外小心。 Process_privenum(\’N\’,\’Y\’)NON 是否可以使用SHOW PROCESSLIST 命令查看其他用户的进程。 File_privenum(\’N\’,\’Y\’) \’) NON 是否可以执行SELECT INTO OUTFILE 和LOAD DATA INFILE 命令Grant_privenum(\’N\’,\’Y\’)NON 是否可以将自己的权限授予其他用户References_privenum( \’N \’,\’Y\’)NON 是否可以创建外键约束Index_privenum(\’N\’,\’Y\’)NON 是否可以添加和删除索引Alter_privenum(\’N\’,\’Y\’)NON 表结构是否可以重命名并修改Show_db_privenum(\’N\’,\’Y\’)NON? Super_privenum(\’N\’,\’Y\’)NON 包括用户有足够访问权限的数据库,检查服务器上所有数据库的名称。管理功能,例如使用KILL 命令删除用户进程、使用SET GLOBAL 命令修改全局MySQL 变量以及运行与复制和日志记录相关的各种命令。 (超级权限) Create_tmp_table_privenum(\’N\’,\’Y\’)NON 是否可以创建临时表Lock_tables_privenum(\’N\’,\’Y\’)NON 是否可以使用LOCK TABLES 命令阻止访问/修改tableExecute_privenum( \’N\’, \’Y\’)NON 可以运行存储过程Repl_slave_privenum(\’N\’,\’Y\’)NON 可以读取用于维护复制数据库环境的二进制日志文件Repl_client_privenum(\’N\’,\’Y\’) 我可以决定非复制吗从服务器和主服务器的位置Create_view_privenum(\’N\’,\’Y\’)可以创建NONI视图吗? Show_view_privenum(\’N\’,\’Y\’)NONI视图可以查看Create_routine_privenum(\’N\’,\’Y\’)NONI可以我更改或销毁存储过程和函数Alter_routine_privenum(\’N\’,\’Y\’)NON 我可以更改或删除存储函数和函数Create_user_privenum(\’N\’,\’Y\’)NON 可以创建新的MySQL 帐户Event_privenum(\’N\’ ,\’Y\’)NON 可以创建、修改或删除事件Trigger_privenum(\’N\’,\’Y\’)NON 可以使用CREATE USER 命令创建和删除触发器Create_tablespace_privenum(\’N\’,\’Y\’)NON 可以表空间被创造?
如果要更改权限,可以使用GRANT语句向用户授予某些权限,或者使用UPDATE语句更新用户表来设置权限。
安全列
安全列主要用于判断用户是否可以成功登录。下表显示了用户表的安全列。
字段名称字段类别为空默认值说明ssl_typeenum(\’ANY\’,\’X509\’,\’SPECIFIED\’)NO 支持SSL 标准加密安全字段ssl_cipherblobNO 支持SSL 标准加密安全字段x509_issuerblobNO 支持x509 标准字段x509_subjectblobNO 支持x509 标准字段pluginchar( 64 )NOmysql_native_password 引入了一个在用户连接时进行密码验证的插件。该插件创建外部/代理用户。密码上次更改。 password_lifetimesmallint(5) unsignedYES 设置密码生存期(以天为单位)。 account_lockedenum(\’N\’,\’Y\’)NON 用户是否被锁定(Y锁定,N解锁)
[笔记]:
即使password_expired为“Y”,用户也可以使用该密码登录MySQL,但无法执行任何操作。标准发行版通常不支持SSL。读者可以使用SHOW VARIABLES LIKE \”have_openssl\” 语句检查他们是否具有ssl 功能。如果have_openssl 的值为DISABLED,则不支持SSL 加密功能。
资源控制列
资源控制列中的字段用于限制用户使用的资源。用户表的资源控制列如下表所示。
字段名称字段类型空默认值说明max_questionsint(11) unsignedNO0 指定每小时允许的查询操作数。 max_updatesint(11) unsignedNO0 指定每小时允许的更新操作数。 max_connectionsint(11) unsignedNO0 指定每小时允许的连接数操作数max_user_connectionsint(11) unsignedNO0 指定可以同时建立的连接数。
上述字段的默认值为0,表示没有限制。如果一个用户在一小时内的查询或连接数超过了资源控制限制,该用户将被锁定,直到下一小时才能在此执行相应的操作。可以使用GRANT语句更新这些字段的值。
2. db(数据库级别权限)
db表是MySQL数据库中常用且非常重要的权限表,它存储了用户对特定数据库的操作权限。表中的字段大致可分为两类:用户列和权限列。
用户列
db表中的user列有三个字段:Host、User、Db,标识从特定主机连接到特定数据库的用户的操作权限。这三个字段的组合构成了数据库的主键。数据库表。
db表的user列如下表所示。
字段名称字段类型是否为空默认值说明Hostchar (60) NO 无主机名Dbchar (64) NO 无数据库名称Us
erchar(32)NO无用户名
权限列
db 表中的权限列和 user 表中的权限列大致相同,只是user 表中的权限是针对所有数据库的,而 db 表中的权限只针对指定的数据库。如果希望用户只对某个数据库有操作权限,可以先将 user 表中对应的权限设置为 N,然后在 db 表中设置对应数据库的操作权限。
3. tables_priv(表级别权限)
tables_priv 表用来对单个表进行权限设置。
tables_priv 表结构如下表所示:
字段名字段类型是否为空默认值说明Hostchar(60)NO无主机Dbchar(64)NO无数据库名Userchar(32)NO无用户名Table_namechar(64)NO无表名Grantorchar(93)NO无修改该记录的用户TimestamptimestampNOCURRENT_TIMESTAMP修改该记录的时间Table_privset(‘Select’,‘Insert’,‘Update’,‘Delete’,’ Create’,‘Drop’,‘Grant’,‘References’, ‘Index’,‘Alter’,‘Create View’,‘Show view’,‘Trigger’)NO无表示对表的操作权限,包括 Select、Insert、Update、Delete、Create、Drop、Grant、References、Index 和 Alter 等Column_privset(‘Select’,‘Insert’,‘Update’, ‘References’)NO无表示对表中的列的操作权限,包括 Select、Insert、Update 和 References
4. columns_priv(列级别的权限)
columns_priv 表用来对单个数据列进行权限设置
字段名字段类型是否为空默认值说明Hostchar(60)NO无主机Dbchar(64)NO无数据库名Userchar(32)NO无用户名Table_namechar(64)NO无表名Column_namechar(64)NO无数据列名称,用来指定对哪些数据列具有操作权限TimestamptimestampNOCURRENT_TIMESTAMP修改该记录的时间Column_privset(‘Select’,’ Insert’,‘Update’,‘References’)NO无表示对表中的列的操作权限,包括 Select、Insert、Update 和 References
5. procs_priv (存储过程和函数的权限)
procs_priv 表可以对存储过程和存储函数进行权限设置,procs_priv 的表结构如表所示:
字段名字段类型是否为空默认值说明Hostchar(60)NO无主机名Dbchar(64)NO无数据库名Userchar(32)NO无用户名Routine_namechar(64)NO无表示存储过程或函数的名称Routine_typeenum(‘FUNCTION’, ‘PROCEDURE’)NO无表示存储过程或函数的类型,Routine_type 字段有两个值,分别是 FUNCTION 和 PROCEDURE。FUNCTION 表示这是一个函数;PROCEDURE 表示这是一个 存储过程。Grantorchar(93)NO无插入或修改该记录的用户Proc_privset(‘Execute’,‘Alter Routine’,‘Grant’)NO无表示拥有的权限,包括 Execute、Alter Routine、Grant 3种TimestamptimestampNOCURRENT_TIMESTAMP表示记录更新时间
源博客
http://c.biancheng.net/view/7249.html
http://c.biancheng.net/view/7253.html
四、sys数据库
https://blog.csdn.net/chenshm/article/details/120519044
1. session
在MySQL 5.6以前,我们通过show processlist\\G命令查看系统中正在运行的所有进程:
mysql> show processlist;
+—-+——+———–+——-+———+——+———-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+—-+——+———–+——-+———+——+———-+——————+
| 6 | root | localhost | mysql | Query | 0 | starting | show processlist |
+—-+——+———–+——-+———+——+———-+——————+
1 row in set (0.00 sec)
从5.7开始,我们又可以通过select * from sys.session来查看系统正在运行的所有进程,而且该表中的记录相processlist比较完善:
mysql> select * from sys.session\\G
*************************** 1. row ***************************
thd_id: 31
conn_id: 6
user: NULL
db: mysql
command: Query
state: Sending data
time: 0
current_statement: select * from sys.session
statement_latency: 1.79 ms
progress: NULL
lock_latency: 0 ps
rows_examined: 0
rows_sent: 0
rows_affected: 0
tmp_tables: 4
tmp_disk_tables: 1
full_scan: YES
last_statement: NULL
last_statement_latency: NULL
current_memory: 0 bytes
last_wait: NULL
last_wait_latency: NULL
source: NULL
trx_latency: NULL
trx_state: NULL
trx_autocommit: NULL
pid: 4612
program_name: mysql
1 row in set (0.06 sec)
源博客
https://www.jianshu.com/p/427cac0d8763
三、DCL(Data Control Language)
数据控制语言,用来创建数据库用户,控制数据库的访问权限
0. 系统状态查看
查看当前登录用户的状态status
mysql> status
————–
mysql Ver 8.0.11 for macos10.13 on x86_64 (MySQL Community Server – GPL)
Connection id: 790
Current database: myweb_db
Current user: root@localhost
SSL: Not in use
Current pager: less
Using outfile: \’\’
Using delimiter: ;
Server version: 8.0.11 MySQL Community Server – GPL
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /tmp/mysql.sock
Uptime: 60 days 53 min 36 sec
Threads: 25 Questions: 10957 Slow queries: 0 Opens: 578 Flush tables: 2 Open tables: 525 Queries per second avg: 0.002
————–
[注]:
使用命令mysql -u用户名 -hlocalhost -p登录时,连接方式是Connection: Localhost via UNIX socket
使用命令mysql -u用户名 -h ip -p登录时连接方式是Connection: xxx.xxx.xxx.xxx via TCP/IP
1. 管理用户
查询用户
select * from mysql.user;
创建用户
#create user \’用户名\’@\’主机名\’ identified by \’密码\’;
mysql> create user \’user1\’@\’localhost\’ identified by \’123456\’;
Query OK, 0 rows affected (0.08 sec)
[注]:
主机名可以使用%通配,Host=%,表示所有IP都有连接此数据库。mysql 5.7和mysql 8.0版本中,%包含localhost。
修改用户密码
方法1:alter命令
#alter user \’用户名\’@\’主机名\’ identified with mysql_native_password by \’新密码\’;
mysql> alter user \’user1\’@\’localhost\’ identified with mysql_native_password by \’1234abcd\’;
Query OK, 0 rows affected (0.03 sec)
~ ᐅ mysql -uuser1 -p123456 #登录失败
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user \’user1\’@\’localhost\’ (using password: YES)
~ ᐅ mysql -uuser1 -p1234abcd #登录成功
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 776
Server version: 8.0.11 MySQL Community Server – GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
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.
方法2:set password命令
set password for \’用户名\’@\’主机名\’=\’新密码\’;
set password for \’root\’@\’localhost\’=\’123\’;
方法3:update直接编辑mysql.user表
update mysql.user set authentication_string=password(\’新密码\’) where user=\’用户名\’ and Host =\’主机名\’;
flush privileges;
update mysql.user set authentication_string=password(\’12344321\’) where user=\’root\’ and Host =\’localhost\’;
flush privileges;
方法4:无需登录mysql,直接使用mysqladmin命令修改密码
mysqladmin -u用户名 -p旧密码 password 新密码
#-u用户名 -p旧密码是整体,不要写成-u 用户名 -p 旧密码,-u 和 root 间可以加空格,但是会有警告出现,所以就不要加空格了。
删除用户
#drop user \’用户名\’@\’主机名\’;
mysql> drop user \’user1\’@\’localhost\’;
Query OK, 0 rows affected (0.06 sec)
2. 权限控制
常用的权限
权限说明all,all privileges所有权限select查询数据insert插入数据update修改数据delete删除数据alter修改表drop删除数据库/表/视图create创建数据库/表
查询权限
#show grants for \’用户名\’@\’主机名\’;
mysql> show grants for \’user1\’@\’localhost\’;
+——————————————-+
| Grants for user1@localhost |
+——————————————-+
| GRANT USAGE ON *.* TO `user1`@`localhost` |
+——————————————-+
1 row in set (0.00 sec)
授予权限
#grant 权限列表 on 数据库名.表名 to \’用户名\’@\’主机名\’;
#赋予\’user1\’@\’localhost\’对所有数据库所有表的创建和查询权限
mysql> grant create,select on *.* to \’user1\’@\’localhost\’;
Query OK, 0 rows affected (0.10 sec)
mysql> FLUSH PRIVILEGES; #刷新权限
Query OK, 0 rows affected (0.01 sec)
mysql> show grants for \’user1\’@\’localhost\’; #查询权限
+—————————————————-+
| Grants for user1@localhost |
+—————————————————-+
| GRANT SELECT, CREATE ON *.* TO `user1`@`localhost` |
+—————————————————-+
1 row in set (0.00 sec)
刷新权限
MySQL权限刷新是指在MySQL中重新加载授权表,使修改后的用户权限生效。FLUSH命令可以刷新MySQL的各种缓存,包括授权表缓存。
FLUSH PRIVILEGES;
[注]:
MySQL权限刷新注意事项:
刷新权限需要以root用户登录MySQL数据库。刷新权限可能会影响MySQL的性能,建议在低峰期进行操作。刷新权限后,所有修改的用户权限都会生效,包括新增用户和修改已有用户的权限。
撤销权限
#revoke 权限列表 on 数据库名.表名 from \’用户名\’@\’主机名\’;
mysql> revoke create on *.* from \’user1\’@\’localhost\’;
Query OK, 0 rows affected (0.01 sec)
mysql> show grants for \’user1\’@\’localhost\’;
+——————————————–+
| Grants for user1@localhost |
+——————————————–+
| GRANT SELECT ON *.* TO `user1`@`localhost` |
+——————————————–+
1 row in set (0.00 sec)
[注]:
多个权限之间,使用逗号分割授权时,数据库名和表名可以使用 * 进行通配,代表所有
四、DDL(Data Definition Language)
数据定义语言,用来定义数据库对象(数据库,表,字段)
0. show命令
show tables或show tables from database_name; — 显示当前数据库中所有表的名称。
show databases; — 显示mysql中所有数据库的名称。
show columns from table_name from database_name; 或show columns from database_name.table_name; — 显示表中列名称。
show grants for user_name; — 显示一个用户的权限,显示结果类似于grant 命令。
show index from table_name; — 显示表的索引。
show status; — 显示一些系统特定资源的信息,例如,正在运行的线程数量。
show variables; — 显示系统变量的名称和值。
show processlist; — 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。
show table status; — 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。
show privileges; — 显示服务器所支持的不同权限。
show create database database_name; — 显示create database 语句是否能够创建指定的数据库。
show create table table_name; — 显示create database 语句是否能够创建指定的数据库。
show engies; — 显示安装以后可用的存储引擎和默认引擎。
show innodb status; — 显示innoDB存储引擎的状态。
show logs; — 显示BDB存储引擎的日志。
show warnings; — 显示最后一个执行的语句所产生的错误、警告和通知。
show errors; — 只显示最后一个执行语句所产生的错误。
show [storage] engines; –显示安装后的可用存储引擎和默认引擎。
1. 查询
查询mysql版本
select version();
mysql> select version();
+———–+
| version() |
+———–+
| 8.0.11 |
+———–+
1 row in set (0.00 sec)
查询所有数据库
show databases;
查询当前正在使用的数据库
select database();
查询当前数据库中的表
show tables;
查询指定数据库中的表
show tables from 数据库名;
mysql> show tables from myweb_db;
+——————–+
| Tables_in_myweb_db |
+——————–+
| emp |
| user |
+——————–+
2 rows in set (0.00 sec)
查询指定表中的所有字段
show columns from 表名 from 数据库名;
或
show columns from 数据库名.表名;
mysql> show columns from myweb_db.user;
查看指定数据库的字符集
show create database 数据库名;
mysql> show create database myweb_db;
+———-+————————————————————————————————-+
| Database | Create Database |
+———-+————————————————————————————————-+
| myweb_db | CREATE DATABASE `myweb_db` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ |
+———-+————————————————————————————————-+
1 row in set (0.00 sec)
查询表的字符集
方法1
show create table 表名;
mysql> show create table user;
| Table | Create Table | user | CREATE TABLE `user` (
`id` bigint(255) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`password` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`age` tinyint(3) unsigned DEFAULT NULL,
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`nickname` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`is_delete` tinyint(1) unsigned DEFAULT \’0\’ COMMENT \’逻辑删除,0表示不删除,1表示删除,默认值为0\\n\’,
`is_enable` tinyint(1) unsigned DEFAULT \’1\’ COMMENT \’该用户是否可用,1表示可用,0表示不可用。默认值为1\’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
方法2
show table status from myweb_db like \’表名\’;
mysql> show table status from myweb_db like \’user\’\\G
*************************** 1. row ***************************
Name: user
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 5
Avg_row_length: 3276
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 9
Create_time: 2023-04-30 14:53:02
Update_time: 2023-05-05 22:41:41
Check_time: NULL
Collation: utf8mb4_unicode_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
查询表中列的属性
show full columns from 表名;
2. 创建
创建数据库
create database [if not exists] 数据库名 [default charset 字符集][collate 排序规则];
[注]:
中括号里的可加可不加,具体情况而定第一个是如果不存在相同名称的数据库则创建第二个是设置字符的字符集和排序规则
创建表
create table 表名 (
字段1 字段1类型[comment 字段1注释],
字段2 字段2类型[comment 字段2注释],
字段3 字段3类型[comment 字段3注释],
……
字段n 字段n类型[comment 字段n注释]
)[comment 表注释];
create table if not exists t1 (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT \’id\’,
name VARCHAR(10) COMMENT \’名字\’,
age TINYINT UNSIGNED COMMENT \’性别\’,
create_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \’创建日期\’,
update_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT \’更新日期\’,
is_delete TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT \’是否逻辑删除,0表示未删除,1表示已删除\’,
PRIMARY KEY(id)
)comment \’测试用表\’ ENGINE INNODB DEFAULT CHARSET=utf8;
[注]:
DEFAULT CURRENT_TIMESTAMP表示当新增记录的时候,MySQL自动将系统的当前时间 set 到create_date和更新时间这两个字段中。设置联合主键primary key(列1,列2,…)设置联合主键的原因是列1和列2都有可能存在重复数据,而列1,列2,…构成的联合主键必须是唯一的,例如在成绩表中设置学生id和课程id为联合主键,因为一个学生可以选择多门课,一门课也可以被多个学生选,所以学生id和课程id均有可能重复,但是学生id+课程id是唯一的,所以设置学生id和课程id为联合主键。
3. 使用
使用数据库
use 数据库名;
使用表的语句是select
4. 删除
删除数据库
drop database [if exists] 数据库名;
删除表
drop table [if exists] 表名;
格式化表
删除指定表,并重新创建该表(俗称格式化),即清空表中的数据,保留列
truncate table 表名;
5. 修改
修改数据库字符集和排序规则
alter database 数据库名 [character set \’字符集\’] [collate \’排序规则\’];
[注]:
修改完数据库字符集,需要重启mysql数据库。
修改表字符集和排序规则
ALTER TABLE 表名 [DEFAULT CHARACTER SET \’字符集\’] [COLLATE \’排序规则\’];
修改表指定列的字符集
ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型 [CHARACTER SET \’字符集\’] [COLLATE \’排序规则\’];
#实例
ALTER TABLE t1 MODIFY COLUMN name VARCHAR(10) CHARACTER SET \’utf8mb4\’ COLLATE \’utf8mb4_0900_ai_ci\’;
[注]:
在执行命令时,如果表格中已存在数据,修改字符集可能会导致某些数据无法正确存储。因此,在修改字符集之前,先备份好数据,以便于后续恢复数据。
修改表名
alter table 表名 rename to 新表名;
表添加字段
alter table 表名 add 字段名 类型(长度) [comment 注释][约束];
修改表字段的数据类型
alter table 表名 modify 字段名 新数据类型(长度);
修改表字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度)[comment 注释][约束];
删除表的字段
alter table 表名 drop 字段名;
源博客
https://blog.csdn.net/weixin_32006655/article/details/113942961
五、DML(Data Manipulation Language)
数据操作语言,用来对数据库表中的数据进行增删改
0. 创建表
create table worktable(
id int comment \’编号\’,
worknum int comment \’工号\’,
name varchar(20) comment \’姓名\’,
sex char(1) comment \’性别\’,
age int comment \’年龄\’,
idcard int comment \’身份证号\’,
entrydate date comment \’入职日期\’
)comment \’员工信息表\’;
1. 插入数据
给指定列名数据
insert into 表名(字段名1,字段名2,…..) values(值1,值2,……);
给全部列添加数据
insert into 表名 values(值1,值2,…..);
批量添加数据
#指定列名
insert into
表名(字段名1,字段名2,…..)
values
(值1,值2,……),
(值1,值2,……),
……
(值1,值2,……);
#全部列
insert into
表名
values
(值1,值2,……),
(值1,值2,……),
……
(值1,值2,……);
[注]:
插入数据时,指定的字段顺序需要与值的顺序是一一对应的字符串和日期型数据应该包含在引号中插入的数据大小,应该在字段的规定范围内
2. 修改数据
update 表名 set 列名1=值1,列名2=值2,….[where 条件];
[注]:
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据
3. 删除数据
delete from 表名 [where 条件];
[注]:
delete语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据
delete语句不能删除某一个字段的值(可以使用update来将某字段置空)
六、DQL(Data Query Language)
数据查询语言,用来查询数据库中表的记录
整体语法概览聚合函数(count,max,min,avg,sum):
基本查询(select 列名1,列名2,… from 表名)条件查询(where)聚合函数(count,max,min,avg,sum)分组查询(group by)排序查询(order by)分页查询(limit)
0. 创建表
create table emp(
id int comment \’编号\’,
worknum varchar(10) comment \’工号\’,
name varchar(10) comment \’姓名\’,
gender char(1) comment \’性别\’,
age tinyint unsigned comment \’年龄\’,
idcard char(18) comment \’身份证号\’,
workaddress varchar(50) comment \’工作地址\’,
entrydate date comment \’入职时间\’
)comment \’员工表\’;
insert into emp (id,worknum,name,gender,age,idcard,workaddress,entrydate)
values (1,\’1\’,\’柳岩\’,\’女\’,20,\’123456789012345678\’,\’北京\’,\’2000-01-01\’),
(2,\’2\’,\’张无忌\’,\’男\’,18,\’123456789012345670\’,\’北京\’,\’2005-09-01\’),
(3,\’3\’,\’韦一笑\’,\’男\’,38,\’123456789712345670\’,\’上海\’,\’2005-08-01\’),
(4,\’4\’,\’赵敏\’,\’女\’,18,\’123456757123845670\’,\’北京\’,\’2009-12-01\’),
(5,\’5\’,\’小昭\’,\’女\’,16,\’123456769012345678\’,\’上海\’,\’2007-07-01\’),
(6,\’6\’,\’杨逍\’,\’男\’,28,\’12345678931234567X\’,\’北京\’,\’2006-01-01\’),
(7,\’7\’,\’范瑶\’,\’男\’,40,\’123456789212345670\’,\’北京\’,\’2005-05-01\’),
(8,\’8\’,\’黛绮丝\’,\’女\’,38,\’123456157123645670\’,\’天津\’,\’2015-05-01\’),
(9,\’9\’,\’范凉凉\’,\’女\’,45,\’123156789012345678\’,\’北京\’,\’2010-04-01\’),
(10,\’10\’,\’陈友谅\’,\’男\’,53,\’123456789012345670\’,\’上海\’,\’2011-01-01\’),
(11,\’11\’,\’张士诚\’,\’男\’,55,\’123567897123465670\’,\’江苏\’,\’2015-05-01\’),
(12,\’12\’,\’常遇春\’,\’男\’,32,\’123446757152345670\’,\’北京\’,\’2004-02-01\’),
(13,\’13\’,\’张三丰\’,\’男\’,88,\’123656789012345678\’,\’江苏\’,\’2020-11-01\’),
(14,\’14\’,\’灭绝\’,\’女\’,65,\’123456719012345670\’,\’西安\’,\’2019-05-01\’),
(15,\’15\’,\’胡青牛\’,\’男\’,70,\’12345674971234567X\’,\’西安\’,\’2018-04-01\’),
(16,\’16\’,\’周芷若\’,\’女\’,18,null,\’北京\’,\’2012-06-01\’);
1. 基本查询
查询多个字段
select 字段1,字段2,字段3…..from 表名; #查询指定字段
select * from 表名; #查询全部字段
设置别名
select 字段1 [as 别名1],字段2 [as 别名2] …. from 表名 [as 表别名]; #as可省略
去除重复记录
select distinct 字段列表 from 表名;
select distinct workaddress from emp;
2. 条件查询
select 字段列表 from 表名 where 条件列表;
常见条件
比较运算符功能逻辑运算符功能>大于and 或 &&并且(多个条件同时成立)>=大于等于or 或 ||或者(多个条件任意一个成立)<小于not 或 !非,不是<=小于等于=等于<> 或 !=不等于between…and…在某个范围内(含最小,最大值)in(…)在in之后的列表中的值,多选一like 占位符模糊匹配(_匹配单个字符,%匹配任意个字符)is null是null
3. 聚合函数
常见聚合函数
函数功能count统计数量max最大值min最小值avg平均值sum求和
select 聚合函数(字段列表) from 表名;
[注]:
null值不参与所有聚合函数运算count(*)、count(1)将返回表格中所有存在的行的总数(包括值为null的行)count(列名) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录(这里的空不是指空字符串或者0)。count(1), count(*), count(列名)详解:https://blog.csdn.net/weixin_44363315/article/details/125994997
4. 分组查询
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组过滤条件];
[注]:where 与 having 区别
1.执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;
having是分组之后对结果进行过滤。
2.判断条件不同:where不能对聚合函数进行判断,而having可以。
5. 排序查询
select 字段列表 from 表名 order by 字段1 排序方式1 , 字段2 排序方式2;
[注]:
排序方式: asc:升序(默认值)、desc:降序如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
6. 分页查询
select 字段列表 from 表名 limit 起始索引,查询记录数;
[注]:
起始索引从0开始,起始索引 = (当前页码 – 1) * 每页显示记录数分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是limit如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10
7. 整体语法顺序
七、常见函数
函数是指一段可以直接被另一段程序调用的程序或代码。
1. 字符串函数
由于业务需求变更,企业员工的工号,统一为5位数,目前不是5位数的全部在员工的工号前面补0,比如:1号员工的工号应该为00001.
sql:update emp set workno=lpad(workno, 5, \’0\’)
执行前:
执行后:
substring_index()
参数说明:
第一个参数为需要被截取的字符串列第二个参数为按指定的什么字符截取,例如按 逗号 或 分号第三个参数为从指定下标索引处开始截取,下标从1开始,指定的下标值需要在分隔后的数量范围内,返回对应下标范围内的全部数据
案例:
select
id,
remark,
substring_index(remark, \’,\’, 1) as subStr
from t_table_one
where instr(remark, \’cc\’);
charset(s1)
返回字符串s1的字符集。
length(s1)
返回字符串s1的长度,结果的单位是字节。
replace(s1,s2,s3)
s1是想要改变的字符串,s2是要改变什么,s3是要将字符串中的s2改变成什么。
instr(s1,s2)
返回该串(第二个参数)在字符串(第一个参数)中出现的位置,如果没有出现就返回0。
strcmp(s1,s2)
字符串长度比较,如果相等返回0,如果前面的大返回1,如果后面的大返回-1。
left、right
从左/右边开始取字符,字符从1开始
ltrim、rtrim
去除左/右空格
2. 数学函数
3. 日期函数
https://blog.csdn.net/qq_60750110/article/details/131012270
4. 流程函数
ifnull(val1, val2)
如果val1为null,返回val2,否则返回val1的值。类似于三目运算符
case when then else end
案例1:
案例2:
统计班级各个学员的成绩,展示的规则如下:
大于等于 85,展示优秀;
大于等于60,展示及格;
否则,展示不及格。
准备数据:
sql:
显示结果:
5. 其他函数
json_extract
json_extract函数是MySQL数据库中的一个内置函数,Mysql5.7+之后提供,用于从JSON字符串中提取数据。它的语法相对简单,功能却非常强大。
用法:
select json_extract(json_doc, path[, path] …)
json_doc:这是你要提取数据的JSON字符串。
path:这是你要提取的数据的路径,可以是一个或多个。
若json对象时,可以通过json_extract(‘db字段’, ‘$.json串key’)来表示查询对应的value
实例:假设我们有一个名为users的表,其中有一个名为data的列,存储着JSON格式的数据,如下所示:
{
\”name\”: \”张三\”,
\”age\”: 30,
\”address\”: {
\”city\”: \”北京\”,
\”street\”: \”长安街\”
}
}
如果我们想要提取name字段的值,可以这样写:
SELECT json_extract(data, \’$.name\’);
这样相应的就可以获取到: 张三。
如果我们想要获取到city字段的值,涉及到了嵌套。那么可以这么处理:
SELECT json_extract(data, \’$.address.city\’) ;
#使用.来拼接,获取内部字段内容
如果查询的key不在json串中,返回的是null,而不是抛异常。
如果是json数组时,使用json_extract(‘db字段’, ‘$数组下标.json串key’)
除了在查询结果中使用json_extract之外,也可以在查询条件中使用它
group_concat()
https://blog.csdn.net/hkl_Forever/article/details/116704472
函数 group_concat(arg) 可以合并多行的某列(或多列)数据为一行,默认以逗号分隔。以及分组函数和统计函数的组合使用
案例:
单列合并,默认以逗号分隔
select
group_concat(ttop.user_name) as testStr
from t_table_one_parent ttop;
输出:张三1,张三2,张三3,张三1,张三2,张三3,张三4
单列合并,指定冒号分隔符
select
group_concat(ttop.user_name separator \’;\’) as testStr
from t_table_one_parent ttop;
输出:张三1;张三2;张三3;张三1;张三2;张三3;张三4
单列合并,并去重
select
group_concat(distinct ttop.user_name separator \’;\’) as testStr
from t_table_one_parent ttop;
输出:张三1;张三2;张三3;张三4
多列拼接合并
select
group_concat(distinct ttop.user_name, ttop.company_code separator \’;\’) as testStr
from t_table_one_parent ttop;
输出:张三1123456;张三21234567;张三312345678;张三4123456789
多列拼接合并,列和列之间指定分隔符
select
group_concat(distinct ttop.user_name, \’,\’, ttop.company_code separator \’;\’) as testStr
from t_table_one_parent ttop;
输出:张三1,123456;张三2,1234567;张三3,12345678;张三4,123456789
小结:
group_concat() 函数默认合并后以逗号分隔,也可以自定义分隔符
group_concat() 函数可以多列合并,列和列之间可以自定义分隔符
group_concat() 函数可以使用 distinct 进行去重合并
count() 配合 case when then 的使用
https://blog.csdn.net/hkl_Forever/article/details/116704472
user()
查询当前用户。
md5
对一个字符串进行md5摘要,摘要后得到一个32位字符串。
password
MySQL使用该函数对其加密,MySQL有自己独特的加密方式,本质上与md5形成摘要是一样的,但是密码强度更强。
八、视图
视图(view)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表(称为基表),并且是在使用视图时动态生成的。
通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
1. 创建
创建视图后出现views目录,views目录下存储创建的视图
2. 查询
3. 修改
4. 删除
5. 视图的作用
简单
视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作
每次指定全部的条件。
安全
数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据
数据独立
视图可帮助用户屏蔽真实表结构变化带来的影响。
6. 案例
案例1:为了保证数据库表的安全性,开发人员在操作tb_user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段。
create view tb_user_view as select id,name, profession, age, gender,status, createtime from tb_user;
案例2:查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。
九、存储过程
特点:1. 封装、复用; 2. 可以接收参数,也可以返回数据;3. 减少网络交互,效率提升
1. 创建与调用
创建
创建之后会出现routines目录
调用
2. 查看存储过程
3. 删除存储过程
4. 变量
系统变量
系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量 (SESSION)。
全局变量对所有会话都有效,但是mysql服务器重启后,所设置的全局参数会失效,如果想不失效,可以在/etc/my.cnf中配置。
会话变量仅对当前会话有效。
查看系统变量
查看所有系统变量,不写SESSION或GLOBAL时,默认为SESSION
SHOW [SESSION | GLOBAL] VARIABLES;
可以通过LKE模糊匹配方式查找变量
SHOW [SESSION | GLOBAL] VARIABLES LIKE \’%……%\’
查看指定变量的值
SELECT @@[SESSION | GLOBAL].系统变量名;
设置系统变量
SET [SESSION | GLOBAL〕 系统变量名=值;
SET @@[SESSION | GLOBAL]系统变量名=值:
用户定义变量
用户定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用\”@变量名\”使用就可以。其作用域为当前连接(当前会话)。用户定义的变量无需对其进行声明或初始化,只不过获取到的值为NULL。
赋值
SET @var_name = expr [,@var_name = expr]…;
SET @var_name := expr [,@var_name := expr]…;
SELECT @var_name := expr [,@var_name := expr]…;
SELECT 字段名 INTO @var_name FROM 表名;
使用
SELECT @var_name
实例
局部变量
局部变量是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN…END块。
声明
DECLARE 变量名 变量类型 [DEFAULT…];
变量类型就是数据库字段类型:INT、BIGINT、CHAR、 VARCHAR、 DATE、 TIME等。
赋值
SET 变量名=值:
SET 变量名:=值
SELECT 字段名 INTO 变量名 FROM 表名…;
实例
5. if
IF 条件1 THEN
…
ELSEIF 条件2 THEN — 可选
…
ELSE — 可选
…
END IF;
实例
6. 参数
用法
CREATE PROCEDURE 存储过程名称([IN/OUT/INOUT 参数名 参数类型])
BEGIN
SQL语句
END
实例
定义存储过程:
调用存储过程:
定义一个用户定义变量result,使用result来接收存储过程p4返回的值
输出:
7. case
语法1
CASE case_value
WHEN when_valuel THEN statement_listl
[WHEN when_value2 THEN statement_list 2]…
[ELSE statement_list]
END CASE;
语法2
CASE
WHEN search_conditionl THEN statement_listl
[WHEN search_condition2 THEN statement_list2]…
[ELSE statement_list]
END CASE;
实例
8. 循环
while
while 循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。具体语法为:
— 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑
WHILE 条件 DO
SQL逻辑…
END WHILE;
while实例
repeat
repeat是有条件的循环控制语句,当满足条件的时候退出循环。具体语法为:
— 先执行一次逻辑,然后判定逻辑是否满足,如果满足,则退出。如果不满足,则继续下一次循环
REPEAT
SQL逻辑…
UNTIL 条件
END REPEAT;
repeat实例
loop
LOOP实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。LOOP可以配合以下两个语句使用:
LEAVE:配合循环使用,退出循环。
ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。
语法
[begin_label:] LOOP
SQL逻辑…
END LOOP [end_label];
ITERATE label;直接进入下一次循环
实例
计算从1累加到n的值,n为传入的参数值。
计算从1到n之间的偶数累加的值,n为传入的参数值。
9. 条件处理程序
条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。具体语法为:
10. 游标(光标)
游标(CURSOR)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、 FETCH 和 CLOSE,其语法分别如下:
声明游标
DECLARE 游标名称 CURSOR FOR 查询语句;
打开游标
OPEN 游标名称;
获取游标记录
FETCH 游标名称 INTO 变量[变量];
关闭游标
CLOSE 游标名称;
实例
需求:根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。
sql:
十、存储函数
存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。具体语法如下:
实例
需求:计算从1累加到n的值,n为传入的参数值。
sql:
十一、触发器
触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。
行级触发器:一条sql语句执行后影响几行就触发几次。
语句级触发器:执行几条sql语句就触发几次。
1. 语法
创建
CREATE TRIGGER trigger name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tb_name FOR EACH ROW — 行级触发器
BEGIN
trigger_stmt;
END;
查看
SHOW TRIGGERS;
删除
DROP TRIGGER [schema_name.]trigger_name; — 如果没有指定schema_name,默认为当前数据库
2. 案例
案例1:通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表user_logs中,包含增加,修改,删除。
创建user_logs表
创建插入数据触发器
创建修改数据触发器
创建删除数据触发器
测试
向tb_user插入一条记录
检查user_logs是否有数据
十二、事务
https://javaguide.cn/database/mysql/mysql-questions-01.html#何谓事务
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
MySQL在执行多个语句的过程中,遇到异常时会停止执行。默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句(每一条DML都看做是一个事务),MySQL会立即隐式的提交事务。DDL语句不支持事务。
1. 事务操作
方式1:
查看/设置事务提交方式为手动提交
SELECT @@autocommit;
SET @@autocommit=0; — 0表示需要手动提交事务
提交事务
commit;
回滚事务
rollback;
方式2:
开启事务
start transaction;
— 或
begin;
提交事务
commit;
回滚事务
rollback;
2. 事务四大特性ACID
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
3. 并发事务问题
脏读
一个事务读到另外一个事务还没有提交的数据。
不可重复读
一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
幻读
一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。
4. 并发事务演示及隔离级别
事务的隔离级别
从上到下级别越来越高,数据安全性越来越高,但是性能越来越低。一般使用mysql默认的隔离级别,不会进行修改。
查看事务的隔离级别
SELECT @@TRANSACTIONISOLATION;
设置事务隔离级别
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE};
脏读案例演示
设置隔离级别READ UNCOMMITTED SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
打开两个mysql会话
会话1做如下操作:
会话2做如下操作:
会话1做如下操作:
不可重复读案例演示
设置隔离级别READ COMMITTED
解决脏读问题
会话1执行如下操作:
会话2执行如下操作:
会话1执行如下操作:
会话2执行如下操作:
会话1执行如下操作:
结论:设置隔离级别为READ COMMITTED时,可以避免脏读。
会发生不可重复读的问题
会话1执行如下操作:
会话2执行如下操作:
会话1执行如下操作:
结论:会话1在同一个事务中,读取两次account表,但是两次读取的内容不一致,出现了不可重复读的问题。
幻读案例演示
设置事务隔离级别为REPEATABLE READ
解决不可重复读问题
会话1:
会话2:
此时张三的money应该为3000
会话1:
结论:解决了不可重复读问题
会出现幻读问题
会话1:
会话2:
会话1:
解决幻读案例演示
设置事务隔离级别为 SERIALIZABLE
解决幻读问题
会话1:会话1先开启事务
会话2:会话2开启事务的时间晚于会话1
会话1:
会话2:
常见问题
MySQL表中创建时间字段和更新时间字段的自动更新
来源博客:https://blog.csdn.net/ChineseSoftware/article/details/122879108
需求:
当新增记录的时候,MySQL自动将系统的当前时间 set 到创建时间和更新时间这两个字段中。
当更新记录的时候,MySQL 只 update 更新时间字段的时间,而不修改创建时间字段对应的值。
解决方案:
创建时间字段creat_time timestamp NULL DEFAULT CURRENT_TIMESTAMP更新时间字段update_time timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
或
在 navicat 中的操作:找到相应的表—右击—>点击“设计表”—>如下图:
插入记录时自动生成创建时间:
更新记录时自动生成修改时间:
insert、replace、insert ignore、on duplicate key update区别
四条插入语句
insert into表示插入数据,数据库会检查主键,如果出现重复会报错;
replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,删除旧数据,插入新数据,如果没有数据效果则和insert into一样;
insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;
ON DUPLICATE KEY UPDATE 关注非主键列,注意与ignore的区别。有则更新指定列,无则添加。
使用场景
如果发生约束建重复时:
要捕获异常,则选用insert into
想要删除老的数据,插入新数据,则选用 replace into
想要保存老数据,忽略新数据,则选用 insert ignore into
想要更新老数据中的某几列,其他列不变化,则选用 ON DUPLICATE KEY UPDATE
新建 MySQL 账户、修改用户密码时报错
Column count of mysql.user is wrong. Expected 45, found 43. Created with MySQL 5
该错误是由于你曾经升级过数据库,升级完后没有使用mysql_upgrade升级数据结构造成的。
**解决办法:**使用mysql_upgrade命令
mysql_upgrade -uroot -p
linux中mysql忘记密码(重置密码)
1.修改mysql的配置文件/etc/my.cnf,添加如下内容:
[mysqld]
skip-grant-tables #登录mysql的时候跳过密码验证
2.重启mysql服务
systemctl restart mysqld.service
3.使用root登陆mysql,无需输入密码
mysql -uroot
4.修改密码
update mysql.user set authentication_string=password(\’new_root_password\’) where user=\’root\’ and host=\’localhost\’;
flush privileges;
禁止mysql匿名登录
大多数版本的mysql数据库默认会常见匿名用户,一般情况下,匿名用户的名字为空,host为localhost,authentication_string为空,只有登录mysql的权限,没有其他任何权限。在本机上运行mysql -u任意不存在mysql.user表中的用户名命令即表示使用匿名用户登录。
1.查看匿名用户
SELECT host,user,authentication_string FROM mysql.user WHERE user =‘’;
该SQL语句会显示出MySQL数据库中所有的匿名用户信息
2.删除匿名用户
DELETE FROM mysql.user WHERE user =\’\’;
这句SQL语句会删除MySQL数据库中所有的匿名用户。在执行完这句SQL语句之后,你还需要执行下面的SQL语句来使刚刚所做的更改生效
3.刷新
FLUSH PRIVILEGES;
执行完上述SQL语句以后,就可以查看一下MySQL数据库中是否还存在匿名用户,如果不存在就说明删除成功了。
查看mysql初始化密码
查看mysql初始化密码:
cat /var/log/mysqld.log | grep \’temporary password\’
使用初始化密码登录后必须要先使用alter user语句来更新密码。
ERROR 1366(HY000)报错
运行sql语句,报错像这样的ERROR 1366(HY000):Incorrect string value:XXX一堆乱码:
1.查看表的编码
show create table 表名;
2.查看表中所有列的编码
show full columns from 表名;
修改表和列的编码和sql语句的编码相同即可。
修改方式:
修改表字符集和排序规则
ALTER TABLE 表名 [DEFAULT CHARACTER SET \’字符集\’] [COLLATE \’排序规则\’];
修改表指定列的字符集
ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型 [CHARACTER SET \’字符集\’] [COLLATE \’排序规则\’];
#实例
ALTER TABLE t1 MODIFY COLUMN name VARCHAR(10) CHARACTER SET \’utf8mb4\’ COLLATE \’utf8mb4_0900_ai_ci\’;
[注]:
在执行命令时,如果表格中已存在数据,修改字符集可能会导致某些数据无法正确存储。因此,在修改字符集之前,先备份好数据,以便于后续恢复数据。
参考:
https://blog.csdn.net/qq_36411874/article/details/63251141
#以上关于Mysql笔记的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93188.html