版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

MySQL启动和关闭

在之前的安装配置阶段将MySQL服务器设置成了一个名为MySQL80的Windows服务,所以可以通过Windows服务的方式来启动和关闭Windows服务器程序。

除了通过可视化界面来管理Windows服务,还可以直接在命令行操作,以管理员身份运行cmd命令提示符,输入net start MySQL80启动服务,输入net stop MySQL80关闭服务。

由于安装阶段已经将MySQL80服务设置成开机启动,所以MySQL服务开机即可用,不需要手动开启。

客户端/服务器架构

MySQL使用客户端/服务器构架,服务器负责和存储的数据打交道,客户端先连接到服务器,再通过向服务器发送增删改查命令来对存储的数据进行处理。

客户端与服务器之间的连接一般是网络连接,当然如果客户端和服务器位于同一台机器上,也可以借助管道(pipe)来进行连接。

客户端与服务器连接时需要提供用户名和密码才能登录服务器,这点和Linux的用户系统一样,服务器负责用户管理和权限管理,只有管理员用户才可以进行高阶操作。

MySQL的日常使用场景如下:

  1. 启动MySQL服务器程序。
  2. 启动MySQL客户端程序,连接到服务器。
  3. 客户端输入增删改查命令,这些命令会作为请求转发给服务器。服务器收到请求后执行对应的操作,并将结果返回给客户端。

bin目录下的可执行文件

MySQL默认安装到C:\Program Files\MySQL\MySQL Server 8.0目录,该目录下的bin文件夹存放了一系列的可执行文件,其中就包含MySQL的客户端程序和服务器程序,为了操作方便,先将这个目录添加到Windows的Path环境变量中。目录,该目录下的bin文件夹存放了一系列的可执行文件,其中就包含MySQL的客户端程序和服务器程序,为了操作方便,先将bin目录添加到Windows的Path环境变量中。

bin文件夹中重要的可执行文件有以下几个:

  • mysql.exe
  • mysqladmin.exe
  • mysqlbinlog.exe
  • mysqlcheck.exe
  • mysqld.exe
  • mysqldump.exe
  • mysqlimport.exe
  • mysqldump.exe

其中mysqld.exe是MySQL服务器程序,mysql.exe是MySQL客户端程序,mysqladmin.exe是MySQL的管理工具,其他的暂时不需要理会。

服务器程序

接下来通过命令行来手动启动MySQL服务器程序,在启动之前需要先停止原先在计算机上运行的MySQL80服务器程序(服务管理界面停止MySQL80服务或是在命令行执行net stop MySQL80)。手动启动mysqld时,需要传入两个参数,一个是--datadir,表示数据库存储位置,这个位置在Windows上安装完全后默认为C

手动启动mysqld时可以传入参数,其中比较重要的一个是--datadir,表示数据库存储位置,如果不指定这个参数,则会默认以C:\Program Files\MySQL\MySQL Server 8.0\data\作为存储路径,需要确保这个路径存在。另外,Windows上MySQL安装程序运行结束后默认会创建C:\ProgramData\MySQL\MySQL Server 8.0\Data路径,作为MySQL80服务的数据库路径。另一个可选的参数是--console,表示mysqld直接在前台运行,不切换到后台,这样可以方便观察mysqld的打印输出。

代码块
mysqld --datadir="C:\ProgramData\MySQL\MySQL Server 8.0\Data" --console
提示
iconfalse
  • --datadir 指定数据库路径 
  • --console 表示前台运行

其他参数可通过mysqld --verbose --help来查看。

客户端程序

服务器程序启动成功后,接下来启动客户端程序以连接服务器。

mysql.exe是MySQL的客户端程序,它的启动方式如下:

代码块
mysql -h主机名 -u用户名 -p密码

注意上面的-h -u -p与后面跟的参数之间没有空格。

参数名含义
-h指定MySQL服务器所在的主机名或IP地址,默认为localhost或者127.0.0.1,还可以写成"--host=主机名"的形式
-u指定用户名,超级管理员的用户名是root,等效于"--user=用户名"。
-p指定密码,等效于"--password=密码"。
提示

