MySQL基本操作
一、MySQL的使用
如果通过命令行启动和停止MySQL数据库,一定要以管理员身份运行命令行cmd。
否则,会出现错误。
1、启动和停止MySQL服务
(1)通过Windows计算机管理方式
右击此电脑—管理—服务和应用程序—服务,启动或停止MySQL服务
(2)通过命令行方式
- 启动:net start mysql
- 停止:net stop mysql
一定要以管理员的身份打开cmd命令。
2、登录和退出MySQL数据库
(1)使用命令行登录和退出
mysql -h localhost -P 3306 -u root -p1234 db_hr -e"select * from user;"
- 最前面的mysql你可以理解成一个关键字或者理解成一个固定的命令,是固定写法,类似于java、jdk中的javac命令或java命令;
- -h表示host,即主机的ip地址——127.0.0.1;
- -P表示port,端口,mysql数据库的默认端口是3306,当然,你也可以自己修改端口号,我这里没改端口号(注意:这是大写的字母P);
- -u表示user用户名,这里是root;
- -p表示password密码1234(注意:这是小写的字母p);
- db_hr:数据库名表示登录到哪一个数据库中;
- -e参数后面可以直接加SQL语句。登录mysql服务器之后,立即执行这个SQL语句。-e后面不要有空格。
下面说说mysql这个命令的注意事项:
大写的P表示端口号,小写的p表示密码;
小写的p表示密码,-p和密码之间一定不能有空格,其他的像-u,-h,-P之类的,是可以有空格的,也可以没有空格。
如果是本机的话,主机ip和端口号可以不写(即主机ip和端口号可以省略),直接写成mysql -u root -p1234
如果是本机,但是端口号你改成了其他的端口号,不是默认的3306了,比如你把端口号改成了6688,那你就加上端口号,即mysql -P 6688 -u root -p1234
以下这3种语法都是正确的,我依次举例和截图演示:
我这里用的用户名是root,密码也是1234
语法1:mysql -h 主机ip地址 -P 端口号 -u 用户名 -p密码
(-h和主机ip地址之间有空格,-P和端口号之间有空格,-u和用户名之间有空格,-p和密码之间一定不能有空格)
mysql -h localhost -P 3306 -u root -p1234
如果是本机的话,主机ip地址和端口号(是默认3306的情况下)-h localhost -P 3306可以省略不写,
mysql -u root -p1234
如果是本机,但是端口你之前改成了其他的,比如端口你改成了8801,不是默认的3306端口了,那么主机ip地址可以省略不写,但是要写上端口号,
mysql -P 8801 -u root -p1234
如果是远程主机的话,必须写-h 远程主机的ip,
mysql -h 192.168.117.66 -P 3306 -u root -p1234
如果远程主机的mysql数据库端口默认是3306,那端口号可以省略不写,但是远程主机的ip地址要写,
mysql -h 192.168.117.66 -u root -p1234
如果远程主机的mysql数据库端口不是默认的3306,端口而被改成了比如6655,那远程主机ip地址和端口号都要写上,
mysql -h 192.168.117.66 -P 6655 -u root -p1234
语法2:mysql -h主机 ip地址 -P端口号 -u用户名 -p密码
(-h和主机ip地址之间无空格,-P和端口号之间无空格,-u和用户名之间无空格,-p和密码之间一定不能有空格)
mysql -h192.168.117.66 -P3306 -uroot -p1234
语法3:mysql -h主机ip地址 -P端口号 -u用户名 -p
(最后一个-p,小写字母p后面不写密码)
mysql -h 192.168.117.66 -P 3306 -u root -p
或者
mysql -h192.168.117.66 -P3306 -uroot -p
注意:小写字母p后面不写密码,这样的话,密码就不会显示暴露出来了,输入密码的时候也是显示成****,进入数据库之后再输入密码。
退出登录,可以使用 quit 或者 exit 或者 \q 命令
(2)通过MySQL自带的客户端,仅限于root用户。
3、MySQL的相关命令
List of all client 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. --重新连接,通常用于被踢出或异常断开后重新连接,SQL*plus下也有这样一个connect命令。
delimiter (\d) Set statement delimiter.--设置命令终止符,缺省为;,比如我们可以设定为/来表示语句结束
edit (\e) Edit command with $EDITOR. --编辑缓冲区的上一条SQL语句到文件,缺省调用vi,文件会放在/tmp路径下
ego (\G) Send command to MariaDB server, display result vertically. --控制结果显示为垂直显示
exit (\q) Exit mysql. Same as quit. --退出mysql
go (\g) Send command to MariaDB server. --发送命令到mysql服务
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. --设置pager方式,可以设置为调用more,less等等,主要是用于分页显示
print (\p) Print current command.
prompt (\R) Change your mysql prompt. --改变mysql的提示符
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.
注意:上面的所有命令,扩号内的为快捷操作,即只需要输入“\”+ 字母即可执行。
二、MySQL支持的基本数据类型
1、数值类型
MySQL 支持所有标准 SQL 数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC)、近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB 和 BDB表。
作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
|---|---|---|---|---|
| TINYINT | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
| SMALLINT | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
| MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
| INT或INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
| BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
| FLOAT | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
| DOUBLE | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
| DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
2、字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
该节描述了这些类型如何工作以及如何在查询中使用这些类型。
| 类型 | 大小 | 用途 |
|---|---|---|
| CHAR | 0-255 bytes | 定长字符串 |
| VARCHAR | 0-65535 bytes | 变长字符串 |
| TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
| TINYTEXT | 0-255 bytes | 短文本字符串 |
| BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
| TEXT | 0-65 535 bytes | 长文本数据 |
| MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
| MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
| LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
| LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
3、日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
| 类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
|---|---|---|---|---|
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
| TIMESTAMP | 4 |
1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 |
YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
三、数据库的基本操作
1、创建和查看数据库
我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下:
CREATE DATABASE 数据库名;
以下命令简单的演示了创建数据库的过程,数据名为db_hr:
mysql> create DATABASE db_hr;
使用 show命令来查看已创建的数据库,语法如下:
mysql> show DATABASE;
另外,还可以使用 show命令来查看已创建的数据库信息,语法如下:
mysql> show CREATE DATABASE db_hr;
以上的执行结果显示数据库db_hr的创建信息,例如编码方式是utf8。
除了可以用默认的编码方式创建数据库外,还可以在创建数据库时指定编码方式,
mysql> CREATE DATABASE db_hr2 CHARACTER SET gbk;
可以看出数据库db_hr2的编码方式为gbk。
2、使用数据库
在你连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库。
在 mysql> 提示窗口中可以很简单的选择特定的数据库。你可以使用SQL命令来选择指定的数据库。语法格式如下:
use 数据库名;
mysql> use db_hr;
Database changed
在出现Database changed提示时,证明已经切换到了数据库db_hr。
mysql数据库文件的真实的物理存储位置。
mysql> show global variables like "%datadir%";
3、修改数据库
在 MySQL中,可以使用 ALTER DATABASE 语句来修改已经被创建或者存在的数据库的相关参数。修改数据库的语法格式为:
ALTER DATABASE [数据库名] { [ DEFAULT ] CHARACTER SET <字符集名> | [ DEFAULT ] COLLATE <校对规则名>}
语法说明如下:
- ALTER DATABASE 用于更改数据库的全局特性。这些特性存储在数据库目录的 db.opt 文件中。
- 使用 ALTER DATABASE 需要获得数据库 ALTER 权限。
- 数据库名称可以忽略,此时语句对应于默认数据库。
- CHARACTER SET 子句用于更改默认的数据库字符集
例如,用alter命令将数据库 db_hr2 的指定字符集修改为 gb2312,默认校对规则修改为 gb2312_unicode_ci,输入 SQL 语句与执行结果如下所示:
mysql> ALTER DATABASE db_hr2 DEFAULT CHARACTER SET gb2312 DEFAULT COLLATE gb2312_chinese_ci;
4、删除数据库
当数据库不再使用时应该将其删除,以确保数据库存储空间中存放的是有效数据。
删除数据库是将已经存在的数据库从磁盘空间上清除,清除之后,数据库中的所有数据也将一同被删除。
在 MySQL 中,当需要删除已创建的数据库时,可以使用 DROP DATABASE 语句。其语法格式为:
DROP DATABASE [ IF EXISTS ] <数据库名>
语法说明如下:
- <数据库名>:指定要删除的数据库名。
- IF EXISTS:用于防止当数据库不存在时发生错误。
- DROP DATABASE:删除数据库中的所有表格并同时删除数据库。使用此语句时要非常小心,以免错误删除。如果要使用 DROP DATABASE,需要获得数据库 DROP 权限。
注意:MySQL 安装后,系统会自动创建名为 information_schema 和 mysql 的两个系统数据库,系统数据库存放一些和数据库相关的信息,如果删除了这两个数据库,MySQL 将不能正常工作。
使用命令行工具将数据库db_hr2从数据库列表中删除,输入的 SQL 语句与执行结果如下所示:
mysql> DROP DATABASE db_hr2;
此时数据库db_hr2不存在。再次执行相同的命令,直接使用 DROP DATABASE db_hr2,系统会报错,如下所示:
如果使用IF EXISTS从句,可以防止系统报此类错误,如下所示:
mysql> DROP DATABASE IF EXISTS db_hr2;
使用 DROP DATABASE 命令时要非常谨慎,在执行该命令后,MySQL 不会给出任何提示确认信息。
DROP DATABASE 删除数据库后,数据库中存储的所有数据表和数据也将一同被删除,而且不能恢复。
因此最好在删除数据库之前先将数据库进行备份。备份数据库的方法会在教程后面进行讲解。
四、表的基本操作
1、创建数据表
在创建数据库之后,接下来就要在数据库中创建数据表。所谓创建数据表,指的是在已经创建的数据库中建立新表。
创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性)约束的过程。
创建MySQL数据表需要以下信息:
- 表名
- 表字段名
- 定义每个表字段
接下来我们介绍一下创建数据表的语法形式。
可以使用 CREATE TABLE 语句创建表。其语法格式为:
CREATE TABLE <表名> ([表定义选项])[表选项][分区选项];
其中,[表定义选项]的格式为:<列名1> <类型1> [,…] <列名n> <类型n>
CREATE TABLE 命令语法比较多,其主要是由表创建定义(create-definition)、表选项(table-options)和分区选项(partition-options)所组成的。
这里首先描述一个简单的新建表的例子,然后重点介绍 CREATE TABLE 命令中的一些主要的语法知识点。
CREATE TABLE 语句的主要语法及使用说明如下:
- CREATE TABLE:用于创建给定名称的表,必须拥有表CREATE的权限。
- <表名>:指定要创建表的名称,在 CREATE TABLE 之后给出,必须符合标识符命名规则。表名称被指定为 db_name.tbl_name,以便在特定的数据库中创建表。无论是否有当前数据库,都可以通过这种方式创建。在当前数据库中创建表时,可以省略 db_name。如果使用加引号的识别名,则应对数据库和表名称分别加引号。例如,'mydb'.'mytbl' 是合法的,但 'mydb.mytbl' 不合法。
- <表定义选项>:表创建定义,由列名(col_name)、列的定义(column_definition)以及可能的空值说明、完整性约束或表索引组成。
- 默认的情况是,表被创建到当前的数据库中。若表已存在、没有当前数据库或者数据库不存在,则会出现错误。
提示:使用 CREATE TABLE 创建表时,必须指定以下信息:
- 要创建的表的名称不区分大小写,不能使用SQL语言中的关键字,如DROP、ALTER、INSERT等。
- 数据表中每个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开。
(1)在指定的数据库中创建表
数据表属于数据库,在创建数据表之前,应使用语句“USE <数据库>”指定操作在哪个数据库中进行,
如果没有选择数据库,就会抛出 No database selected 的错误。
创建员工表 tb_emp1,结构如下表所示。
| 字段名称 | 数据类型 | 备注 |
|---|---|---|
| id | INT(10) | 员工编号 |
| name | VARCHAR(25) | 员工名称 |
| deptld | INT(10) | 所在部门编号 |
| salary | FLOAT | 工资 |
如果之前创建过数据库,可以使用之前创建的数据库,如果没有,我们可以新建一个数据库,我们创建一个新的数据库db_test。
mysql> create DATABASE db_test;
Query OK, 1 row affected (0.00 sec)
选择创建表的数据库 db_test,创建 tb_emp1 数据表,输入的 SQL 语句和运行结果如下所示。
mysql> use db_test;
Database changed
mysql> CREATE TABLE tb_emp1 ( id INT(10), name VARCHAR(25), deptId INT(10), salary FLOAT );
Query OK, 0 rows affected (0.02 sec)
语句执行后,便创建了一个名称为 tb_emp1 的数据表,使用 SHOW TABLES;语句查看数据表是否创建成功,如下所示。
可以看出,数据库中已经成功创建了tb_emp1表。
2、查看数据表
我们可以通过SHOW CREATE TABLE语句来查看数据表,语法格式如下。
SHOW CREATE TABLE <表名>
查看前面创建的tb_emp1表。
mysql> SHOW CREATE TABLE tb_emp1;
结果看起来有点乱,我们可以在查询语句后面加上参数“\G”进行格式化。
mysql> SHOW CREATE TABLE tb_emp1 \G;
这样看起来比之前整齐多了。
另外,我们还可以使用DESCRIBE语句或简写形式DESC语句查看表中列的信息。语法格式如下。
DESCRIBE <表名>;
DESC <表名>;
mysql> DESCRIBE tb_emp1;