【MySQL】MySQL笔记

零、

help、\h、? 调出帮助

mysql> \h

For information about MySQL products and services, visit:
   http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:
   http://dev.mysql.com/
To buy MySQL Enterprise support, training, or other products, visit:
   https://shop.mysql.com/

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
resetconnection(\x) Clean session context.

For server side help, type 'help contents'

\c或ctrl+c 清除当前输入

登陆mysql:

mysql [-u用户名] [-h主机名(或ip)] [-p密码]
不写-u用户名表示用root登陆
不写-h主机名(ip)表示主机为localhost
不写-p密码表示密码为空

show variables like ‘%character%’; like相当于linux中的grep

清空屏幕:CTRL+L

查看mysql版本:

不登录Mysql的方式查看:
~ ᐅ mysql -V
mysql  Ver 8.0.11 for macos10.13 on x86_64 (MySQL Community Server - GPL)

登录Mysql后查看:
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.11    |
+-----------+
1 row in set (0.00 sec)

一、Mysql格式化输出结果(Linux命令行)

1.使用G按行垂直显示结果

如果一行很长,需要这行显示的话,在linux命令行中看起结果来就非常的难受。在SQL语句或者命令后使用G而不是分号结尾,可以将每一行的值垂直输出。这个可能也是大家对于MySQL最熟悉的区别于其他数据库工具的一个特性了。

mysql> select * from db_archivelog\G

*************************** 1. row ***************************
id: 1
check_day: 2008-06-26
db_name: TBDB1
arc_size: 137
arc_num: 166
per_second: 1.6
avg_time: 8.7

2.使用pager设置显示方式

如果select出来的结果集超过几个屏幕,那么前面的结果一晃而过无法看到。使用pager可以设置调用os的more或者less等显示查询结果,和在os中使用more或者less查看大文件的效果一样。

使用more
mysql> pager more
PAGER set to ‘more’
使用less
mysql> pager less
PAGER set to ‘less’
还原成stdout
mysql> nopager
PAGER set to stdout

3.使用tee保存运行结果到文件

可以将命令行中的所有结果保存到外部文件(不指定文件路径的话默认在运行mysql命令的路径中)中。如果指定已经存在的文件,则结果会附加到文件中。

mysql> tee output.txt
Logging to file ‘output.txt’

关闭:

mysql> notee
Outfile disabled.

4.执行Linux系统命令

mysql> system uname
Linux

mysql> \! uname
Linux

5.执行SQL文件

不指定文件路径的话默认在运行mysql命令的路径中寻找文件

mysql> source test.sql
+—————-+
| current_date() |
+—————-+
| 2008-06-28 |
+—————-+
1 row in set (0.00 sec)

6.以html格式输出结果

使用mysql客户端的参数--html,则所有SQL的查询结果会自动生成为html的table代码

$ mysql -uroot --html 
Welcome to the MySQL monitor. Commands end with ; or \g. 
YourMySQL connection id is 15
Server version: 5.7.42 MySQL Community Server (GPL) 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

7.以xml格式输出结果

跟上面差不多,使用–xml选项,可以将结果输出为xml格式

$ mysql -uroot --xml 
Welcome to the MySQL monitor. Commands end with ; or \g. 
YourMySQL connection id is 15
Server version: 5.7.42 MySQL Community Server (GPL) 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

8.修改命令提示符

prompt命令可以在mysql提示符中显示当前用户、数据库、时间等信息
通过prompt设置了当前时间显示,这样也便于在日志文件中查看每次操作的时间。
使用mysql的--prompt=" "选项,或者进入mysql命令行环境后使用prompt命令,或者修改配置文件都可以修改提示符

登录的时候设置
mysql -uroot -p --prompt="\u@\h:[\d] \r:\m:\s>" 
mysql命令行中设置
prompt \u@\h:[\d] \r:\m:\s>
配置文件中设置

