表的增删查改

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 |
+-----------+

以上是关于表的增删查改的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)

单链表~增删查改(附代码)~简单实现

数据结构之顺序表的增删查改等操作详解

链表的增删查改---增

MySQL表的约束和表的增删查改

数据结构学习笔记(数据结构概念顺序表的增删查改等)详细整理