-h和-u后面的参数可以带空格,但-p不行,比如mysql -h localhost -u root -p12345

指定完前面的参数后,还可以在后面直接指定登录后要使用的数据库,以省去USE数据库操作,比如:

mysql -h localhost -u root -p12345 testdb

警告

最好不要在命令行中输入密码,以防止泄露。正确的做法是只输入-p但不跟密码参数,这样MySQL会在接下来要求输入密码,这时输入的密码不会回显,所以相对安全。

初识MySQL语句

语句结束符

以下几个符号表示一条语句的结束:

  • \g
  • \G 

比如:

代码块
mysql> SELECT NOW();
mysql> SELECT NOW()\g
mysql> SELECT NOW()\G

注意,\G返回的结果不以表格形式显示,而是以列的方式展示,如下:

代码块
mysql> SELECT NOW()\g
+---------------------+
| NOW()               |
+---------------------+
| 2022-01-19 14:49:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT NOW()\G
*************************** 1. row ***************************
NOW(): 2022-01-19 14:50:05
1 row in set (0.00 sec)

语句可以随意换行

在未遇到结束符之前,一条语句可以跨越多行,如下:

代码块
mysql> SELECT
    -> NOW()
    -> ;
+---------------------+
| NOW()               |
+---------------------+
| 2022-01-19 14:51:13 |
+---------------------+
1 row in set (0.00 sec)

可以一次提交多个语句

如下:

代码块
mysql> SELECT NOW(); SELECT NOW(); SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2022-01-19 14:52:08 |
+---------------------+
1 row in set (0.00 sec)

+---------------------+
| NOW()               |
+---------------------+
| 2022-01-19 14:52:08 |
+---------------------+
1 row in set (0
\Data。另一个是
.00 sec)

+---------------------+
| NOW()               |
+---------------------+
| 2022-01-19 14:52:08 |
+---------------------+
1 row in set (0.00 sec)

使用\c放弃本次操作

如下:

代码块
mysql> SELECT NOW() \c
mysql>

字符串的表示

使用单引号或双引号(不推荐)来表示字符串,如下:

代码块
mysql> SELECT 'aaa';
+-----+
| aaa |
+-----+
| aaa |
+-----+
1 row in set (0.00 sec)

mysql> SELECT "aaa";
+-----+
| aaa |
+-----+
| aaa |
+-----+
1 row in set (0.00 sec)
提示

严格按照单引号来引用字符串,这是SQL标准,如果字符串本身包含单引号,则要用两个单引号来进行转义,比如:

代码块
mysql> select 'ha''ha';
+-------+
| ha'ha |
+-------+
| ha'ha |
+-------+

双引号不是SQL标准,只是MySQL数据库对双引号进行了扩展,使其也能用于界定字符串。另外,MySQL中有一种名为ANSI_QUOTES的模式,如果开启了这种模式,双引号就有其他特殊的用途了。

在MySQL中,还存在反引号的用法,反引号的作用是将MySQL中的保留字用作列名或表名时的转义方法,比如:

代码块
mysql> DROP TABLE IF EXISTS second_table;
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> CREATE TABLE second_table (
    -> id VARCHAR(10),
    -> desc VARCHAR(100)
    -> );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc VARCHAR(100)
)' at line 3

mysql> CREATE TABLE second_table (
    -> id VARCHAR(10),
    -> `desc` VARCHAR(100)
    -> );
Query OK, 0 rows affected (0.06 sec)

上面的示例中,第一次尝试创建表失败,因为desc是MySQL的保留字,不可以直接用作列名,第二次使用反引号后,desc被当成了正常的字符串来使用,语句执行成功。

反引号也可以用在普通字符串上,用来表示表名或列名。


另外,在SQLite数据库中,双引号和单引号会更加纠缠不清,具体可以看这个吐槽的帖子:

Stop double-quoting in your SQL!!!!!!!!!! | CivFanatics Forums









目录