/etc/my.cnf配置文件中添加[mysql]部分
在配置文件里最好使用双斜杠

[mysql]
prompt=\\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> show tables from mysql;
+---------------------------+
| Tables_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              |
| role_edges                |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
33 rows in set (0.02 sec)

0. 系统默认用户

Mysql版本:8.0.11

select user,host,account_locked,authentication_string from mysql.user;

在这里插入图片描述

用户说明
  • root是MySQL的特权账号,该用户拥有所有权限,可执行任何操作。
  • user1是我们自己建的用户。
  • mysql.sys用户是用于sys schema中对象的定义。使用 mysql.sys 用户可避免DBA重命名或者删除root用户时发生的问题。该用户已被锁定,客户端无法连接。
  • mysql.session用户是插件内部使用来访问服务器。该用户已被锁定,客户端无法连接。
  • mysql.infoschema是mysql 8版本新增的系统用户,mysql 5版本没有。该用户是MySQL数据库的系统用户,用来管理和访问系统自带实例information_schema示例的。该用户已被锁定,客户端无法连接。

1. user(全局级别权限)

user 表是 MySQL 中最重要的一个权限表,用来记录允许连接到服务器的账号信息。需要注意的是,在 user 表里启用的所有权限都是全局级的,适用于所有数据库。
user 表中的字段大致可以分为 4 类,分别是用户列、权限列、安全列和资源控制列,下面主要介绍这些字段的含义。

用户列

用户列存储了用户连接 MySQL 数据库时需要输入的信息。需要注意的是 MySQL 5.7 版本不再使用 Password 来作为密码的字段,而改成了 authentication_string

MySQL 5.7 版本的用户列如表所示:

字段名字段类型是否为空默认值说明
Hostchar(60)NO主机名
Userchar(32)NO用户名
authentication_stringtextYES密码

用户登录时,如果这 3 个字段同时匹配,MySQL 数据库系统才会允许其登录。创建新用户时,也是设置这 3 个字段的值。修改用户密码时,实际就是修改 user 表的 authentication_string 字段的值。因此,这 3 个字段决定了用户能否登录。

[注]:

  • 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。

权限列

权限列的字段决定了用户的权限,用来描述在全局范围内允许对数据和数据库进行的操作。

权限大致分为两大类,分别是高级管理权限和普通权限:

  • 高级管理权限主要对数据库进行管理,例如关闭服务的权限、超级权限和加载用户等;
  • 普通权限主要操作数据库,例如查询权限、修改权限等。

user 表的权限列包括 Select_priv、Insert_ priv 等以 priv 结尾的字段,这些字段值的数据类型为 ENUM,可取的值只有 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命令阻止对表的访问/修改
Execute_privenum(‘N’,‘Y’)NON是否可以执行存储过程
Repl_slave_privenum(‘N’,‘Y’)NON是否可以读取用于维护复制数据库环境的二进制日志文件
Repl_client_privenum(‘N’,‘Y’)NON是否可以确定复制从服务器和主服务器的位置
Create_view_privenum(‘N’,‘Y’)NON是否可以创建视图
Show_view_privenum(‘N’,‘Y’)NON是否可以查看视图
Create_routine_privenum(‘N’,‘Y’)NON是否可以更改或放弃存储过程和函数
Alter_routine_privenum(‘N’,‘Y’)NON是否可以修改或删除存储函数及函数
Create_user_privenum(‘N’,‘Y’)NON是否可以执行CREATE USER命令,这个命令用于创建新的MySQL账户
Event_privenum(‘N’,‘Y’)NON是否可以创建、修改和删除事件
Trigger_privenum(‘N’,‘Y’)NON是否可以创建和删除触发器
Create_tablespace_privenum(‘N’,‘Y’)NON是否可以创建表空间

如果要修改权限,可以使用 GRANT 语句为用户赋予一些权限,也可以通过 UPDATE 语句更新 user 表的方式来设置权限。

