MySQL的数据的增删改查(重点):
增加:insert
删除:delete
更改:update
查询:select
1、数据的增加操作:
特别注意的是:在SQL语句中,除了数字,其他类型的值,都需要用引号引起来,否则插入时会报错。
准备一个数据表。
mysql> create table tb_user (
-> id int,
-> username varchar(20),
-> age tinyint unsigned,
-> gender enum('male','female','secret'),
-> address varchar(255)
-> )engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> desc tb_user;
+----------+--------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| username | varchar(20) | YES | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| gender | enum('male','female','secret') | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
+----------+--------------------------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
说明:
unsigned:代表无符号型,只有0到正数。
enum代表枚举型,只能从给定的值中选择一个。
插入数据:
前面不写字段信息。
mysql> insert into tb_user values(1,'李小刚',24,'male','广东省广州市');
Query OK, 1 row affected (0.01 sec)
mysql>
mysql> select * from tb_user;
+------+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+------+-----------+------+--------+--------------------+
| 1 | 李小刚 | 24 | male | 广东省广州市 |
+------+-----------+------+--------+--------------------+
1 row in set (0.00 sec)
前面写字段:
mysql> insert into tb_user(id,username,age) values(2,'李大刚',35);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> select * from tb_user;
+------+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+------+-----------+------+--------+--------------------+
| 1 | 李小刚 | 24 | male | 广东省广州市 |
| 2 | 李大刚 | 35 | NULL | NULL |
+------+-----------+------+--------+--------------------+
2 rows in set (0.00 sec)
NULL:表示没有值。NULL表示关键字NULL本身,'NULL'表示包含字符NULL的直义字符串。
insert into t1 select * from t2;
insert into t1(name) select name from t2;
说明:
1.插入的数据来自于另外一张表
2.一定要保证两张表的结构一致(插入表里字段数和后面表查找出来的字段要相匹配)
3.两张表结构完全一致;或者人造让两边字段一致
数据的查询操作:
基本语法:
1)查询表里的所有记录:
mysql> select * from tb_user;
+------+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+------+-----------+------+--------+--------------------+
| 1 | 李小刚 | 24 | male | 广东省广州市 |
| 2 | 李大刚 | 35 | NULL | NULL |
+------+-----------+------+--------+--------------------+
2 rows in set (0.00 sec)
案例:查询id=2的人员信息:
mysql> select id,username,age from tb_user where id=2;
+------+-----------+------+
| id | username | age |
+------+-----------+------+
| 2 | 李大刚 | 35 |
+------+-----------+------+
1 row in set (0.00 sec)
mysql>
mysql> select * from tb_user where age > 23;
+------+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+------+-----------+------+--------+--------------------+
| 1 | 李小刚 | 24 | male | 广东省广州市 |
| 2 | 李大刚 | 35 | NULL | NULL |
+------+-----------+------+--------+--------------------+
2 rows in set (0.00 sec)
查询年龄大于23岁的人员信息。
数据的修改操作:
update 表名 set 字段1=新值,字段2=新值,... where 更新条件;
特别说明:如果更新数据的时候不指定where更新条件,则其会把这个数据表的数据都更新一遍。
如果这个误操作,会导致所有数据都会发生变化。更新之前要做好备份。也要注意有where这个更新条件。
mysql> update tb_user set gender='male',address='广东省深圳市' where username='李大刚';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from tb_user where username='李大刚';
+------+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+------+-----------+------+--------+--------------------+
| 2 | 李大刚 | 35 | male | 广东省深圳市 |
+------+-----------+------+--------+--------------------+
1 row in set (0.00 sec)
案例:今年是2023年,假设到了2024年,现在存储的学员的年龄都差1岁,整体进行一次更新。
mysql> update tb_user set age=age+1;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql>
mysql> select * from tb_user;
+------+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+------+-----------+------+--------+--------------------+
| 1 | 李小刚 | 25 | male | 广东省广州市 |
| 2 | 李大刚 | 36 | male | 广东省深圳市 |
+------+-----------+------+--------+--------------------+
2 rows in set (0.00 sec)
数据的删除操作:
1)基本语法:
delete from 数据表名称 where 删除条件;
案例:删除tb_user表中的id=1的用户信息:
mysql> delete from tb_user where id=1;
Query OK, 1 row affected (0.01 sec)
mysql>
mysql> select * from tb_user;
+------+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+------+-----------+------+--------+--------------------+
| 2 | 李大刚 | 36 | male | 广东省深圳市 |
+------+-----------+------+--------+--------------------+
1 row in set (0.00 sec)
delete/truncate/drop区别
delete:删除==数据记录==
数据操作语言(DML)
在事务控制里,DML语句要么commit,要么rollback
删除==大量==记录速度慢,==只删除数据==不回收高水位线
可以==带条件==删除
truncate:删除==所有数据记录==
数据定义语言(DDL)
==不在==事务控制里,DDL语句执行前会提交前面所有未提交的事务
清里大量数据==速度快==,回收高水位线(high water mark)
==不能带条件删除==
drop:删除==数据库对象==
数据定义语言(DDL)
数据库对象包括库、表、用户等。
delete from操作案例:
mysql> delete from tb_user;
Query OK, 1 row affected (0.01 sec)
mysql> select * from tb_user;
Empty set (0.00 sec)
truncate操作案例:
mysql> select * from tb_user;
+------+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+------+-----------+------+--------+--------------------+
| 1 | 李小刚 | 24 | male | 广东省广州市 |
| 2 | 李大刚 | 35 | male | 广东省深圳市 |
+------+-----------+------+--------+--------------------+
2 rows in set (0.00 sec)
mysql>
mysql>
mysql> truncate tb_user;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> select * from tb_user;
Empty set (0.00 sec)
自动增长(对某个字段进行自动编号)
create table tb_user (
id int not null auto_increment,
username varchar(20),
age tinyint unsigned,
gender enum('male','female','secret'),
address varchar(255)
)engine=innodb default charset=utf8;
not null:不能为空。
auto_increment: 自动增长。
主键约束:(非空、唯一)
两种方法:
create table tb_user (
id int not null auto_increment primary key ,
username varchar(20),
age tinyint unsigned,
gender enum('male','female','secret'),
address varchar(255)
)engine=innodb default charset=utf8;
create table tb_user (
id int not null auto_increment,
username varchar(20),
age tinyint unsigned,
gender enum('male','female','secret'),
address varchar(255),
primary key(id)
)engine=innodb default charset=utf8;
高水位线的概念:如果是truncate,那么id就是重置从1开始。如果是delete,那么id就是不回收,那是在原来删除的基础上增加。
mysql> create table tb_user (
-> id int not null auto_increment,
-> username varchar(20),
-> age tinyint unsigned,
-> gender enum('male','female','secret'),
-> address varchar(255),
-> primary key(id)
-> )engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql> desc tb_user;
+----------+--------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(20) | YES | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| gender | enum('male','female','secret') | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
+----------+--------------------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
插入数据时,id位置直接写NULL即可。
mysql> insert into tb_user values(NULL,'李小刚',24,'male','广东省广州市');
Query OK, 1 row affected (0.00 sec)
mysql> insert into tb_user(id,username,age) values(NULL,'李大刚',35);
Query OK, 1 row affected (0.01 sec)
mysql>
mysql> select * from tb_user;
+----+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+----+-----------+------+--------+--------------------+
| 1 | 李小刚 | 24 | male | 广东省广州市 |
| 2 | 李大刚 | 35 | NULL | NULL |
+----+-----------+------+--------+--------------------+
2 rows in set (0.00 sec)
mysql> ^C
mysql> insert into tb_user(id,username,age) values(NULL,'李大刚',35);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tb_user;
+----+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+----+-----------+------+--------+--------------------+
| 1 | 李小刚 | 24 | male | 广东省广州市 |
| 2 | 李大刚 | 35 | NULL | NULL |
| 3 | 李大刚 | 35 | NULL | NULL |
+----+-----------+------+--------+--------------------+
3 rows in set (0.00 sec)
我们可以看到id主键都在自动增加。
mysql> insert into tb_user values(NULL,'上官',18,'female','湖南省长沙市');
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> insert into tb_user values(NULL,'马鹏',23,'male','广东省广州市');
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> select * from tb_user;
+----+-----------+------+--------+--------------------+
| id | username | age | gender | address |
+----+-----------+------+--------+--------------------+
| 1 | 李小刚 | 24 | male | 广东省广州市 |
| 4 | 上官 | 18 | female | 湖南省长沙市 |
| 5 | 马鹏 | 23 | male | 广东省广州市 |
+----+-----------+------+--------+--------------------+
3 rows in set (0.00 sec)
我做了删除操作,但是id仍然是网上升的。
如果用truncate tb_user,那么id就是从1开始。