文章目录
我们可以对数据库中的数据表进行一些操作:插入数据、删除数据、更新数据、查找数据
一、插入数据:insert into
可以使用INSERT INTO语句来插入数据
现有如下一个数据表格:
mysql> desc student;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | YES | | NULL | |
| sex | char(5) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
4 rows in set (0.48 sec)
具体插入数据的方法有如下几种:
1. 全列插入
格式如下:
insert into table_name values(value1,value2,...valueN);
例:在student表中插入数据
mysql> insert into student values(0,'叶无道','男',98);
Query OK, 1 row affected (0.01 sec)
注意:主键列id是自动增长的,在全列插入时通常需要使用0来进行占位,插入成功以后以实际数据为准;当然id列也可以自己写入,但要求不能与之前表中的id重复
2. 缺省插入
格式如下:
insert into table_name(列1,列2,……) values(值1,值2,……);
使用缺省插入在student表中插入数据:
mysql> insert into student(name,sex,score) values('慕容雪痕','女',95);
Query OK, 1 row affected (0.01 sec)
3. 同时插入多条数据
格式如下:
insert into table_name values(...),(...)...;
例:同时在student表中插入数据
mysql> insert into student values(0,'苏惜水','女',80),(4,'燕清舞','女',85);
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
二、删除数据:delete from
可以使用DELETE FROM语句来删除数据表中的数据
格式如下:
delete from 表名 [where 条件];
说明:
- 可以使用where子句指定删除满足条件的数据
- 没有指定where子句,数据表中的所有数据将被删除,所以要慎用
例:删除student表中id=4的数据
mysql> delete from student where id=4;
Query OK, 1 row affected (0.06 sec)
三、更新数据:update
我们需要修改或更新数据表中的数据时,可以使用UPDATE语句来操作
格式如下:
update 表名 set 列1=值1,列2=值2,…… where 条件;
说明:
- 可以同时更新一个或多个字段
- 需要更新数据表中指定行的数据时可以使用WHERE 子句
- 没有指定条件则全部列都修改,慎用
例:将id=5的数据修改为:name=陈破虏,sex=男
mysql> update student set name='陈破虏',sex='男' where id=5;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
四、查找数据:select
可以使用SELECT语句来查询数据
1. 基本语法
格式如下:
select 列名 from 表名;
说明:
- from关键字后面是表名,表示数据来源于这张表
- select后面写表中的列名,如果是*表示在结果集中显示表中的所有列
- 如果要查询多个列,之间使用逗号分隔
- 在select后面的列名部分,可以使用as为列名起别名,这个别名显示在结果集中
例1:查询student表中所有的列
mysql> select * from student;
+----+--------------+------+-------+
| id | name | sex | score |
+----+--------------+------+-------+
| 1 | 叶无道 | 男 | 98 |
| 2 | 慕容雪痕 | 女 | 95 |
| 3 | 苏惜水 | 女 | 80 |
| 4 | 燕清舞 | 女 | 85 |
| 5 | 陈破虏 | 男 | 75 |
| 6 | 叶凡 | 男 | 82 |
+----+--------------+------+-------+
6 rows in set (0.00 sec)
例2:查询student表中name和score
mysql> select name,score from student;
+--------------+-------+
| name | score |
+--------------+-------+
| 叶无道 | 98 |
| 慕容雪痕 | 95 |
| 苏惜水 | 80 |
| 燕清舞 | 85 |
| 陈破虏 | 75 |
| 叶凡 | 82 |
+--------------+-------+
6 rows in set (0.00 sec)
例3:查询student表中的score,并为其取个别名
mysql> select score as 颜值 from student;
+--------+
| 颜值 |
+--------+
| 98 |
| 95 |
| 80 |
| 85 |
| 75 |
| 82 |
+--------+
6 rows in set (0.00 sec)
2. 条件查询
可以使用WHERE子句有条件地从表中选取数据
格式如下:
select 列名 from 表名 where 条件;
我们可以使用比较运算符和逻辑运算符进行条件判断
例1:查询student表中score值大于等于90的所有数据
mysql> select * from student where score >= 90;
+----+--------------+------+-------+
| id | name | sex | score |
+----+--------------+------+-------+
| 1 | 叶无道 | 男 | 98 |
| 2 | 慕容雪痕 | 女 | 95 |
+----+--------------+------+-------+
2 rows in set (0.00 sec)
注意:不等于,我们使用 !=或<>
例2:查询student表中score值大于等于85的女生
mysql> select * from student where score >= 85 and sex = '女';
+----+--------------+------+-------+
| id | name | sex | score |
+----+--------------+------+-------+
| 2 | 慕容雪痕 | 女 | 95 |
| 4 | 燕清舞 | 女 | 85 |
+----+--------------+------+-------+
2 rows in set (0.00 sec)
3. 模糊查询:like
在WHERE子句中使用LIKE子句可以进行一个模糊查询
注意:
- 使用%表示任意多个任意字符
- 使用_表示一个任意字符
例1:查询student表中姓叶的学生
mysql> select * from student where name like '叶%';
+----+-----------+------+-------+
| id | name | sex | score |
+----+-----------+------+-------+
| 1 | 叶无道 | 男 | 98 |
| 6 | 叶凡 | 男 | 82 |
+----+-----------+------+-------+
2 rows in set (0.00 sec)
例2:查询student表中姓叶且名字为两个字的学生
mysql> select * from student where name like '叶_';
+----+--------+------+-------+
| id | name | sex | score |
+----+--------+------+-------+
| 6 | 叶凡 | 男 | 82 |
+----+--------+------+-------+
1 row in set (0.00 sec)
4. 范围查询:in和between…and…
(1) in:表示在一个非连续的范围内
例:查询student表中score值为85,95的所有数据
mysql> select * from student where score in (85,95);
+----+--------------+------+-------+
| id | name | sex | score |
+----+--------------+------+-------+
| 2 | 慕容雪痕 | 女 | 95 |
| 4 | 燕清舞 | 女 | 85 |
+----+--------------+------+-------+
2 rows in set (0.00 sec)
(2) between…and…: 表示在一个连续的范围内
例:查询student表中score值从90到100的所有数据
mysql> select * from student where score between 90 and 100;
+----+--------------+------+-------+
| id | name | sex | score |
+----+--------------+------+-------+
| 1 | 叶无道 | 男 | 98 |
| 2 | 慕容雪痕 | 女 | 95 |
+----+--------------+------+-------+
2 rows in set (0.00 sec)
5. 空判断:is null和is not null
(1) is null:判断空
例:查询student表中score值为空的所有数据
mysql> select * from student where score is null;
Empty set (0.00 sec)
(2) is not null:判断非空
例:查询student表中score值不为空的所有数据
mysql> select * from student where score is not null;
+----+--------------+------+-------+
| id | name | sex | score |
+----+--------------+------+-------+
| 1 | 叶无道 | 男 | 98 |
| 2 | 慕容雪痕 | 女 | 95 |
| 3 | 苏惜水 | 女 | 80 |
| 4 | 燕清舞 | 女 | 85 |
| 5 | 陈破虏 | 男 | 75 |
| 6 | 叶凡 | 男 | 82 |
+----+--------------+------+-------+
6 rows in set (0.00 sec)
注意:null与""是不同
6. 优先级
优先级:() > 比较运算符 > not > and > or
建议:尽可能多的使用小括号
例:查询student表中score值大于90或者姓燕的女生
mysql> select * from student where (score > 90 or name like '燕%') and sex = '女';
+----+--------------+------+-------+
| id | name | sex | score |
+----+--------------+------+-------+
| 2 | 慕容雪痕 | 女 | 95 |
| 4 | 燕清舞 | 女 | 85 |
+----+--------------+------+-------+
2 rows in set (0.01 sec)
7. 聚合(count,max,min,sum,avg)
为了快速得到统计数据,提供了5个聚合函数:
聚合函数 | 含义 |
---|---|
count() | 表示计算总行数,括号中可以写*和列名 |
max(列) | 表示求此列的最大值 |
min(列) | 表示求此列的最小值 |
sum(列) | 表示求此列的和 |
avg(列) | 表示求此列的平均值 |
例1:查询student表的学生数
mysql> select count(*) from student;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
例2:查询score值最大的数据
mysql> select max(score) from student;
+------------+
| max(score) |
+------------+
| 98 |
+------------+
1 row in set (0.00 sec)
8. 排序:order by
格式如下:
select * from 表名 order by 列1 asc|desc,列2 asc|desc...;
说明:
- 将数据按照列1进行排序,如果某些列1的值相同,则按照列2进行排序
- 默认按照从小到大的顺序排序
- asc升序
- desc降序
例:按照score值对student表进行排序
mysql> select * from student order by score desc;
+----+--------------+------+-------+
| id | name | sex | score |
+----+--------------+------+-------+
| 1 | 叶无道 | 男 | 98 |
| 2 | 慕容雪痕 | 女 | 95 |
| 4 | 燕清舞 | 女 | 85 |
| 6 | 叶凡 | 男 | 82 |
| 3 | 苏惜水 | 女 | 80 |
| 5 | 陈破虏 | 男 | 75 |
+----+--------------+------+-------+
6 rows in set (0.07 sec)
例:按照name对student表进行升序排序
mysql> select * from student order by name,id desc;
+----+--------------+------+-------+
| id | name | sex | score |
+----+--------------+------+-------+
| 6 | 叶凡 | 男 | 82 |
| 1 | 叶无道 | 男 | 98 |
| 2 | 慕容雪痕 | 女 | 95 |
| 4 | 燕清舞 | 女 | 85 |
| 3 | 苏惜水 | 女 | 80 |
| 5 | 陈破虏 | 男 | 75 |
+----+--------------+------+-------+
6 rows in set (0.00 sec)
9. 分组:group by
按照字段分组,表示此字段相同的数据会被放到一个集合中。分组后,只能查询出相同的数据列,对于有差异的数据列无法显示在结果集中,可以对分组后的数据进行统计,做聚合运算
(1) 对单个字段进行分组
mysql> update student set score=85 where id=3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select sex,count(*) from student group by sex;
+------+----------+
| sex | count(*) |
+------+----------+
| 女 | 3 |
| 男 | 3 |
+------+----------+
2 rows in set (0.00 sec)
(2) 对多个字段进行分组
mysql> select sex,score,count(*) from student group by sex,score;
+------+-------+----------+
| sex | score | count(*) |
+------+-------+----------+
| 女 | 85 | 2 |
| 女 | 95 | 1 |
| 男 | 75 | 1 |
| 男 | 82 | 1 |
| 男 | 98 | 1 |
+------+-------+----------+
5 rows in set (0.00 sec)
交换字段顺序对记录进行分组,结果如下:
mysql> select score,sex,count(*) from student group by score,sex;
+-------+------+----------+
| score | sex | count(*) |
+-------+------+----------+
| 75 | 男 | 1 |
| 82 | 男 | 1 |
| 85 | 女 | 2 |
| 95 | 女 | 1 |
| 98 | 男 | 1 |
+-------+------+----------+
5 rows in set (0.00 sec)
(3) 与having结合在一起使用
使用having字句可以对分组后的数据进行筛选
mysql> select max(score),sex from student group by sex;
+------------+------+
| max(score) | sex |
+------------+------+
| 95 | 女 |
| 98 | 男 |
+------------+------+
2 rows in set (0.02 sec)
mysql> select max(score),sex from student group by sex having max(score)>95;
+------------+------+
| max(score) | sex |
+------------+------+
| 98 | 男 |
+------------+------+
1 row in set (0.00 sec)
where与having的区别:
- where是对from后面指定的表进行筛选,属于对原始数据的筛选
- having是对group by的结果进行筛选
10. 分页:limit
limit子句可以被用于强制select语句返回指定的记录数
格式如下:
#count = page_num
#start = (page - 1) * page_num
select * from 表名 limit start,count;
注意:start索引从0开始
例如:
mysql> select * from student limit 0,3;
+----+--------------+------+-------+
| id | name | sex | score |
+----+--------------+------+-------+
| 1 | 叶无道 | 男 | 98 |
| 2 | 慕容雪痕 | 女 | 95 |
| 3 | 苏惜水 | 女 | 85 |
+----+--------------+------+-------+
3 rows in set (0.00 sec)
mysql> select * from student limit 3,3;
+----+-----------+------+-------+
| id | name | sex | score |
+----+-----------+------+-------+
| 4 | 燕清舞 | 女 | 85 |
| 5 | 陈破虏 | 男 | 75 |
| 6 | 叶凡 | 男 | 82 |
+----+-----------+------+-------+