安全列

安全列主要用来判断用户是否能够登录成功,user 表中的安全列如表所示:

字段名字段类是否为空默认值说明
ssl_typeenum( ‘ANY’,‘X509’,‘SPECIFIED’)NO支持ssl标准加密安全字段
ssl_cipherblobNO支持ssl标准加密安全字段
x509_issuerblobNO支持x509标准字段
x509_subjectblobNO支持x509标准字段
pluginchar(64)NOmysql_native_password引入plugins以进行用户连接时的密码验证,plugin创建外部/代理用户
password_expiredenum(‘N’,‘Y’)NON密码是否过期 (N 未过期,y 已过期)
password_last_changedtimestampYES记录密码最近修改的时间
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 加密功能。
资源控制列

资源控制列的字段用来限制用户使用的资源,user 表中的资源控制列如表所示。

字段名字段类型是否为空默认值说明
max_questionsint(11) unsignedNO0规定每小时允许执行查询的操作次数
max_updatesint(11) unsignedNO0规定每小时允许执行更新的操作次数
max_connectionsint(11) unsignedNO0规定每小时允许执行的连接操作次数
max_user_connectionsint(11) unsignedNO0规定允许同时建立的连接次数

以上字段的默认值为 0,表示没有限制。一个小时内用户查询或者连接数量超过资源控制限制,用户将被锁定,直到下一个小时才可以在此执行对应的操作。可以使用 GRANT 语句更新这些字段的值。

2. db(数据库级别权限)

db 表比较常用,是 MySQL 数据库中非常重要的权限表,表中存储了用户对某个数据库的操作权限。表中的字段大致可以分为两类,分别是用户列和权限列。

用户列

db 表用户列有 3 个字段,分别是 Host、User、Db,标识从某个主机连接某个用户对某个数据库的操作权限,这 3 个字段的组合构成了 db 表的主键。

db 表的用户列如下表所示:

