1. MySQL简介
在之前的教程中 ,我讨论了有关MySQL服务器的安装以及MySQL数据库使用入门的问题。 在本文中,我们将详细讨论如何使用MySQL命令行执行各种操作,例如选择,插入,更新,删除,数据库管理,授权管理以及使用MySQL数据库时所需的其他一些操作。
本教程的前提条件是预先安装MySQL服务器。 本文将指导您顺利进行安装。
目录
1. MySQL简介
2.连接到MySQL命令行
3.创建数据库和表
4.在表中插入记录
5.查看记录并格式化输出
5.1查看所有记录
5.2查看格式化的输出
5.3查看有限的记录
5.4抵消结果
6.更新和删除记录
7.切换安全更新和自动提交
7.1启用/禁用安全更新
7.2禁用自动提交
8. MySQL管理
9.结论
2.连接到MySQL命令行
数据库服务器启动并运行后,您可以使用以下命令登录到MySQL命令行。
$ mysql -u root -p
连接后,命令提示符或终端将显示mysql>
,表示您现在正在使用MySQL命令行。 如果您看到mysql command not found
类的错误,那可能是因为缺少MySQL路径变量。 您可以按照以下过程解决此问题:
视窗
如果是Windows,请右键单击“ 我的电脑” /“此PC”图标,然后选择“系统属性”。 在系统属性中,选择高级选项卡,然后单击环境变量 。 在环境变量中,查找PATH变量,然后双击以进行编辑。 最后,在分号后将MySQL安装路径附加到变量中。 应用更改,然后尝试再次在命令提示符下执行上述命令。 Linux / MacOS 在Linux和MacOS变体中,过程仍然相似。 为了启用对mysql命令的直接检测,请在替换命令中的MySQL安装路径后执行以下命令。
export PATH=$PATH:
连接后,MySQL命令行可用于执行任何SQL查询,无论它是CRUD操作还是数据定义或管理查询。 首先,让我们使用以下命令检查可用数据库的列表:
mysql> show databases;
如果是全新安装,它将仅显示用于管理目的的MySQL默认数据库列表。
3.创建数据库和表
让我们继续创建数据库。 MySQL中的数据库称为架构。 为了创建模式,请执行以下命令:
mysql> create schema tutorial;
确保最后使用分号。 如果您错过了分号,则该语句将不被认为是完整的,并且将提示您提供进一步的说明,如下所示。
mysql> create schema tutorial
-> ;
Query OK, 1 row affected (0.09 sec)
输入分号后,它将立即执行之前编写的查询。 现在,您可以在末端检查数据库列表,以验证是否已创建数据库。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| tutorial |
+--------------------+
5 rows in set (0.01 sec)
现在让我们使用数据库并在其中创建表。 让我们创建一个简单的学生详细信息表。
mysql> use tutorial
Database changed
mysql> create table student_details (id int, name varchar(50), class varchar(3));
Query OK, 0 rows affected (0.07 sec)
上面的命令首先选择教程数据库,然后创建具有三列的表。 让我们再创建两个表以处理进一步的查询。
mysql> create table subjects (id int, name varchar(50));
Query OK, 0 rows affected (0.11 sec)
mysql> create table marks (id int, subject_id int, student_id int, marks int);
Query OK, 0 rows affected (0.05 sec)
现在,让我们检查在数据库中创建的表。
mysql> show tables;
+--------------------+
| Tables_in_tutorial |
+--------------------+
| marks |
| student_details |
| subjects |
+--------------------+
3 rows in set (0.00 sec)
4.在表中插入记录
MySQL命令行支持用于插入记录的标准SQL命令。 要将记录插入创建的表中,请执行以下命令。
插入到student_details
mysql> mysql> insert into student_details values (1,'Abhishek','XII');
Query OK, 1 row affected (0.10 sec)
上面的语句将一条记录插入到student_details表中。 为了插入多个记录,您可以将值集合并在一行中,也可以将这些值添加到没有分号的单独行中。 这两种方法如下所示。
每行添加一条记录
mysql> insert into student_details values (2,'John','XII')
-> ,(3,'Ted','XI')
-> ,(4,'Tim','XII');
Query OK, 3 rows affected (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 0
在一行中添加记录
mysql> insert into student_details values (2,'John','XII'),(3,'Ted','XI'),(4,'Tim','XII');
Query OK, 3 rows affected (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 0
5.查看记录并格式化输出
现在, student_details
表中的记录很少。 现在让我们查看记录。
5.1查看所有记录
为了查看所有记录,您需要做的就是对student_details
表执行select查询。
mysql> select * from student_details;
+------+----------+-------+
| id | name | class |
+------+----------+-------+
| 1 | Abhishek | XII |
| 2 | John | XII |
| 3 | Ted | XI |
| 4 | Tim | XII |
+------+----------+-------+
4 rows in set (0.00 sec)
5.2查看格式化的输出
默认情况下,记录显示在表格控制台输出中,如上所示。 MySQL还提供了使用格式化命令来格式化控制台输出的工具。 例如,为了获得逐行输出,可以使用\G
,如下所示:
mysql> select * from student_details \G;
*************************** 1. row ***************************
id: 1
name: Abhishek
class: XII
*************************** 2. row ***************************
id: 2
name: John
class: XII
*************************** 3. row ***************************
id: 3
name: Ted
class: XI
*************************** 4. row ***************************
id: 4
name: Tim
class: XII
4 rows in set (0.00 sec)
5.3查看有限的记录
有时,可能需要在少数情况下希望看到有限数量的记录,例如表中的记录数量巨大或尝试实现分页时。 在这种情况下,您需要限制返回的记录数。 在MySQL中,这可以通过关键字limit
。 它基本上限制了从表中提取的记录数。 例如,
mysql> select * from student_details limit 2;
+------+----------+-------+
| id | name | class |
+------+----------+-------+
| 1 | Abhishek | XII |
| 2 | John | XII |
+------+----------+-------+
2 rows in set (0.04 sec)
以这种方式,可以限制结果集中返回的记录数。
5.4抵消结果
在分页的情况下,需要抵消。 抵销基本上是一种跳过一定数量的记录并获取下一个记录的机制。 例如,如果一个表包含40条记录,而我们创建一个表,则每页显示10条记录。 在这种情况下,在第二页中,我们需要在跳过前10条记录后获取10条记录。这可以使用关键字offset
。 下面显示了相同的示例。
mysql> select * from student_details limit 2 offset 2;
+------+------+-------+
| id | name | class |
+------+------+-------+
| 3 | Ted | XI |
| 4 | Tim | XII |
+------+------+-------+
2 rows in set (0.00 sec)
6.更新和删除记录
插入记录后,我们通常需要做的下一个任务是更正或删除它们。 如上所述,MySQL命令像普通的数据库客户端一样处理所有SQL查询。 让我们尝试更新id-3的学生记录。 该类设置为XI而不是XII。 让我们使用更新查询对它们进行纠正。
mysql> update student_details set class='XII' where id= 3;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0
可以看到,命令行显示了已匹配和已更改的记录的摘要。 它还计算由于多种可能的原因在更新过程中可能引发的警告数。 现在,让我们尝试检查无效数据的更新。 例如,
mysql> update student_details set class='XIIII' where id= 3;
ERROR 1406 (22001): Data too long for column 'class' at row 3
可以看出,每当您提供无效值时,就会发生错误。 每个错误都分配有相关的错误代码,而不仅仅是显示消息。 数据库客户端使用此错误代码来显示具有更详细信息的明智错误。
现在,考虑蒂姆离开学校的情况。 Tim的记录不再需要,因此需要删除。 为了删除记录,让我们执行删除脚本,如下所示:
mysql> delete from student_details where id = 4;
Query OK, 1 row affected (0.03 sec)
删除的行数按受影响的行数显示。 因此,可以理解,一条记录已被成功删除。
7.切换安全更新和自动提交
考虑一种错误地执行删除查询而没有where子句的情况。 如果对此类查询的执行没有任何限制,则将导致记录丢失。 有两种方法可以阻止这种情况。
- 在没有关键字段条件的情况下停止查询执行
- 禁用自动提交以允许用户回滚
7.1启用/禁用安全更新
默认情况下,安全更新在MySQL命令行中处于关闭状态。 这使用户可以执行如下所示的查询。
mysql> delete from student_details;
这样的查询将从表中删除所有现有记录,从而导致数据丢失。 为了禁用此类查询的执行,您可以强制执行包含关键字段条件的where子句。 例如,您可以在条件中使用ID字段来强制执行where子句。 可以使用以下查询来完成。
mysql> set sql_safe_updates=1;
Query OK, 0 rows affected (0.01 sec)
现在,如果我们尝试执行上述删除查询,将显示如下所示的输出。
mysql> delete from student_details;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
启用安全更新模式后,如果where子句中没有id字段,则无法执行删除或更新查询。 请注意,由于当前student_details
表中没有键字段,因此我们将无法删除或更新任何记录。 为此,您需要更改表并添加主键。 本文将进一步介绍此过程。 现在,您可以使用以下语句禁用安全更新模式。
mysql> set sql_safe_update = 0;
7.2禁用自动提交
当前,如果删除查询被错误地执行,则无法取回数据。 这是因为默认情况下,MySQL在命令行中启用了自动提交功能。 自动提交基本上意味着它将自动将所有更改应用到实际数据库。
禁用自动提交后,将缓存使用命令行完成的更改,直到我们要求数据库显式提交它为止。 禁用自动提交后,如果执行了查询,则可以通过执行简单的命令rollback
来回滚更改。 为了禁用自动提交,请使用以下语句。
mysql> set autocommit=0;
Query OK, 0 rows affected (0.01 sec)
自动提交功能关闭后,请在安全更新模式关闭的情况下执行以下删除查询。
mysql> delete from student_details;
Query OK, 4 rows affected (0.00 sec)
mysql> select count(*) from student_details;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.01 sec)
mysql> rollback;
Query OK, 0 rows affected (0.06 sec)
mysql> select count(*) from student_details;
+----------+
| count(*) |
+----------+
| 4 |
+----------+
1 row in set (0.00 sec)
从上述执行删除查询的过程中可以看出,执行删除查询后,如果从表中选择数据,则没有可用的记录。 但是,回滚后,您可以看到这4条记录是完整的,并且删除操作已还原。 因此,关闭自动提交可能会对MySQL命令行的常规使用产生重大影响。
8. MySQL管理
一旦我们了解了MySQL数据库的创建和更新,就该考虑管理数据库了。 对于大型项目,数据库管理是一项重要任务。 每个数据库都有其自己的存储管理数据的方式。 MySQL将管理数据存储在两个不同的数据库中。 用于管理目的的第一个数据库是名为mysql的数据库。 本节仅涵盖对初学者最重要的表格。
让我们选择数据库并检查可用表的列表。
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------------------+
| 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.01 sec)
可以看出,该数据库仅包含33个表。 其中,最重要的表是user&global_grants 。 用户表包含到目前为止已创建的用户列表。 在查看记录时,除了默认的root用户之外,您还会发现另外三个用户。 这些用户默认在安装过程中创建,除非有必要,否则不应更新。
mysql> select * from user \G;;
*************************** 1. row ***************************
Host: localhost
User: mysql.infoschema
Select_priv: Y
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
password_expired: N
password_last_changed: 2018-05-13 14:47:36
password_lifetime: NULL
account_locked: Y
Create_role_priv: N
Drop_role_priv: N
Password_reuse_history: NULL
Password_reuse_time: NULL
*************************** 2. row ***************************
Host: localhost
User: mysql.session
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: Y
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
password_expired: N
password_last_changed: 2018-05-13 14:47:36
password_lifetime: NULL
account_locked: Y
Create_role_priv: N
Drop_role_priv: N
Password_reuse_history: NULL
Password_reuse_time: NULL
*************************** 3. row ***************************
Host: localhost
User: mysql.sys
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
password_expired: N
password_last_changed: 2018-05-13 14:47:36
password_lifetime: NULL
account_locked: Y
Create_role_priv: N
Drop_role_priv: N
Password_reuse_history: NULL
Password_reuse_time: NULL
*************************** 4. row ***************************
Host: localhost
User: root
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19
password_expired: N
password_last_changed: 2018-05-13 14:47:39
password_lifetime: NULL
account_locked: N
Create_role_priv: Y
Drop_role_priv: Y
Password_reuse_history: NULL
Password_reuse_time: NULL
4 rows in set (0.00 sec)
从这里可以看出, \G
可以方便地以更好的格式查看记录。 现在让我们创建一个用户并检查记录。
mysql> create user 'abhishek'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.10 sec)
现在,您可以使用where子句指定用户属性来检查用户,如下所示。
mysql> select * from user where User='abhishek' \G;
*************************** 1. row ***************************
Host: localhost
User: abhishek
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19
password_expired: N
password_last_changed: 2018-05-30 21:22:45
password_lifetime: NULL
account_locked: N
Create_role_priv: N
Drop_role_priv: N
Password_reuse_history: NULL
Password_reuse_time: NULL
1 row in set (0.01 sec)
当前,该用户尚未获得任何授权。 因此,在以上输出中,所有用户授权都标有N。 让我们向用户提供授权,以选择和查看教程模式的记录。
mysql> GRANT SELECT ON *.* TO 'abhishek'@'localhost';
Query OK, 0 rows affected (0.06 sec)
mysql> select * from user where User='abhishek' \G;
*************************** 1. row ***************************
Host: localhost
User: abhishek
Select_priv: Y
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19
password_expired: N
password_last_changed: 2018-05-30 21:22:45
password_lifetime: NULL
account_locked: N
Create_role_priv: N
Drop_role_priv: N
Password_reuse_history: NULL
Password_reuse_time: NULL
1 row in set (0.00 sec)
授予选择授予后,您可以看到第一个授予属性select_priv变为Y。 global_grants
表包含分配给每个用户的全局授权的列表。 您可以通过直接查看表中的记录来进行检查。 当前,它将仅列出根用户的全局授权,因为它是此时唯一拥有全局授权的用户。
MySQL下一个用于存储主要管理数据的数据库是sys数据库。 该数据库包含数据库的实时数据,例如已连接用户的详细信息,活动会话的详细信息,运行线程的详细信息以及其他几个参数,例如延迟,服务器状态,服务器日志,服务器编码配置等。 最重要的表包括session,host_summary和user_summary 。
这些表中每个表的详细信息如下:
- session:包含有关当前活动会话的详细信息。 它显示有关当前活动线程,上次执行的查询以及延迟时间的详细信息。 如果发生锁定或高延迟查询执行,则可以使用此表来标识进程。
- host_summary:此表包含通过此服务器提供服务的主机的详细信息。 可以通过多个主机域连接到服务器。 该表有助于识别活动连接的主机详细信息
- user_summary:包含已连接用户的详细信息。 如果每个用户有多个会话,则此表显示具有活动连接数的单个记录,而会话表显示指示每个连接线程的多个记录。
9.结论
本文探讨了从连接到数据库的创建和更新以及数据库管理开始,将使用MySQL命令行完成的所有主要任务。 此外,您还可以探索有关更改表,可用数据类型和功能的详细信息。