数据表

内容概述

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语句查询的是处理过后的数据,在查询速度上更快。
posted @ 2021-09-27 20:30  堇雪月寒风  阅读(533)  评论(0编辑  收藏  举报
Live2D