Mysql-基础命令
Mysql基础命令
1.mysql命令分类
数据定义语言(DDL)
DDL全称是Data Definition Language,即数据定义语言,定义语言就是定义关系模式、删除关系、修改关系模式以及创建数据库中的各种对象,比如表、聚簇、索引、视图、函数、存储过程和触发器等等。
数据操纵语言(DML)
数据操纵语言全程是Data Manipulation Language,主要是进行插入元组、删除元组、修改元组的操作。主要有insert、update、delete语法组成。
数据查询语言(DQL)
数据查询语言全称是Data Query Language,所以是用来进行数据库中数据的查询的,即最常用的select语句
数据控制语言(DCL)
数据控制语言:Data Control Language。用来授权或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,能够对数据库进行监视。
比如常见的授权、取消授权、回滚、提交等等操作。
2. mysql 数据类型
2.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.2 日期和时间类型
表示时间值的日期和时间类型为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 | 混合日期和时间值,时间戳 |
2.3 字符串类型
字符串类型指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 类型,可存储的最大长度不同,可根据实际情况选择。
2.4 数据类型的属性
MySQL关键字 | 含义 |
---|---|
NULL | 数据列可包含NULL值 |
NOT NULL | 数据列不允许包含NULL值 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
UNIQUE KEY | 唯一键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
CHARACTER SET name | 指定一个字符集 |
主键与唯一键的区别:
共同点:字段值唯一,不允许有重复的值
不同点:一个表中只能有一个主键,但可以有多个唯一键。
主键字段中不允许有NULL值,唯一键是允许有多个null值
3. mysql数据库的基础操作
在使用sql语句的时候,注意每个语句后必须有分号。
3.1 查询库与表
##1.查看已有数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
##2.查看数据库中的表
##先切换库
mysql> use employees;
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_employees |
+----------------------+
| current_dept_emp |
| departments |
| dept_emp |
| dept_emp_latest_date |
| dept_manager |
| employees |
| salaries |
| titles |
+----------------------+
8 rows in set (0.00 sec)
##3.查询表结构
##以表格形式展示表结构
mysql> describe employees;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
##以建表语句显示表结构(信息更加详细)\G,表示将查询结果进行按列打印
mysql> show create table employees\G;
*************************** 1. row ***************************
Table: employees
Create Table: CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
3.2 Create 创建操作
##1.创建新的数据库
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| performance_schema |
| test1 |
+--------------------+
5 rows in set (0.00 sec)
##2.创建新表
mysql> use test1;
Database changed
mysql> create table test_tb1(
-> test_id INT NOT NULL AUTO_INCREMENT,
-> test_title VARCHAR(100) NOT NULL,
-> test_author VARCHAR(40) NOT NULL,
-> create_date DATE,
-> PRIMARY KEY( test_id )
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.20 sec)
##如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
##AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
##PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
##ENGINE 设置存储引擎,CHARSET 设置编码。
注意:MySQL命令终止符为分号 ; 。
注意: -> 是换行符标识,不要复制。
建表的通用格式为
CREATE TABLE table_name (column_name column_type);
创建MySQL数据表需要以下信息:
- 表名
- 表字段名
- 定义每个表字段
3.3 Update 更新操作(插入和修改)
3.3.1 表数据的插入与修改
以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
如果数据是字符型,必须使用单引号或者双引号,如:"value"。
##1.单条逐个插入
mysql> INSERT INTO test_tb1
-> (test_title,test_author,create_date)
-> VALUES
-> ("通信原理", "江晓林", NOW());
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> INSERT INTO test_tb1
-> (test_title, test_author, create_date)
-> VALUES
-> ("计算机网络", "谭浩强", NOW());
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> INSERT INTO test_tb1
-> (test_title, test_author, create_date)
-> VALUES
-> ("mysql基础教程", "菜鸟教程", '2016-05-06');
Query OK, 1 row affected (0.00 sec)
##NOW()获取当前时间,由于test_id为自增键,所以可以在添加数据的时候,不选择插入它的值
mysql> select * from test_tb1;
+---------+-------------------+--------------+-------------+
| test_id | test_title | test_author | create_date |
+---------+-------------------+--------------+-------------+
| 1 | 通信原理 | 江晓林 | 2022-05-24 |
| 2 | 计算机网络 | 谭浩强 | 2022-05-24 |
| 3 | mysql基础教程 | 菜鸟教程 | 2016-05-06 |
+---------+-------------------+--------------+-------------+
3 rows in set (0.00 sec)
##2.批量插入数据,不同数据用逗号隔开
mysql> INSERT INTO test_tb1
-> (test_title,test_author,create_date)
-> VALUES
-> ("斗破苍穹","天蚕土豆",'2009-10-01'),
-> ("冒牌大英雄","七十二编",'2008-9-22');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from test_tb1;
+---------+-------------------+--------------+-------------+
| test_id | test_title | test_author | create_date |
+---------+-------------------+--------------+-------------+
| 1 | 通信原理 | 江晓林 | 2022-05-24 |
| 2 | 计算机网络 | 谭浩强 | 2022-05-24 |
| 3 | mysql基础教程 | 菜鸟教程 | 2016-05-06 |
| 4 | 斗破苍穹 | 天蚕土豆 | 2009-10-01 |
| 5 | 冒牌大英雄 | 七十二编 | 2008-09-22 |
+---------+-------------------+--------------+-------------+
5 rows in set (0.00 sec)
以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法:
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
- 你可以同时更新一个或多个字段。
- 你可以在 WHERE 子句中指定任何条件。
- 你可以在一个单独表中同时更新数据。
当你需要更新数据表中指定行的数据时 WHERE 子句是非常有用的。如果不使用where语句进行条件限制,使用UPDATE语句将会修改该字段的所有数据。
mysql> UPDATE test_tb1 SET test_author='龙光利' WHERE test_id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from test_tb1;
+---------+-------------------+--------------+-------------+
| test_id | test_title | test_author | create_date |
+---------+-------------------+--------------+-------------+
| 1 | 通信原理 | 龙光利 | 2022-05-24 |
| 2 | 计算机网络 | 谭浩强 | 2022-05-24 |
| 3 | mysql基础教程 | 菜鸟教程 | 2016-05-06 |
| 4 | 斗破苍穹 | 天蚕土豆 | 2009-10-01 |
| 5 | 冒牌大英雄 | 七十二编 | 2008-09-22 |
+---------+-------------------+--------------+-------------+
5 rows in set (0.00 sec)
3.3.2 表结构的修改
利用alter可修改表的结构。
首先创建一个测试表alter_tbl。
mysql> create table alter_tbl(
-> first varchar(10),
-> second varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> desc alter_tbl;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| first | varchar(10) | YES | | NULL | |
| second | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
使用drop可以删除一个字段。
mysql> ALTER TABLE alter_tbl DROP first;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc alter_tbl;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| second | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)
使用add可以增加一个字段。但默认新加的字段会添加刀数据表字段的末尾。
mysql> ALTER TABLE alter_tbl ADD first varchar(15);
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc alter_tbl;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| second | varchar(10) | YES | | NULL | |
| first | varchar(15) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
如果需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
mysql> ALTER TABLE alter_tbl ADD id INT FIRST;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc alter_tbl;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| second | varchar(10) | YES | | NULL | |
| first | varchar(15) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
使用change字句,可以修改字段名称,并指定新字段名称和类型。
mysql> ALTER TABLE alter_tbl change first phone INT;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc alter_tbl;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| second | varchar(10) | YES | | NULL | |
| phone | int(11) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
使用rename可以修改表名。
mysql> ALTER TABLE alter_tbl RENAME TO test_tbl2;
Query OK, 0 rows affected (0.20 sec)
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| test_tb1 |
| test_tbl2 |
+-----------------+
2 rows in set (0.00 sec)
3.4 数据查询select
select是mysql当中最重要的操作,这里仅介绍简单的用法。
##1.查询一个表的所有数据
mysql> select * from test_tb1;
+---------+-------------------+--------------+-------------+
| test_id | test_title | test_author | create_date |
+---------+-------------------+--------------+-------------+
| 1 | 通信原理 | 龙光利 | 2022-05-24 |
| 2 | 计算机网络 | 谭浩强 | 2022-05-24 |
| 3 | mysql基础教程 | 菜鸟教程 | 2016-05-06 |
| 4 | 斗破苍穹 | 天蚕土豆 | 2009-10-01 |
| 5 | 冒牌大英雄 | 七十二编 | 2008-09-22 |
+---------+-------------------+--------------+-------------+
5 rows in set (0.00 sec)
##2.使用where语句可以限定查询条件
mysql> select * from test_tb1 where test_id=1;
+---------+--------------+-------------+-------------+
| test_id | test_title | test_author | create_date |
+---------+--------------+-------------+-------------+
| 1 | 通信原理 | 龙光利 | 2022-05-24 |
+---------+--------------+-------------+-------------+
1 row in set (0.00 sec)
##3.使用and和or可以更加具体的限定条件
mysql> select * from test_tb1 where test_id<4 and test_author='菜鸟教程';
+---------+-------------------+--------------+-------------+
| test_id | test_title | test_author | create_date |
+---------+-------------------+--------------+-------------+
| 3 | mysql基础教程 | 菜鸟教程 | 2016-05-06 |
+---------+-------------------+--------------+-------------+
1 row in set (0.00 sec)
mysql> select * from test_tb1 where test_id<3 or test_id =5;
+---------+-----------------+--------------+-------------+
| test_id | test_title | test_author | create_date |
+---------+-----------------+--------------+-------------+
| 1 | 通信原理 | 龙光利 | 2022-05-24 |
| 2 | 计算机网络 | 谭浩强 | 2022-05-24 |
| 5 | 冒牌大英雄 | 七十二编 | 2008-09-22 |
+---------+-----------------+--------------+-------------+
3 rows in set (0.00 sec)