表的增删查改
Posted ych9527
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表的增删查改相关的知识,希望对你有一定的参考价值。
文章目录
1.表的删除
1.1删除整张表和表中的某一行数据
- 删除整个表的结构 : drop table [表名称];
- 清空表的数据,不删除结构:delete from [表名称];
//创建表
MariaDB [test1]> create table t(name varchar(10)) ;
//插入数据
MariaDB [test1]> insert into t values('小红');
MariaDB [test1]> select *from t;
+--------+
| name |
+--------+
| 小红 |
+--------+
//清空表的数据
MariaDB [test1]> delete from t;
//提示为空
MariaDB [test1]> select * from t;
Empty set (0.00 sec)
//删除整个表结构
MariaDB [test1]> drop table t;
//提示没有这个表
MariaDB [test1]> desc t;
ERROR 1146 (42S02): Table 'test1.t' doesn't exist
- 删除某行的数据
- 用where语句进行限制
mysql> select name,语文 from t;
+--------+--------+
| name | 语文 |
+--------+--------+
| 大龙 | 140 |
| 小虫 | 120 |
| 张三 | 40 |
| 李四 | 40 |
| 王五 | 176 |
| 田七 | 174 |
| 胖虎 | 180 |
| 赵六 | 156 |
+--------+--------+
//删除大龙这一行
mysql> delete from t where name='大龙 ';
mysql> select name ,语文 from t;
+--------+--------+
| name | 语文 |
+--------+--------+
| 小虫 | 120 |
| 张三 | 40 |
| 李四 | 40 |
| 王五 | 176 |
| 田七 | 174 |
| 胖虎 | 180 |
| 赵六 | 156 |
1.2截断表
- 只能对整表操作,不能像 delete一样针对部分数据操作;
- 实际上 MySQL 不对数据操作,所以比 delete 更快,但是truncat在删除数据的时候,并不经过真正的事
物,所以无法回滚 - 会重置 auto_increment项
- 语法:truncate 表名称
//截断表
mysql> truncate t2;
//重新插入数据
mysql> insert into t2(name) values('成龙');
//查看表内容 -> 自增键被重新设置
mysql> select *from t2;
+--------+----+
| name | id |
+--------+----+
| 成龙 | 1 |
+--------+----+
2.表的更新和替换
2.1表的更新
-
由于 主键 或者 唯一键 对应的值已经存在而导致插入失败,此时可以使用更新或者替换来进行解决
-
insert ... on duplicate key updata old value = new value...
//原有数据 mysql> select *from t; +-----------+--------+--------+ | name | 数学 | 语文 | +-----------+--------+--------+ | 天麻子 | 10 | 20 | | 李四 | 80 | 90 | | 王五 | 77 | 88 | | 田七 | 54 | 87 | | 赵六 | 68 | 78 | +-----------+--------+--------+ //发生主键冲突 mysql> insert into t values('天麻子',80,90); ERROR 1062 (23000): Duplicate entry '天麻子' for key 'PRIMARY' //进行更新 mysql> insert into t values('天麻子',80,90) on duplicate key update name='张三'; //通过 MySQL 函数获取受到影响的数据行数 mysql> select row_count(); +-------------+ | row_count() | +-------------+ | 2 | +-------------+ //再次查看 mysql> select *from t; +--------+--------+--------+ | name | 数学 | 语文 | +--------+--------+--------+ | 张三 | 10 | 20 | | 李四 | 80 | 90 | | 王五 | 77 | 88 | | 田七 | 54 | 87 | | 赵六 | 68 | 78 | +--------+--------+--------+
-
清空表的数据后,自增的序号,在原来的基础上继续自增
//原始数据
mysql> select *from t2;
+--------+----+
| name | id |
+--------+----+
| 小红 | 1 |
| 小蓝 | 2 |
+--------+----+
//将id设置为自增键
mysql> desc t2;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| name | char(10) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | auto_increment |
+-------+----------+------+-----+---------+----------------+
//清空数据
mysql> delete from t2;
//再插入数据
mysql> insert into t2(name) values('大龙');
//id在原来的基础上继续自增
mysql> select *from t2;
+--------+----+
| name | id |
+--------+----+
| 大龙 | 3 |
+--------+----+
2.2表的替换
-
replace into 和 insert into的用法是类似的,insert每次插入一条新的数据,replace 会先查看表中是否有这条数据(主键或者唯一键),如果有先删除,在插入一条新的数据,如果不存在则直接插入一条新的数据
-
根据表中的主键或唯一键来判断,如果表中没有主键或唯一索引,那么replace into 就相当于 insert into,会直接插入一条数据。
//创建表,两个元素:名字和编号,并且给编号设置唯一建 MariaDB [test1]> create table t(name char(10),id int unique); //插入数据 MariaDB [test1]> insert into t values('陈浩南',123); MariaDB [test1]> insert into t values('香蕉皮',456); MariaDB [test1]> select *from t; +-----------+------+ | name | id | +-----------+------+ | 陈浩南 | 123 | | 香蕉皮 | 456 | +-----------+------+ //替换id为456的名字 MariaDB [test1]> replace into t values('大B哥',456); MariaDB [test1]> select * from t; +-----------+------+ | name | id | +-----------+------+ | 陈浩南 | 123 | | 大B哥 | 456 | +-----------+------+
3.表的查询
3.1查询当前表中列的所有行的数据
- 全列查询:select *from [表名称],‘ * '表示当前表的所有列。对于字段比较少,并且插入数据比较少的表,可以使用全列查询,查询的效率不会收到太大影响。如果一个表中字段比较多,或者数据量比较大,则全列查询会导致查询效率降低
MariaDB [test1]> select * from t;
+-----------+------+--------+--------+
| name | id | 数学 | 美术 |
+-----------+------+--------+--------+
| 许文强 | 1 | 50.00 | 80.00 |
| 丁力 | 2 | 99.00 | 100.00 |
| 雷洛 | 3 | 20.00 | 70.00 |
+-----------+------+--------+--------+
- 指定列查询:select [字段名称] …,from [表字段]
//指定某一列进行查询
MariaDB [test1]> select name,id from t;
+-----------+------+
| name | id |
+-----------+------+
| 许文强 | 1 |
| 丁力 | 2 |
| 雷洛 | 3 |
+-----------+------+
- 查询时,表达式包含一个字段:select [字段名称] … , [表达式(字段名称)] from [表名称]
//包含表达式字段的查询
MariaDB [test1]> select name,id ,数学/10 from t;
+-----------+------+-----------+
| name | id | 数学/10 |
+-----------+------+-----------+
| 许文强 | 1 | 5.000000 |
| 丁力 | 2 | 9.900000 |
| 雷洛 | 3 | 2.000000 |
+-----------+------+-----------+
MariaDB [test1]> select name,id,数学,美术 ,数学+美术 总分 from t;
+-----------+------+--------+--------+--------+
| name | id | 数学 | 美术 | 总分 |
+-----------+------+--------+--------+--------+
| 许文强 | 1 | 50.00 | 80.00 | 130.00 |
| 丁力 | 2 | 99.00 | 100.00 | 199.00 |
| 雷洛 | 3 | 20.00 | 70.00 | 90.00 |
+-----------+------+--------+--------+--------+
- 去重:加上关键字distinct进行查询
//原始数据
MariaDB [test1]> select *from t;
+-----------+------+--------+--------+
| name | id | 数学 | 美术 |
+-----------+------+--------+--------+
| 许文强 | 1 | 50.00 | 80.00 |
| 丁力 | 2 | 99.00 | 100.00 |
| 雷洛 | 3 | 20.00 | 70.00 |
| 周星驰 | 4 | 99.00 | 10.00 |
| 刘德华 | 4 | 99.00 | 66.00 |
+-----------+------+--------+--------+
//进行去重
MariaDB [test1]> select distinct 数学 from t;
+--------+
| 数学 |
+--------+
| 50.00 |
| 99.00 |
| 20.00 |
+--------+
3.2查找列的某些行
- 在全列或者指定列查询的基础上,加上一些约速条件,查找列中,符合要求的某些行
- where:对查询结果进行约束。
- where子句:where [字段名称] [运算符] [比较的值]
- 常见运算符的用法都和平常一样,比如有 <,<=,>,>=、其中or与||等价,and与&&等价
- IN (option, …) 如果是 option 中的任意一个,返回 TRUE(1)
- IS NULL 是 NULL
- IS NOT NULL 不是 NULL
- LIKE 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符
- BETWEEN a0 AND a1 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
//查找数学成绩99分的
MariaDB [test1]> select name id ,数学 from t where 数学=99;
+-----------+--------+
| id | 数学 |
+-----------+--------+
| 丁力 | 99.00 |
| 周星驰 | 99.00 |
| 刘德华 | 99.00 |
+-----------+--------+
//查找美术小于70并且大于10
MariaDB [test1]> select name id ,美术 from t where 美术<70 && 美术>10;
+-----------+--------+
| id | 美术 |
+-----------+--------+
| 刘德华 | 66.00 |
+-----------+--------+
- 关键字in:表示只要满足一个条件即可
MariaDB [test1]> select name , id , 数学 from t where 数学 in(50,60,70);
+-----------+------+--------+
| name | id | 数学 |
+-----------+------+--------+
| 许文强 | 1 | 50.00 |
+-----------+------+--------+
匹配字符串时:模糊查询,需要搭配like
- “_”:严格匹配任意的一个字符
- “%”:可以匹配任意多个字符
//_ 只可以匹配一个字符
MariaDB [test1]> select id , name from t where name like '丁_';
+------+--------+
| id | name |
+------+--------+
| 2 | 丁力 |
+------+--------+
// % 可以匹配多个字符
MariaDB [test1]> select id , name from t where name like '周_';
Empty set (0.00 sec)
MariaDB [test1]> select id , name from t where name like '周%';
+------+-----------+
| id | name |
+------+-----------+
| 4 | 周星驰 |
+------+-----------+
- 数学小于美术的总分
MariaDB [test1]> select *from t where 数学<美术;
+-----------+------+--------+--------+
| name | id | 数学 | 美术 |
+-----------+------+--------+--------+
| 许文强 | 1 | 50.00 | 80.00 |
| 丁力 | 2 | 99.00 | 100.00 |
| 雷洛 | 3 | 20.00 | 70.00 |
+-----------+------+--------+--------+
- 总分<150
MariaDB [test1]> select name ,id , 数学 + 美术 from t where 数学+美术 < 150;
+-----------+------+-----------------+
| name | id | 数学 + 美术 |
+-----------+------+-----------------+
| 许文强 | 1 | 130.00 |
| 雷洛 | 3 | 90.00 |
| 周星驰 | 4 | 109.00 |
+-----------+------+-----------------+
- between a0 and a1 范围匹配
//数学成绩 50-80 && 按照降序排列
mysql> select *from t where 数学 between 50 and 80 order by 数学 desc;
+--------+--------+--------+
| name | 数学 | 语文 |
+--------+--------+--------+
| 李四 | 80 | 90 |
| 王五 | 77 | 88 |
| 赵六 | 68 | 78 |
| 田七 | 54 | 87 |
+--------+--------+--------+
- null的查询
mysql> select *from t where 数学 is not null; //数学成绩不为空的显示出来
+--------+--------+--------+
| name | 数学 | 语文 |
+--------+--------+--------+
| 张三 | 10 | 20 |
| 李四 | 80 | 90 |
| 王五 | 77 | 88 |
| 田七 | 54 | 87 |
| 赵六 | 68 | 78 |
+--------+--------+--------+
- null之间的比较需要使用<=>
mysql> select null<=> 1,null<=>0;
+-----------+----------+
| null<=> 1 | null<=>0 |
+-----------+----------+
| 0 | 0 |
+-----------+----------+
1 row in set (0.00 sec)
//使用等号无法进行比较
mysql> select null=1,null=0;
+--------+--------+
| null=1 | null=0 |
+--------+--------+
| NULL | NULL |
+--------+--------+
- 别名不能出现在where条件中
- 查找的时候,是根据条件找的,即查找的时候是先看到条件的,根据条件找到内容后,再根据select后面的语句进行显示
mysql> select name , 数学 , 语文 , 数学+语文 总分 from t where 总分>150;
ERROR 1054 (42S22): Unknown column '总分' in 'where clause' //条件之中出现了别名
mysql> select name , 数学 , 语文 , 数学+语文 总分 from t where 数学+语文>150;
+--------+--------+--------+--------+
| name | 数学 | 语文 | 总分 |
+--------+--------+--------+--------+
| 李四 | 80 | 90 | 170 |
| 王五 | 77 | 88 | 165 |
+--------+--------+--------+--------+
3.3结果排序
-
语法: order by +排序条件 +排序方式
-
没有order by限制的语句查询返回的结果的顺序是未定义的
-
按照升序查询ASC(默认方式)
//默认就是升序的
mysql> select name ,数学+语文 as 总分 from t order by 数学+语文 ;
+--------+--------+
| name | 总分 |
+--------+--------+
| 张三 | 30 |
| 田七 | 141 |
| 赵六 | 146 |
| 王五 | 165 |
| 李四 | 170 |
+--------+--------+
mysql> select name ,数学+语文 as 总分 from t order by 数学+语文 asc;
+--------+--------+
| name | 总分 |
+--------+--------+
| 张三 | 30 |
| 田七 | 141 |
| 赵六 | 146 |
| 王五 | 165 |
| 李四 | 170 |
+--------+--------+
- 按照降序查询DESC
mysql> select name ,数学+语文 as 总分 from t order by 数学+语文 desc;
+--------+--------+
| name | 总分 |
+--------+--------+
| 李四 | 170 |
| 王五 | 165 |
| 赵六 | 146 |
| 田七 | 141 |
| 张三 | 30 |
+--------+--------+
- 组合排序
//先按照数学成绩排升序,如果数学成绩相同,则按照语文成绩排降序
mysql> select *from t order by 数学,语文 desc;
+--------+--------+--------+
| name | 数学 | 语文 |
+--------+--------+--------+
| 张三 | 10 | 20 |
| 胖虎 | 50 | 90 |
| 大龙 | 50 | 70 |
| 小虫 | 50 | 60 |
| 田七 | 54 | 87 |
| 赵六 | 68 | 78 |
| 王五 | 77 | 88 |
| 李四 | 80 | 90 |
+--------+--------+--------+
- 排序,是先按照select后面的语句将数据筛选出来,再进行排序,所以order by后面可以使用别名
mysql> select name,语文+数学 总分 from t order by 总分 desc ;
+--------+--------+
| name | 总分 |
+--------+--------+
| 李四 | 170 |
| 王五 | 165 |
| 赵六 | 146 |
| 田七 | 141 |
| 胖虎 | 140 |
| 大龙 | 120 |
| 小虫 | 110 |
| 张三 | 30 |
+--------+--------+
3.4分页查询
- 对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死
- 语法:limit +数字(显示多少),offset +数字(偏移量) -> 翻页功能
//全部显示
mysql> select *from t ;
+--------+--------+--------+
| name | 数学 | 语文 |
+--------+--------+--------+
| 大龙 | 50 | 70 |
| 小虫 | 50 | 60 |
| 张三 | 10 | 20 |
| 李四 | 80 | 90 |
| 王五 | 77 | 88 |
| 田七 | 54 | 87 |
| 胖虎 | 50 | 90 |
| 赵六 | 68 | 78 |
+--------+--------+--------+
//显示3行
mysql> select *from t limit 3 ;
+--------+--------+--------+
| name | 数学 | 语文 |
+--------+--------+--------+
| 大龙 | 50 | 70 |
| 小虫 | 50 | 60 |
| 张三 | 10 | 20 |
+--------+--------+--------+
//显示3行,偏移量为1
mysql> select *from t limit 3 offset 1;
+--------+--------+--------+
| name | 数学 | 语文 |
+--------+--------+--------+
| 小虫 | 50 | 60 |
| 张三 | 10 | 20 |
| 李四 | 80 | 90 |
+--------+--------+--------+
4.数据更新
- 对查询到的结果进行列值更新
- 语法:update + 表名 + set + 更改的列=新的值 where 限制条件
//查看原来数据
mysql> select *from t where 数学=10;
+--------+--------+--------+
| name | 数学 | 语文 |
+--------+--------+--------+
| 张三 | 10 | 20 |
+--------+--------+--------+
//进行更改
mysql> update t set 数学=100 where name='张三';
mysql> select *from t where name='张三';
+--------+--------+--------+
| name | 数学 | 语文 |
+--------+--------+--------+
| 张三 | 100 | 20 |
+--------+--------+--------+
- 一次性更新多个列
//原始数据
mysql> select *from t where name='李四';
+--------+--------+--------+
| name | 数学 | 语文 |
+--------+--------+--------+
| 李四 | 80 | 90 |
+--------+--------+--------+
1 row in set (0.00 sec)
//将李四的语文和数学都进行改动
mysql> update t set 数学=30,语文=20 where name='李四';
mysql> select *from t where name='李四';
+--------+--------+--------+
| name | 数学 | 语文 |
+--------+--------+--------+
| 李四 | 30 | 20 |
+--------+--------+--------+
- 将前三的数学成绩加上30分
//显示前三的总分
mysql> select * ,数学+语文 总分 from t order by 总分 desc limit 3 ;
+--------+--------+--------+--------+
| name | 数学 | 语文 | 总分 |
+--------+--------+--------+--------+
| 王五 | 77 | 88 | 165 |
| 赵六 | 68 | 78 | 146 |
| 田七 | 54 | 87 | 141 |
+--------+--------+--------+--------+
更新数据 -> 注意:不支持 数学+=30
mysql> update t set 数学=数学+30 order by 数学+语文 desc limit 3;
//更新后的数据
mysql> select * , 数学+语文 总分 from t order by 总分 desc limit 3;
+--------+--------+--------+--------+
| name | 数学 | 语文 | 总分 |
+--------+--------+--------+--------+
| 王五 | 107 | 88 | 195 |
| 赵六 | 98 | 78 | 176 |
| 田七 | 84 | 87 | 171 |
+--------+--------+--------+--------+
- 将所有同学的语文成绩更新为原来的 2 倍
- 没有用where字句进行约速,则所有的成绩都更新
mysql> select name,语文 from t;
+--------+--------+
| name | 语文 |
+--------+--------+
| 大龙 | 70 |
| 小虫 | 60 |
| 张三 | 20 |
| 李四 | 20 |
| 王五 | 88 |
| 田七 | 87 |
| 胖虎 | 90 |
| 赵六 | 78 |
+--------+--------+
mysql> update t set 语文=语文*2;
mysql> select name,语文 from t;
+--------+--------+
| name | 语文 |
+--------+--------+
| 大龙 | 140 |
| 小虫 | 120 |
| 张三 | 40 |
| 李四 | 40 |
| 王五 | 176 |
| 田七 | 174 |
| 胖虎 | 180 |
| 赵六 | 156 |
+--------+--------+
5.插入查询结果
-
表结构需要一样
-
将表2查询结果插入表1
//表2的数据
mysql> select *from t2;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 1 | a |
| 2 | a |
| 3 | b |
| 3 | b |
+------+------+
//将表2的数据插入表1
mysql> insert into t1 select *from t2;
//表1数据
mysql> select *from t1;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 1 | a |
| 2 | a |
| 3 | b |
| 3 | b |
+------+------+
- 将表1的内容去重后插入表3
mysql> insert into t3 select distinct *from t1; //使用distinct去重
//表1数据
mysql> select *from t1;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 1 | a |
| 2 | a |
| 3 | b |
| 3 | b |
+------+------+
//表3位表1去重后的数据
mysql> select *from t3;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | a |
| 3 | b |
+------+------+
6.聚合函数
- 查询的数据后边都可以接上where进行条件约束
函数 | 说明 |
---|---|
COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
//查看表的内容
mysql> select *from t;
+--------+------+---------+
| name | math | english |
+--------+------+---------+
| 小红 | 50 | 80 |
| 大红 | 50 | 90 |
| 小绿 | 80 | 70 |
| 大蓝 | 80 | 85 |
| 东东 | 30 | NULL |
| 西西 | NULL | 90 |
+--------+------+---------+
- 返回查看到表的数据 -> *和1的含义是一样的
//返回查询到的数据的数量 -> 1和*的含义是一样的
mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
mysql> select count(1) from t;
+----------+
| count(1) |
+----------+
| 6 |
+----------+
//返回数学成绩的个数 -> null没有意义
mysql> select count(math) from t;
+-------------+
| count(math) |
+-------------+
| 5 |
+-------------+
//返回英语成绩的个数 -> null没有意义
mysql> select count(english) from t;
+----------------+
| count(english) |
+----------------+
| 5 |
+----------------+
//返回英语成绩的个数 -> 并且进行去重处理
mysql> select count(distinct english) from t;
+-------------------------+
| count(distinct english) |
+-------------------------+
| 4 |
+-------------------------+
- 返回查询到的数据的 总和,不是数字没有意义
//统计总分
mysql> select sum(math+english) 总分 from t;
+--------+
| 总分 |
+--------+
| 585 |
+--------+
//统计总分&&数学成绩>100 -> 没有返回null
mysql> select sum(english+math) from t where math > 100;
+-------------------+
| sum(english+math) |
+-------------------+
| NULL |
+-------------------+
- 返回查到数据的平均值
mysql> select avg(math) from t;
+-----------+
| avg(math) |
+-----------+
| 58.0000 |
+-----------+
- 返回查到数据的最大值
mysql> select max(math) from t;
+-----------+
| max(math) |
+-----------+
| 80 |
+-----------+
- 返回查到数据的最小值
mysql> select min(math) from t;
+-----------+
| min(math) |
+-----------+
| 30 |
+-----------+
以上是关于表的增删查改的主要内容,如果未能解决你的问题,请参考以下文章