字段名字段类型是否为空默认值说明
Hostchar(60)NO主机名
Dbchar(64)NO数据库名
Userchar(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 tablesshow 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. 创建

MySQL中的注释

MySQL中的注释有三种:

1. # 注释内容
2. -- 注释内容
3. /* 注释内容*/

注意:

CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; 

/*!40100 DEFAULT CHARACTER SET utf8mb4 */会被MySQL执行,表示当mysql版本号大于4.1.00时执行DEFAULT CHARACTER SET utf8mb4

创建数据库
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 UNIQUE 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 字段名;
修改表的注释
alter table 表名 COMMENT '注释'; 

源博客

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. 整体语法顺序

在这里插入图片描述
在这里插入图片描述

8. 外连接和内连接

学生表:

mysql> show create table student;
----------------------------------------+
| student | CREATE TABLE `student` (
  `id` int(5) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

mysql> select * from student;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | lisi     |
|  3 | wangwu   |
+----+----------+

课程表:s_id表示学生表中的id

mysql> show create table course;
| course | CREATE TABLE `course` (
  `id` int(5) NOT NULL,
  `course_name` varchar(255) NOT NULL,
  `s_id` int(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

mysql> select * from course;
+----+-------------+------+
| id | course_name | s_id |
+----+-------------+------+
|  1 | p6          |    1 |
|  2 | p7          |    2 |
|  3 | p8          | NULL |
+----+-------------+------+
外连接

左外连接(左连接):

left join (左连接,左外连接):返回包括左表中的所有记录和右表中连接字段相等的记录。

mysql> select s.*,c.* from student as s left join course as c on s.id=c.s_id;
+----+----------+------+-------------+------+
| id | name     | id   | course_name | s_id |
+----+----------+------+-------------+------+
|  1 | zhangsan |    1 | p6          |    1 |
|  2 | lisi     |    2 | p7          |    2 |
|  3 | wangwu   | NULL | NULL        | NULL |
+----+----------+------+-------------+------+
3 rows in set (0.00 sec)

student as s left join coursejoin关键字的左边是student表,右边是course表,因为是左连接(left),所以会查出左表(student)中的所有记录。

右外连接(右连接):

right join (右连接,右外连接):返回包括右表中的所有记录和左表中连接字段相等的记录。

mysql> select s.*,c.* from student as s right join course as c on s.id=c.s_id;
+------+----------+----+-------------+------+
| id   | name     | id | course_name | s_id |
+------+----------+----+-------------+------+
|    1 | zhangsan |  1 | p6          |    1 |
|    2 | lisi     |  2 | p7          |    2 |
| NULL | NULL     |  3 | p8          | NULL |
+------+----------+----+-------------+------+
3 rows in set (0.01 sec)

student as s right join coursejoin关键字的左边是student表,右边是course表,因为是右连接(right),所以会查出右表(course)中的所有记录。

内连接(等值连接)

inner join (等值连接、内连接):只返回两个表中连接字段相等的行。

mysql> select s.*,c.* from student as s inner join course as c on s.id=c.s_id;
+----+----------+----+-------------+------+
| id | name     | id | course_name | s_id |
+----+----------+----+-------------+------+
|  1 | zhangsan |  1 | p6          |    1 |
|  2 | lisi     |  2 | p7          |    2 |
+----+----------+----+-------------+------+
2 rows in set (0.00 sec)

student as s inner join coursejoin关键字的左边是student表,右边是course表,因为是内连接(inner),所以会查出左表(student)右表(course)中的公共记录(交集)。

七、Mysql练习题目

https://zhuanlan.zhihu.com/p/38354000

1. 创建表

创建学生表
mysql> create table if not exists student(
    -> student_id varchar(255) not null,
    -> student_name varchar(255) not null,
    -> birthday date not null,
    -> gender varchar(255) not null,
    -> primary key(student_id)
    -> )default charset utf8;
创建成绩表
mysql> create table score(
  	-> student_id varchar(255) not null,
  	-> course_id varchar(255) not null,
  	-> score float(3) not null,
  	-> primary key(student_id,course_id)
		-> )default charset utf8;
创建课程表
mysql> create table course(
    -> course_id varchar(255) not null,
    -> course_name varchar(255) not null,
    -> teacher_id varchar(255) not null,
    -> primary key(course_id)
    -> )default charset utf8;
创建教师表
mysql> create table teacher(
  	-> teacher_id varchar(255) not null, 
  	-> teacher_name varchar(255) null, 
  	-> primary key(teacher_id) 
		-> ) default charset utf8;

2. 插入数据

学生表插入数据
insert into student
values
('0001','猴子','1989-01-01','男'),
('0002','猴子','1990-12-21','女'),
('0003','马云','1991-12-21','男'),
('0004','王思聪','1990-05-20','男');
成绩表插入数据
insert into score
values
('0001','0001',80),
('0001','0002',90),
('0001','0003',99),
('0002','0002',60),
('0002','0003',80),
('0003','0001',80),
('0003','0002',80),
('0003','0003',80);
课程表插入数据
insert into course
values
('0001','语文','0002'),
('0002','数学','0001'),
('0003','英语','0003');
教师表插入数据
insert into teacher 
values
('0001','孟扎扎'),
('0002','马化腾'),
('0003',null),
('0004','');

3. 题目

1.查询姓“猴”的学生名单
select * from student where student_name like "猴%";
2.查询名字中最后一个字是猴的学生名单
select * from student where student_name like "%猴";
3.查询名字中带猴的学生名单
select * from student where student_name like "%猴%";
4.查询名字中第二个字是猴的学生名单
select * from student where student_name like "_猴%";
5.查询姓“孟”老师的个数

关键字:个数-count

select count(*) from teacher where teacher_name like "孟%";
6.查询课程编号为“0002”的总成绩

关键字:总成绩-sum

select sum(score) from score where course_id='0002';
7.查询选了课程的学生人数*

关键字:人数-count

select 学号,成绩表里学号有重复值需要去掉

select count(distinct student_id) as 学生人数 from score;
8.查询各科成绩最高和最低的分

关键字:各科-分组;最高分-max ;最低分-min

select course_id,min(score) as 最低分,max(score) as 最高分 from score group by course_id;
9.查询每门课程被选修的学生数

关键字:每门-分组;学生数-count

select course_id as 课程,count(student_id) as 学生个数 from score group by course_id;
10.查询男生、女生人数

关键字:男生、女生(相当于每,因为性别只有男、女)-分组;人数-count

select gender,count(*) from student group by gender;
11.查询平均成绩大于60分学生的学号和平均成绩

关键字:平均成绩大于-having avg()>

select student_id,avg(score) from score group by student_id having avg(score)>60;
12.查询至少选修两门课程的学生学号

关键字:至少-count

select student_id from score group by student_id having count(course_id)>=2;
13.查询同名同姓学生名单并统计同名人数*

关键字:人数-count

select student_name,count(student_id) from student group by student_name having count(student_id) >=2; 
14.查询不及格的课程并按课程号从大到小排列
select * from score where score<60 order by course_id desc;
15.查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列

关键字:每门-group by;平均成绩-avg

select course_id,avg(score) as 平均成绩 from score group by course_id order by 平均成绩,course_id desc;
16.检索课程编号为“0004”且分数小于60的学生学号,结果按按分数降序排列
select student_id student from score where course_id='0004' and score<60 order by score desc;
17.统计每门课程的学生选修人数(超过2人的课程才统计)

关键字:每门-group by;人数-count

select course_id,count(student_id) from score group by course_id having count(student_id)>2;
18.查询两门以上不及格课程的同学的学号及其平均成绩**

19.查询每个学生的总成绩并进行排名

关键字:每个-group by;总成绩-sum

select student_id,sum(score) as 总成绩 from score group by student_id order by 总成绩;
20.查询平均成绩大于60分的学生的学号和平均成绩

关键字:平均成绩大于-having avg()>60

select student_id,avg(score) as 平均成绩 from score group by student_id having avg(score)>60;
21.查询所有课程成绩小于60分学生的学号、姓名

关键字:所有成绩小于60-where score < 60

因为姓名在student表中,成绩在score表中,所以要用到子查询。

注意:如果(值1,值2,……)存在重复值时,in (值1,值2,……) 会从(值1,值2,……)中的重复值中选择一个。即in会过滤掉重复数据

select student_id,student_name from student where student_id in (select student_id from score where score<60);
22.查询没有学全所有课的学生的学号、姓名*
select student_id,student_name from student where student_id in (select student_id from score group by student_id having count(course_id) < (select count(*) from course));
23.查询出只选修了两门课程的全部学生的学号和姓名
select student_id,student_name from student where student_id in (select student_id from score group by student_id having count(course_id)=2);
24.查询各科成绩前两名的记录**

关键字:各科-group by


https://mp.weixin.qq.com/s/MuxjlFV0gi1GydOrYfiSeQ

img
25.查找1990年出生的学生名单*
select * from student where year(birthday) = 1990;select * from student where birthday like '1990-%';
26.查询各学生的年龄(精确到年)*
select student_id, year(current_time)-year(birthday)+1 from student;
27.查询各学生的年龄(精确到月份)*
select student_id,timestampdiff(month ,birthday ,now())/12 from student;
28.查询本月过生日的学生*
select * from student where month(birthday)=month(current_date);
29.查询所有学生的学号、姓名、选课数、总成绩*

要显示的列:学号,姓名,选课数,总成绩,分布在两个表中,所以应该用连表查询,将两个表连接起来

关键字:所有学生-左连接或右连接:左连接的话join左边的表应该为student,右连接的话join右边应该为student表。

注意:分组时,如果要用外连接的条件分组,则选择的那个表中的列中的数据应该是唯一的,及s.student_id

select s.student_id as 学号,s.student_name as 姓名,count(c.course_id) as 选课数,sum(c.score) as 总成绩 from student as s left join score as c on s.student_id=c.student_id group by s.student_id;
30.查询平均成绩大于85的所有学生的学号、姓名和平均成绩*
select t1.student_id as '学号',t1.student_name as '姓名',avg(score) as '平均成绩' from student as t1 left join score as t2 on t1.student_id = t2.student_id group by  t1.student_id having avg(t2.score)>85;
31.查询学生的选课情况:学号,姓名,课程号,课程名称*
select t1.student_id,t1.student_name,t3.course_id,t3.course_name from student as t1 left join score as t2 on t1.student_id=t2.student_id left join course as t3 on t2.course_id=t3.course_id;
32.查询出每门课程的及格人数和不及格人数*

关键字:及格和不及格-分类:case语句

select course_id, sum(case when score>=60 then 1 else 0 end) as 及格人数, sum(case when score<60 then 1 else 0 end) as 不及格人数 from score group by course_id;
33.使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
select a.课程号,b.课程名称,
sum(case when 成绩 between 85 and 100 
	 then 1 else 0 end) as '[100-85]',
sum(case when 成绩 >=70 and 成绩<85 
	 then 1 else 0 end) as '[85-70]',
sum(case when 成绩>=60 and 成绩<70  
	 then 1 else 0 end) as '[70-60]',
sum(case when 成绩<60 then 1 else 0 end) as '[<60]'
from score as a right join course as b 
on a.课程号=b.课程号
group by a.课程号,b.课程名称;
34.查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名
select student_id,student_name from student where student_id in (select student_id from score where course_id='0003' and score>80);
35.检索"0001"课程分数小于60,按分数降序排列的学生信息
select t1.*,t2.score from student as t1 left join score as t2 on t1.student_id=t2.student_id where t2.course_id = 0001 and t2.score>60 order by t2.score desc;
36.查询不同老师所教不同课程平均分从高到低显示**

注意:select只能是聚合函数或group by后面的字段,否则会报SELECT list is not in GROUP BY clause and contains nonaggregated column的错误。原因是sql_mode模式的限制。可以修改这个模式,修改方法:https://blog.csdn.net/weixin_42085125/article/details/115335503

因为我们要查询t2.course_id,所以要在group by后面加上t2.course_id

select t1.teacher_name,t2.course_id,avg(t3.score) from teacher as t1 inner join course as t2 on t1.teacher_id=t2.teacher_id inner join score as t3 on t2.course_id=t3.course_id group by t1.teacher_id,t2.course_id order by avg(score) desc; 
37.查询课程名称为"数学",且分数低于60的学生姓名和分数
行列如何互换

sql面试题:行列如何互换?

常见问题

MYSQL导出 SQL 格式的数据

mysqldump 命令是 mysql 用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等,SQL脚本中不包含创建数据库的语句。

1. 导出指定数据库中的所有表:
mysqldump -u username -p database_name > path\dbname.sql  
-u:mysql用户名参数。
username:我们可以登录到数据库的用户名。
-p:mysql密码参数。
database_name:我们要导出的数据库的名称。
>:指定输出路径位置。
path/dbname.sql:path是我们要导出的文件夹路径,dbname.sql 是保存输出的文件。
#导出db1这个数据库中的所有表
mysqldump -uroot -p db1 > /home/db1.sql
#导出多个数据库(db1、db2)的表
mysqldump -uroot -p --databases db1 db2 > /home/db1_db2.sql
2. 导出指定数据库中的指定表:
#导出db1这个数据库中tb1这个表
mysqldump -uroot -p db1 tb1 > /home/db1.tb1.sql

3. 导出所有数据库

常用于数据库的备份

mysqldump -uroot -p --all-databases > /home/database_dump.sql
4. 不导出数据,只导出表结构

使用-d参数表示只导出表结构,不导出数据

#导出数据库db1内的所有表结构
mysqldump -u root -p -d db1 > /home/db1.sql 

#导出数据库db1、db2内的所有表结构
mysqldump -u root -p -d --databases db1 db2 > /home/db1_db2.sql

#导出数据库db1内的tb1表结构
mysqldump -u root -p -d db1 tb1 > /home/db1.tb1.sql

#导出所有数据库的表结构
mysqldump -u root -p -d --all-databases > /home/all_db.sql

MYSQL导入SQL格式的数据

因为使用mysqldump命令导出sql文件时,sql文件中不会有创建数据库的语句,所以在导入sql文件之前要提前创建好数据库

1. mysql 命令导入
mysql -u用户名 -p密码 指定数据库 < 要导入的数据库数据(db1.sql)
#指定数据库要提前创建好,否则导入sql时会报错。
2. source 命令导入

source 命令导入数据库需要先登录到数据库,并且创建好响应的数据库

mysql> create database db1 default charset utf8mb4;      # 创建数据库
mysql> use db1;                  # 使用已创建的数据库 
mysql> source /home/db1.sql  # 导入备份数据库

卸载MYSQL

  1. 查看mysql安装包和依赖: rpm -qa | grep -i mysql

yum命令卸载: yum remove mysql*

rpm命令卸载:rpm -ev --nodeps 完整名称

  1. 查看mysql配置文件和相关数据:find / -name mysql

删除配置文件和相关数据:rm -rf 查找出来的文件

  1. 删除/etc/my.cnf:rm -rf /etc/my.cnf

新建 MySQL 账户、修改用户密码时报错

Column count of mysql.user is wrong. Expected 45, found 43. Created with MySQL 5
该错误是由于你曾经升级过数据库,升级完后没有使用mysql_upgrade升级数据结构造成的。
解决办法:退出mysql,然后使用mysql_upgrade -uroot -p --force命令,最后重启mysql服务

1. 退出mysql:quit
2. 运行命令:mysql_upgrade -uroot -p --force
3. 重启mysql服务:systemctl restart mysqld.service

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'

注意:

  • systemctl restart mysqld.service之后,/var/log/mysqld.log中才会出现临时密码;

  • 使用初始化密码登录后必须要先使用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';

[注]:

  • 在执行命令时,如果表格中已存在数据,修改字符集可能会导致某些数据无法正确存储。因此,在修改字符集之前,先备份好数据,以便于后续恢复数据。

ERROR 2003 (HY000): can’t connect to mysql server on…

登录mysql时报错:ERROR 2003 (HY000): can’t connect to mysql server on…

排障思路:

1.检查与目标主机的的连通性: telnet 目标主机ip 端口 默认端口为3306,如果目标主机mysql服务的端口换成了其他,则登陆时需要指定端口mysql -u用户名 -p密码 -h目标主机ip -P端口

2.检查目标主机的mysql是否允许该用户远程登录: select * from mysql.user

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

在创建或更改用户密码时,MySQL会检查密码是否符合当前的密码策略要求。如果密码不符合策略要求,您将会收到错误消息:“Your password does not satisfy the current policy requirements”。

解决方式:
1.查看密码策略:首先,了解当前MySQL密码策略的要求。您可以通过以下查询来获取策略信息:

SHOW VARIABLES LIKE 'validate_password%';

这将显示与密码策略相关的变量和其当前值。注意validate_password_policy变量的值,它表示密码策略的级别。常见的策略级别包括0、1、2。
2.选择密码满足策略要求:根据策略级别,您可以选择一个更强的密码来满足要求。通常,增加密码的长度、包含大小写字母、数字和特殊字符都可以帮助您满足策略要求。
3.创建用户时设置密码:在创建用户时,确保设置一个符合策略要求的密码。
4.更改密码策略(可选):如果需要,您可以更改MySQL的密码策略级别。您可以通过以下方式之一来更改策略级别:

  • 修改my.cnf配置文件,在[mysqld]部分添加或修改validate_password_policy的值。
  • 直接在MySQL中执行以下命令:
SET GLOBAL validate_password_policy = 0; -- 设置策略级别为0(最宽松的策略)

5.更多密码策略:MySQL的密码策略包括多个参数,这些参数用于定义密码的要求和限制,以提高数据库的安全性。以下是MySQL密码策略的每个参数的说明:

  • validate_password_length:此参数规定密码的最小长度。默认值为 8。例如,如果将其设置为 10,那么用户密码必须至少包含 10 个字符。
  • validate_password_number_count:该参数规定密码中必须包含的数字数量。默认值为 1。如果设置为 2,则密码中必须包含至少两个数字。
  • validate_password_policy:此参数定义密码策略的级别,它可以有以下几个值:
0:密码策略禁用。密码不需要符合任何要求。
1:低级别的密码策略。密码必须包含数字、字母(大小写)和特殊字符。
2:中级别的密码策略。密码必须包含数字、字母(大小写)和特殊字符,并且不能包含与用户名相同的部分。
  • validate_password_special_char_count:此参数规定密码中必须包含的特殊字符数量。默认值为 1。如果设置为 2,则密码中必须包含至少两个特殊字符。

  • validate_password_mixed_case_count:该参数规定密码中必须包含的大写字母和小写字母数量。默认值为 1。如果设置为 2,则密码中必须包含至少两个大写字母和两个小写字母。

  • validate_password_check_user_name:此参数规定密码是否允许包含与用户名相同的部分。默认值为 ON,表示不允许密码包含用户名。如果设置为 OFF,密码可以包含用户名的部分。

6.重新加载MySQL配置:如果您更改了密码策略,需要重新加载MySQL配置以使更改生效:

FLUSH PRIVILEGES;

7.尝试创建用户:现在,尝试再次创建用户,应该不会再收到密码策略错误消息。

参考:

https://blog.csdn.net/qq_36411874/article/details/63251141

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
CSDN是一个技术交流平台,里面有许多关于各种编程语言和数据库的学习资料和笔记。而MySQL是其中一种常用的关系型数据库管理系统,也是开放源代码软件之一。 在CSND上,MySQL笔记是指关于MySQL数据库的学习和使用的笔记和教程。这些笔记包含了MySQL数据库的基本概念、安装配置、SQL语句的使用、数据表的设计和管理、索引使用、数据备份和恢复等方面的知识。学习MySQL笔记可以帮助开发者更好地理解和应用MySQL数据库MySQL笔记主要可以分为以下几个方面来介绍和学习: 1. 数据库基础知识:学习数据库的基本概念和原理,了解关系型数据库的特点以及MySQL的特点。 2. 安装和配置:学习如何在不同操作系统上安装和配置MySQL数据库,包括设置用户名、密码和端口等。 3. SQL语句的使用:学习SQL语句的基本语法和常用命令,包括查询、插入、更新、删除等操作。 4. 数据表的设计和管理:学习如何设计和创建数据表,包括选择适当的数据类型、设置主键和外键等。 5. 索引的使用:学习如何创建和使用索引来提高查询效率和数据访问速度。 6. 数据备份和恢复:学习如何进行MySQL数据库的数据备份和恢复,包括全量备份和增量备份等。 通过学习MySQL笔记,开发者可以掌握MySQL数据库的基本操作和高级功能,提高数据管理和查询的效率。此外,还可以了解MySQL数据库的优化技巧和性能调优方法,提升数据库的性能和稳定性。 总之,通过CSDN上的MySQL笔记,开发者可以系统地学习和掌握MySQL数据库的相关知识,从而更好地应用于实际的项目开发中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值