数据表
目录
内容概述
1.MySQL数据表
-1.1 表的增删改查
-1.2 表数据的增删改查
-1.3 排序与去重
-1.4 其他语句
-1.5 where语句以及having语句
内容详细
1.MySQL数据表
数据表是数据库的重要组成部分,每一个数据库都是由若干个数据表组成的。换句话说,没有数据表就无法在数据库中存放数据。
1.1 表的增删改查
创建表
1.创建数据表
# 基本语法
在 MySQL 中,可以使用 CREATE TABLE 语句创建表。其语法格式为:
1.基本语法:
在 MySQL 中,可以使用 CREATE TABLE 语句创建表。其语法格式为:
CREATE TABLE <表名> ([表定义选项])[表选项][分区选项];
其中[表定义选项]的格式为:
<列名1> <类型1> [,…] <列名n> <类型n>
CREATE TABLE 语句的主要语法及使用说明如下:
● CREATE TABLE:用于创建给定名称的表,必须拥有表CREATE的权限。
● <表名>:指定要创建表的名称,在 CREATE TABLE 之后给出,必须符合标识符命名规则。表名称被指定为 db_name.tbl_name,以便在特定的数据库中创建表。无论是否有当前数据库,都可以通过这种方式创建。在当前数据库中创建表时,可以省略 db-name。如果使用加引号的识别名,则应对数据库和表名称分别加引号。例如,'mydb'.'mytbl' 是合法的,但 'mydb.mytbl' 不合法。
● <表定义选项>:表创建定义,由列名(col_name)、列的定义(column_definition)以及可能的空值说明、完整性约束或表索引组成。
● 默认的情况是,表被创建到当前的数据库中。若表已存在、没有当前数据库或者数据库不存在,则会出现错误。
创建表的格式
create table <table name> (字段名 字段类型,字段名n 字段类型n) ENGINE=<存储引擎> CHARSET=<字符集编码>;
案例:
create table test01(id int(11), name varchar(25));
mysql> show tables;
+------------------+
| Tables_in_xiaohu |
+------------------+
| rng |
+------------------+
1 row in set (0.00 sec)
创建一个班级表
mysql> CREATE TABLE class (
-> id int,
-> name varchar(100),
-> age tinyint(2),
-> sex enum("1","2")
-> )ENGINE=InnoDB CHARSET=utf8mb4;
Query OK, 0 rows affected (0.00 sec)
查看表
查看表
mysql> SHOW CREATE TABLE class\G
*************************** 1. row ***************************
Table: class
Create Table: CREATE TABLE `class` (
`id` int(11) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`age` tinyint(2) DEFAULT NULL,
`sex` enum('1','2') DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
mysql> DESC class;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(100) | YES | | NULL | |
| age | tinyint(2) | YES | | NULL | |
| sex | enum('1','2') | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
Field :字段名称
Type :字段类型
Null :是否可以为空
Key :约束
Default :默认值
修改表
修改表结构
# 修改表名称
mysql> ALTER TABLE class RENAME TO linux13_class;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-------------------+
| Tables_in_linux13 |
+-------------------+
| linux13_class |
# 修改表字符集编码
mysql> ALTER TABLE linux13_class CHARACTER SET utf8;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE linux13_class\G
*************************** 1. row ***************************
Table: linux13_class
Create Table: CREATE TABLE `linux13_class` (
`id` int(11) DEFAULT NULL,
`name` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL,
`age` tinyint(2) DEFAULT NULL,
`sex` enum('1','2') CHARACTER SET utf8mb4 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
# 修改表字段
mysql> ALTER TABLE linux13_class CHANGE name name varchar(50);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE linux13_class\G
*************************** 1. row ***************************
Table: linux13_class
Create Table: CREATE TABLE `linux13_class` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`age` tinyint(2) DEFAULT NULL,
`sex` enum('1','2') CHARACTER SET utf8mb4 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
# 修改字段的数据类型
mysql> ALTER TABLE linux13_class MODIFY age int;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE linux13_class\G
*************************** 1. row ***************************
Table: linux13_class
Create Table: CREATE TABLE `linux13_class` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` enum('1','2') CHARACTER SET utf8mb4 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
删除表
1.删除字段
mysql> SHOW CREATE TABLE linux13_class\G
*************************** 1. row ***************************
Table: linux13_class
Create Table: CREATE TABLE `linux13_class` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` enum('1','2') CHARACTER SET utf8mb4 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> ALTER TABLE linux13_class DROP sex;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE linux13_class\G
*************************** 1. row ***************************
Table: linux13_class
Create Table: CREATE TABLE `linux13_class` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
2.删除表
mysql> DROP TABLE linux13_class;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE TABLE linux13_class\G
ERROR 1146 (42S02): Table 'linux13.linux13_class' doesn't exist
增加字段
MySQL 数据表是由行和列构成的,通常把表的“列”称为字段(Field),把表的“行”称为记录(Record)。随着业务的变化,可能需要在已有的表中添加新的字段。
# 在开头位置添加字段
MySQL 默认在表的最后位置添加新字段,如果希望在开头位置(第一列的前面)添加新字段,那么可以使用 FIRST 关键字。
ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] FIRST;
案例:
alter table test01 add name varchar(20) first;
# 在中间位置添加字段
MySQL 除了允许在表的开头位置和末尾位置添加字段外,还允许在中间位置(指定的字段之后)添加字段,此时需要使用 AFTER 关键字。
alter table <表名> add <新字段名> <数据类型> [约束条件] after <已经存在的字段名>;
after 的作用是将新字段添加到某个已有字段后面
alter table test01 sex varchar (20) after id;
# 在末尾位置添加字段
一个完整的字段包括字段名、数据类型和约束条件。
ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件];
对语法格式的说明如下:
● <表名> 为数据表的名字
● <新字段名> 为所要添加的字段的名字
● <数据类型> 为所要添加的字段能存储数据的数据类型
● [约束条件] 是可选的,用来对添加的字段进行约束
使用alter table 语句添加一个 INT类型的字段age,SQL语句和运行结果如下:
alter table test01 add addr varchar(20);
1.2 表数据的增删改查
表相当于文件,表中保存的其实是真正的数据,接下来介绍表数据的各种常见操作。
增加表数据
增加数据其实就是向表中插入数据,或者是向表中添加数据
格式:
INSERT INTO <表名> (字段1,字段2,...字段n) VALUES (数据1,数据2...数据n);
案例:
-- 创建一个班级表
CREATE TABLE class(
id int,
name varchar(50),
age tinyint(2),
sex enum('1','2')
);
-- 向班级中插入数据
INSERT INTO class (id,name,age,sex) VALUES (1,'同学1',22,1);
INSERT INTO class (id,name,age,sex) VALUES (2,'同学2',23,2);
当要插入的数据所有字段都涉及到了,那么括号中的字段可以省略;当插入的字段没有全部涉及到,那么字段则不能省略。
mysql> INSERT INTO class VALUES (3, '小帅哥', 17, 1);
Query OK, 1 row affected (0.00 sec)
查询数据
表中保存了许多数据,其目的就是为了使用的时候可以查询出来,查询语句使用的频率比较多,下面我么介绍查询语法:
格式:
SELECT [查询字段] FROM [表名] [条件语句] [显示规则] [规则条件]
案例:
-- * 默认代表所有的字段
mysql> SELECT * FROM class;
+------+-----------+------+------+
| id | name | age | sex |
+------+-----------+------+------+
| 1 | 班长 | 18 | 1 |
| 2 | 小仙女 | 16 | 2 |
| 3 | 小帅哥 | 17 | 1 |
+------+-----------+------+------+
3 rows in set (0.00 sec)
-- 查询指定字段
mysql> SELECT name FROM class;
+-----------+
| name |
+-----------+
| 班长 |
| 小仙女 |
| 小帅哥 |
+-----------+
3 rows in set (0.00 sec)
条件语句(where)
条件语句可以用来筛选数据,主要用于查询某些数据,下面我们介绍条件语句
# 判断条件
> :大于
< : 小于
= :等于
!= 和 <> : 不等于
>= : 大于等于
<= : 小于等于
like : 模糊查询
and : 并且
or :或者
案例1:要求查出id>1的所有信息
mysql> select * from class01 where id > 1;
+------+-------+------+------+
| id | name | age | sex |
+------+-------+------+------+
| 2 | ak47 | 47 | 1 |
| 3 | m4 | 20 | 1 |
| 4 | knife | 1 | 2 |
+------+-------+------+------+
3 rows in set (0.00 sec)
案例2:要求查出sex为2的有哪些?
mysql> select * from class01 where sex = 2;
+------+-------+------+------+
| id | name | age | sex |
+------+-------+------+------+
| 4 | knife | 1 | 2 |
+------+-------+------+------+
1 row in set (0.00 sec)
案例3 要求查询出id既大于1,又小于3
mysql> select * from class01 where id > 1 and id < 3;
+------+------+------+------+
| id | name | age | sex |
+------+------+------+------+
| 2 | ak47 | 47 | 1 |
+------+------+------+------+
1 row in set (0.00 sec)
1.3 排序与去重
排序(order by)
排序,顾名思义就是按照某种规则查询出数据,默认情况下是按照从前到后查询数据,但是也可以通过排序语法查询出相关的数据。
格式:
SELECT [查询字段] FROM [表名] [显示规则]
-- 排序的规则
ASC :默认,正向排序
DESC :反向排序
案例1:按照年龄的从大到小的顺序查询所有的数据
mysql> select * from class01 order by age desc;
+------+-------+------+------+
| id | name | age | sex |
+------+-------+------+------+
| 2 | ak47 | 47 | 1 |
| 1 | uzi | 23 | 1 |
| 3 | m4 | 20 | 1 |
| 4 | knife | 1 | 2 |
+------+-------+------+------+
4 rows in set (0.00 sec)
去重(DISTINCT)
去重,顾名思义就是在查询的数据中过滤掉重复数据,默认会显示所有的数据,可以使用出重语法实现去掉重复数据。
格式:
去重是在指定需要被出重的语句之前添加去重关键字
案例:要求按照性别去重
mysql> select distinct sex from class01;
+------+
| sex |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
1.4 其他语句
别名
别名,顾名思义就是将字段设置一个新的名字
案例:
要求计算出当前表中所有的行数
-- 计算行数的函数是count()
mysql> SELECT count(id) FROM class;
+-----------+
| count(id) |
+-----------+
| 3 |
+-----------+
1 row in set (0.00 sec)
# 设置别名
mysql> SELECT count(id) '行数' FROM class;
+--------+
| 行数 |
+--------+
| 3 |
+--------+
1 row in set (0.00 sec)
常用的函数
函数,就是具备某种功能的工具。那么在数据库中使用函数就是通过函数实现某种具体的功能。
# 计算行数的函数
案例:计算出当前数据有多少行
-- 计算行数的函数是count()
mysql> SELECT count(id) FROM class;
+-----------+
| count(id) |
+-----------+
| 3 |
+-----------+
1 row in set (0.00 sec)
# 计算某个字段的和
案例:计算表中所有的年龄的总和
-- 计算和的函数是sum()
mysql> SELECT SUM(age) FROM class;
+----------+
| SUM(age) |
+----------+
| 91 |
+----------+
1 row in set (0.00 sec)
# 计算平均值
案例:计算表中所有的年龄的平均值
mysql> select avg(age) from class01;
+----------+
| avg(age) |
+----------+
| 22.7500 |
+----------+
1 row in set (0.00 sec)
1.5 where语句以及having语句
having语句
having也是一个条件判断语句,类似于前面所讲的where语句是用于做条件判断的,但是有所不同的是where的条件作用于查询之前的字段,having是作用于查询之后的语句。
案例:所有sex为1的,age>17的有哪些?
mysql> SELECT * FROM class01 WHERE sex = 1 HAVING age > 17;
+------+------+------+------+
| id | name | age | sex |
+------+------+------+------+
| 1 | uzi | 23 | 1 |
| 2 | ak47 | 47 | 1 |
| 3 | m4 | 20 | 1 |
+------+------+------+------+
3 rows in set (0.00 sec)
为什么要使用having语句?
因为having语句查询的是处理过后的数据,在查询速度上更快。