MySQLMySQL表的增删改查(进阶)
Posted bit me
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQLMySQL表的增删改查(进阶)相关的知识,希望对你有一定的参考价值。
✨个人主页:bit me👇
✨当前专栏:MySQL数据库👇
✨算法专栏:算法基础👇
✨每日一语:悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。
目 录
🎄一. 数据库约束
- 约束就是数据库可以让程序猿定义一些对数据的限制规则,数据库会在插入 / 修改数据的时候按照这些规则对数据进行校验,如果校验不通过,就直接报错。
约束的本质就是让我们及时发现数据中的错误,更好的保证数据的正确性
约束类型:
- NOT NULL - 指示某列不能存储 NULL 值。(必填项)
- UNIQUE - 保证某列的每行必须有唯一的值。
- DEFAULT - 规定没有给列赋值时的默认值。(可以通过default修改这个默认值)
- PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK - 保证列中的值符合指定的条件。对于mysql数据库,对CHECK子句进行分析,但是忽略CHECK子句
①:NOT NULL
- 初始情况下,一个表允许为NULL。
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into student values(NULL, NULL);
Query OK, 1 row affected (0.00 sec)
加上 NOT NULL 约束之后,就不再允许插入空值
mysql> drop table student;
Query OK, 0 rows affected (0.01 sec)
mysql> create table student (id int not null, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
再尝试插入空值就会报错!
mysql> insert into student values (NULL, NULL);
ERROR 1048 (23000): Column 'id' cannot be null
②:UNIQUE 唯一性
- 默认情况下,表里的数据都是可以重复的
mysql> drop table student;
Query OK, 0 rows affected (0.01 sec)
mysql> create table student (id int, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into student values(1, '张三');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student values(1, '张三');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student values(1, '张三');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 1 | 张三 |
| 1 | 张三 |
+------+--------+
3 rows in set (0.00 sec)
没有约束的表和有约束的表对比
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> drop table student;
Query OK, 0 rows affected (0.01 sec)
mysql> create table student (id int unique, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | UNI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
当我们想再次输入同样的数据的时候发现报错
mysql> insert into student values(1, '张三');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student values(1, '张三');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'
Duplicate --> 重复, entry --> 条目(不是入口) 触发了 UNIQUE 约束
③:DEFAULT
- 设定默认值
默认的默认值是NULL,可以通过 default 约束来修改这里的默认值的取值
mysql> drop table student;
Query OK, 0 rows affected (0.01 sec)
mysql> create table student (id int, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
对表进行指定列插入的时候,会涉及到默认值的情况的
mysql> insert into student (id) values (1);
Query OK, 1 row affected (0.00 sec)
指定了 id 这一列插入,此时的 name 就是按照默认值来走的
mysql> select * from student;
+------+------+
| id | name |
+------+------+
| 1 | NULL |
+------+------+
1 row in set (0.00 sec)
通过 default 约束来修改默认值
mysql> drop table student;
Query OK, 0 rows affected (0.00 sec)
mysql> create table student (id int default 0, name varchar(20) default '未命名');
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+-----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+-----------+-------+
| id | int(11) | YES | | 0 | |
| name | varchar(20) | YES | | 未命名 | |
+-------+-------------+------+-----+-----------+-------+
2 rows in set (0.00 sec)
mysql> insert into student (id) values (1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+------+-----------+
| id | name |
+------+-----------+
| 1 | 未命名 |
+------+-----------+
1 row in set (0.00 sec)
mysql> insert into student (name) values ('张三');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+------+-----------+
| id | name |
+------+-----------+
| 1 | 未命名 |
| 0 | 张三 |
+------+-----------+
2 rows in set (0.00 sec)
④:PRIMARY KEY --> 主键
- 在设计一个表的时候,非常重要的一个列,表示一条记录的身份标识,用来区分这条记录和别的记录的
注:
- 不能为空,相当于 NOT NULL
- 不能重复,相当于UNIQUE
- 一个表里只能有一个主键
mysql> drop table student;
Query OK, 0 rows affected (0.00 sec)
mysql> create table student (id int primary key,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
添加元素:
mysql> insert into student values(null, null);
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into student values(1,'张三');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student values(1,'张三');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
主键不能为空,主键的值也不能重复
由于主键必须要填,还不能重复,MySQL为了方便大家填写主键,内置了一个功能 ”自增主键“ ,帮助我们自动生成主键的值,就不用程序猿自己来保证了
mysql> drop table student;
Query OK, 0 rows affected (0.01 sec)
mysql> create table student (id int primary key auto_increment, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
当前 id 是自增主键,不同于主键,可以使用 null
mysql> insert into student values (null,'张三');
Query OK, 1 row affected (0.00 sec)
- 如果写的是具体数值,就是手动指定 id
- 如果写的是 null ,就是让 MySQL 按照自增主键自动生成
mysql> select * from student;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
+----+--------+
1 row in set (0.00 sec)
mysql> insert into student values (null,'张三');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student values (null,'张三');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student values (null,'张三');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 张三 |
| 3 | 张三 |
| 4 | 张三 |
+----+--------+
4 rows in set (0.00 sec)
中间插入手动增加之后自增从当前的数字自增
mysql> insert into student values (100,'张三');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+-----+--------+
| id | name |
+-----+--------+
| 1 | 张三 |
| 2 | 张三 |
| 3 | 张三 |
| 4 | 张三 |
| 100 | 张三 |
+-----+--------+
5 rows in set (0.00 sec)
mysql> insert into student values (null,'张三');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+-----+--------+
| id | name |
+-----+--------+
| 1 | 张三 |
| 2 | 张三 |
| 3 | 张三 |
| 4 | 张三 |
| 100 | 张三 |
| 101 | 张三 |
+-----+--------+
6 rows in set (0.00 sec)
- MySQL 想要自增,必须要能够记录下来当前 id 已经到哪了,还要保证自增后,得是不能重复的。
- MySQL里简单粗暴的做法,直接就是记录当前 自增主键 里的最大值,这就能保证自增速度很快,并且一定是不重复的
- 可能会觉得有数据库浪费了,但是数据库一般而言是很大的,一般不考虑这个浪费
自增主键,主要就是用来生成一个唯一的 id ,来保证不重复,如果数据库是分布式部署,这个时候自增主键就要带来问题。
在一个MySQL集群里,有许多的MySQL节点(多个节点上的数据放在一起才是一个完整的数据集合),MySQL生成自增主键的时候可以保证在自己这个节点上生成的 id 是唯一的,但是无法保证这个 id 在其他节点上也是唯一的。
生成一个 ID 这样的需求,是客观存在的,但是 MySQL 自增主键,已经难以满足要求了
一个典型的解决方法:在生成 id 的时候,让这些节点相互协商一下,彼此了解了对方的情况之后,就能生成唯一的 id 了,但是代价有点大。为了轻量,高效,又出了另外一个方法:唯一 id = 时间戳(ms) + 机房编号/主机编号 + 随机因子 (这里的 + 不是算术运算 而是字符串拼接)
,进入数据库的数据有先有后形成时间戳,并且会分摊到不同的主机上,就算是一个主机,又会生成随机数的!(也有极端情况三种一模一样,理论上存在但是工程上是忽略不计的!)
⑤:FOREIGN KEY
- 描述了两张表之间的关联关系
举例:
- 班级表是负责约束的一方,称为父表
- 学生表是被约束的一方,称为子表
mysql> drop table student;
Query OK, 0 rows affected (0.01 sec)
mysql> create table class (classId int primary key,className varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> create table student (studentId int primary key, name varchar(20), classId int, foreign key (classId) references class (classId));
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> desc student;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| studentId | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| classId | int
✨个人主页:bit me👇
✨当前专栏:MySQL数据库👇
✨算法专栏:算法基础👇
✨每日一语:生命久如暗室,不碍朝歌暮诗
目 录
🔓一. CRUD
- CRUD : Create,Retrieve,Update,Delete
- 新增数据
- 查询数据
- 修改数据
- 删除数据
MySQL的工作就是组织管理数据,先保存,保存好了后好进行增删改查
增删改查的前提是已经把数据库创建好,并且选中了,表也创建就绪
- 注释:在SQL中可以使用“–空格+描述”来表示注释说明
- CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写
🔒二. 新增(Create)
insert into 表名 values(值,值,值…);
- 注意此处的值的个数要和表的列数匹配,值的类型也要和列的类型匹配(不匹配就会报错!!!)
所以也更好的体现出关系型数据库的一个优势:对数据进行更严格的校验检查,更容易发现问题!
- 我们先在库里创建一个学生表:
mysql> create table student(id int, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
- 查看表的结构
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
- 新增
mysql> insert into student values (1,"zhangsan");
Query OK, 1 row affected (0.00 sec)
注意:在SQL中表示字符串,可以使用单引号也可以使用双引号,他们两个是等价关系,在SQL中没有 " 字符类型 ",只有字符串类型,所以单引号就可以表示字符串。
在这里无论我们表的列数不匹配还是类型不匹配,都是会报错的
mysql> insert into student values(2);
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> insert into student values ("zhangsan",3);
ERROR 1366 (HY000): Incorrect integer value: 'zhangsan' for column 'id' at row 1
注意:出现ERROR意味着当前的操作是不生效的
拓展:
我们在这里还可以插入中文数据:
mysql> insert into student values (2,"张三");
Query OK, 1 row affected (0.00 sec)
在这块我们还需知道,数据库表示中文需要明确字符编码,MySQL默认的字符集叫做拉丁文,不支持中文,为了可以存储,就需要把字符集改为UTF-8。在这里我们介绍一种一劳永逸的方法来修改字符集 --> 修改MySQL的配置文件
🔎如何修改MySQL配置:
- 先确认当前数据库的字符集
show variables like ‘character%’;
mysql> show variables like 'character%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\\Program Files\\MySQL\\MySQL Server 5.7\\share\\charsets\\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)
可以看到我的数据库就是UTF-8字符集
- 找到配置文件 – my.ini
①:可以使用软件Everything来寻找
搜索框里输入my.ini即可找到,但是可能会出现多个my.ini导致无法辨别哪一个才是我们要找的,所以不推荐
②:在我们的系统找到MySQL并且完成这一系列操作
- 右键快捷键进入属性:
- 拷贝出目标里面的内容,这里就是MySQL的可执行程序路径和配置文件路径
- 把MySQL配置文件的位置复制过来
这就是我们要找的配置文件
- 修改配置文件
①:修改配置文件之前,一定要先备份!!!复制粘贴到旁边一份保存着,以免改错还原不回去了!!!
②:编辑ini文件,用记事本打开即可,找到下面没有#的地方,有#号的地方是注释
- ini文件中,有一些 [ ] ,每个 [ ] 称为是一个selection,相当于把一组功能有联系的配置放到了一起,构成了一个selection。
- 具体在[mysql]加入的那句话,那个配置项是按照键值对的方式来组织的,注意这里的键值对单词拼写,等于号俩边不要有空格。
修改完成后记得保存(Ctrl + s)就可以退出了
- 配置文件不是修改完了就立即生效,还需要额外进行一些操作
①:重启MySQL服务器!不重启就不会生效!
- 重启服务器不是关闭黑框框(是客户端)
在我们的搜索里搜索服务,找到MySQL然后右键进行重启即可
- 最后状态栏显示 " 正在运行 " 说明是重启成功的!!!
- 如果是其他内容(启动中…)则是重启失败,最大的原因就是配置文件修改错误
②:修改配置文件,对已经创建好的数据库是没有影响的,必须要删除旧的数据库,重建数据库表。
至此MySQL配置修改就彻底结束了,继续insert的探讨
insert插入的时候可以指定列进行插入,不一定非得把这一行的所有列都插入数据,可以想插入几列就插入几列
mysql> insert into student (name) values ("lisi");
Query OK, 1 row affected (0.00 sec)
如上我们在学生名字这一列插入list,其他未被插入(id)填入的值就是默认值,默认的默认值就是啥都不填,也就是NULL。
insert语句还可以一次插入多条记录,在values后面,带有多组(),每个()之间使用 , 来分割
mysql> insert into student values(1,"zhangsan"),(2,"lisi"),(3,"wangwu");
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
- 在MySQL中,一次插入一条记录分多次插入 比 一次插入多条记录慢的很多!!
- 原因是MySQL是一个客户端/服务器结构的程序,每次在客户端里输入的命令sql,都是通过网络来进行传输的。
- 数据库服务器需要解析请求,获取到其中的sql,解析sql执行相关操作,并且把操作结果返回给客户端
- 如果要是一次插入一条,分成多次插入就会有多个请求/相应,如果要是一次插入多条,就一次请求/相应就够了
结语:插入是SQL中最简单的一个操作,也是最常用的一个操作
📚三. 查询(Retrieve)
查询是SQL中最最重要也最复杂的操作,此处先介绍一下最简单的查询
📙1. 全列查询
- 直接把整个表里面的数据都查询出来。
- select * from 表名;
其中*是通配符,表示匹配任意的列(所有的列)
mysql> select * from student;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | 张三 |
| NULL | list |
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+------+----------+
6 rows in set (0.00 sec)
注意理解这里的执行过程,牢记,客户端和服务器之间通过网络进行通信
这一组结果是通过网络返回的,最终呈现在客户端上,这些数据是服务器筛选得到的数据结果,客户端也是以表格的形式进行呈现,但是大家不要把客户端显示的这个表格视为是服务器上数据的本体,这个客户端上显示的表格是个“临时表”。
问题:如果当前数据库的数据特别多,执行上述select*会发生什么情况呢?
- 服务器要先读取磁盘,把这些数据都查询出来,再通过网卡把数据传输给客户端,由于数据量非常大,极有可能就把磁盘IO(input output)吃满,或者把网络带宽吃满。最直观的感受就是会感受到卡顿,至于卡多久,不明确!!!
在执行一些SQL的时候如果执行的时间比较长,随时可以按 Ctrl + c 来中断,以免造成不必要的损失
📘2. 指定列查询
- select 列名,列名,列名… from 表名;
mysql> select id from student;
+------+
| id |
+------+
| 1 |
| 2 |
| NULL |
| 1 |
| 2 |
| 3 |
+------+
6 rows in set (0.00 sec)
当我们省略掉一些不必要的列的时候,就可以节省大量的磁盘IO和网络带宽了
MySQL是客户端服务器结构的程序,在此处看到的这个表结果,也同样是 " 临时表 " 只是在客户端这里显示成这个样子,而不是说服务器上就真有一个这样的表,里面只存了id列。
select所有的操作结果都是临时表,都不会影响到数据库服务器原有的数据!!!
📗3. 查询带有表达式
- 让查询结果进行一些计算
select 表达式 from 表名;
- 创建一个新的表格:
mysql> create table exam_result (id int, name varchar(20), chinese decimal(3,1),math decimal(3,1), english decimal(3,1));
Query OK, 0 rows affected (0.01 sec)
decimal(3,1)表示的是三个数字长度,保留一位小时,如90.1,33.4
- 查看表格:
mysql> desc exam_result;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| chinese | decimal(3,1) | YES | | NULL | |
| math | decimal(3,1) | YES | | NULL | |
| english | decimal(3,1) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
- 插入数据:
mysql> INSERT INTO exam_result (id,name, chinese, math, english) VALUES
-> (1,'唐三藏', 67, 98, 56),
-> (2,'孙悟空', 87.5, 78, 77),
-> (3,'猪悟能', 88, 98.5, 90),
-> (4,'曹孟德', 82, 84, 67),
-> (5,'刘玄德', 55.5, 85, 45),
-> (6,'孙权', 70, 73, 78.5),
-> (7,'宋公明', 75, 65, 30);
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
- 再次查询表格
mysql> select * from exam_result;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)
让每个人的语文成绩都加10分
mysql> select name,chinese + 10 from exam_result;
+-----------+--------------+
| name | chinese + 10 |
+-----------+--------------+
| 唐三藏 | 77.0 |
| 孙悟空 | 97.5 |
| 猪悟能 | 98.0 |
| 曹孟德 | 92.0 |
| 刘玄德 | 65.5 |
| 孙权 | 80.0 |
| 宋公明 | 85.0 |
+-----------+--------------+
7 rows in set (0.00 sec)
但是需要注意的是这里得到的结果都是 " 临时表 " ,对数据库服务器上面的数据是没有任何影响的!!!
再度查看表结构
mysql> select * from exam_result;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)
如果数据变化超过了decimal(3,1),就是出现了多位数结果的情况,临时表依旧会保证显示的结果是正确的,但是尝试往原始表中插入一个超出范围的数据就是不行的!!!
临时表当中的列完全取决于select指定的列名
📕4. 起别名查询
select 表达式 as 别名 from 表名;
如求语数英三科总分
mysql> select name, chinese + math + english from exam_result;
+-----------+--------------------------+
| name | chinese + math + english |
+-----------+--------------------------+
| 唐三藏 | 221.0 |
| 孙悟空 | 242.5 |
| 猪悟能 | 276.5 |
| 曹孟德 | 233.0 |
| 刘玄德 | 185.5 |
| 孙权 | 221.5 |
| 宋公明 | 170.0 |
+-----------+--------------------------+
7 rows in set (0.00 sec)
如上我们看到的总分表达不是很合理,不直观,我们可以对它起个别名
mysql> select name, chinese + english + math as total from exam_result;
+-----------+-------+
| name | total |
+-----------+-------+
| 唐三藏 | 221.0 |
| 孙悟空 | 242.5 |
| 猪悟能 | 276.5 |
| 曹孟德 | 233.0 |
| 刘玄德 | 185.5 |
| 孙权 | 221.5 |
| 宋公明 | 170.0 |
+-----------+-------+
7 rows in set (0.00 sec)
这样我们的表达就清晰明了
- 可以通过as指定别名,as也可以省略,但是个人建议写上
还有一些奇奇怪怪的表达式查询,如:
mysql> select 10 from exam_result;
+----+
| 10 |
+----+
| 10 |
| 10 |
| 10 |
| 10 |
| 10 |
| 10 |
| 10 |
+----+
7 rows in set (0.00 sec)
这样的SQL语句也可以执行,因为把10也当作是一个表达式(语法上没错,实际上没啥意义)
- 表达式查询,这里进行的计算,都是列和列之间的计算!!!而不是行和行之间的计算(行和行之间的计算有另外的方法)
📒5. 去重查询
- 把查询结果相同的行,合并成一个
select distinct 列名 from 表名;
比如他们各自数学成绩,有一个98.0重合的(上面数据没有重合,此处假设),进行去重查询之后就只剩下一个98.0
mysql> select distinct math from exam_result;
+------+
| math |
+------+
| 98.0 |
| 78.0 |
| 84.0 |
| 85.0 |
| 73.0 |
| 65.0 |
+------+
6 rows in set (0.00 sec)
- distinct 也可也以指定多个列,必须是多个列值完全相同的时候才会视为相同(才会去重)
我们在上面继续添加相同信息
mysql> insert into exam_result (name, math) values ('唐三藏', 98.0);
Query OK, 1 row affected (0.00 sec)
mysql> select * from exam_result;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| NULL | 唐三藏 | NULL | 98.0 | NULL |
+------+-----------+---------+------+---------+
8 rows in set (0.00 sec)
对名字和数学列相同进行去重:
mysql> select distinct name, math from exam_result;
+-----------+------+
| name | math |
+-----------+------+
| 唐三藏 | 98.0 |
| 孙悟空 | 78.0 |
| 猪悟能 | 98.5 |
| 曹孟德 | 84.0 |
| 刘玄德 | 85.0 |
MySQLMySQL表的增删改查(CRUD)