文章目录
- 1、新增操作(Create)
- 1.1单行数据+全列插入
- 1.2多行数据+指定列插入
- 2、查询操作(Retrieve)
- 2.1全列查询
- 2.2指定列查询
- 2.3指定列查询
- 2.4别名(as)
- 2.5去重(distinct)
- 2.6排序(order by)
- 2.7条件查询(where)
- 2.8分页查询(limit)
- 3、修改操作(Update)
- 4、删除操作(Delete)
1、新增操作(Create)
在我们的数据库中,用insert into来进行新增操作,首先我们需要一张表
注意:在进行下列操作时,要选中数据库进行操作
mysql> create table student(id int, name varchar(20));
Query OK, 0 rows affected (0.02 sec)
1.1单行数据+全列插入
一次只插入一行,每一行都会插入数据
insert into 表名 values (值,值...);
举例如下:
mysql> insert into student values(1,'张三');
Query OK, 1 row affected (0.01 sec)
1.2多行数据+指定列插入
insert into student (表名,表名...) values (值,值...);
举例如下:
mysql> insert into student (id, name) values (2, '李四'),(3, '王五');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
这里通过 mysql 客户端给出的信息,也能看到我们成功插入了 2 行数据
注意:values()括号中的内容,个数和类型一定要和表的结构匹配
2、查询操作(Retrieve)
创建考试成绩表
create table exam_result(id int,
name varchar(20),
chinese decimal(3,1),
math decimal(3,1),
english decimal(3,1)
);
插入测试数据
insert into exam_result (id, name, chinese, math, english) values
(1, '唐三藏', 67, 98, 56),
(2, '孙悟空', 87.5, 78, 77),
(3, '猪悟能', 88, 98, 90),
(4, '曹孟德', 82, 84, 67),
(5, '刘玄德', 55.5, 85, 45),
(6, '孙权', 70, 73, 78.5),
(7, '宋公明', 75, 65, 30);
2.1全列查询
查询表里的所有列,*表示通配符
--select * from 表名
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.0 | 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)
2.2指定列查询
这个查询不用按照表中列的顺序来查询,只要表中包含该列即可:
--select 列名, 列名... from 表名;
mysql> select id, name from exam_result;
+------+-----------+
| id | name |
+------+-----------+
| 1 | 唐三藏 |
| 2 | 孙悟空 |
| 3 | 猪悟能 |
| 4 | 曹孟德 |
| 5 | 刘玄德 |
| 6 | 孙权 |
| 7 | 宋公明 |
+------+-----------+
7 rows in set (0.00 sec)
2.3指定列查询
查询每位同学语文成绩+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 name, chinese + math + english from exam_result;
+-----------+--------------------------+
| name | chinese + math + english |
+-----------+--------------------------+
| 唐三藏 | 221.0 |
| 孙悟空 | 242.5 |
| 猪悟能 | 276.0 |
| 曹孟德 | 233.0 |
| 刘玄德 | 185.5 |
| 孙权 | 221.5 |
| 宋公明 | 170.0 |
+-----------+--------------------------+
7 rows in set (0.00 sec)
注意:select 只是查询,并不会修改原来表中的数据,而查询的结果是一个 “临时表”,这个查询出来的表是不会写到硬盘里面去的
2.4别名(as)
为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称
mysql> select name, chinese + math + english as total from exam_result;
+-----------+-------+
| name | total |
+-----------+-------+
| 唐三藏 | 221.0 |
| 孙悟空 | 242.5 |
| 猪悟能 | 276.0 |
| 曹孟德 | 233.0 |
| 刘玄德 | 185.5 |
| 孙权 | 221.5 |
| 宋公明 | 170.0 |
+-----------+-------+
7 rows in set (0.00 sec)
2.5去重(distinct)
--98重复了
mysql> select math from exam_result;
+------+
| math |
+------+
| 98.0 |
| 78.0 |
| 98.0 |
| 84.0 |
| 85.0 |
| 73.0 |
| 65.0 |
+------+
7 rows in set (0.00 sec)
--去重结果:
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.01 sec)
2.6排序(order by)
要想让查询的结果“有序”就必须手动使用order by语句,让MySQL主动排序
--select * from 表名 order by 列名/表达式;
mysql> select * from exam_result order by chinese;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.0 | 90.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)
此处默认是按照升序排序,如果要使用降序排序,需要加上desc关键字
mysql> select * from exam_result order by chinese desc;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 3 | 猪悟能 | 88.0 | 98.0 | 90.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)
也可以按照别名的方式进行order by直接表达式是一样的
mysql> select name, chinese + math + english as total from exam_result order by total;
+-----------+-------+
| name | total |
+-----------+-------+
| 宋公明 | 170.0 |
| 刘玄德 | 185.5 |
| 唐三藏 | 221.0 |
| 孙权 | 221.5 |
| 曹孟德 | 233.0 |
| 孙悟空 | 242.5 |
| 猪悟能 | 276.0 |
+-----------+-------+
7 rows in set (0.00 sec)
order by 也可以指定多个列排序,通过多个列排序约定更复杂的比较规则
--select * from 表名 order by 列名[desc], 列名[desc];
--先按照第一列排序,第一列相同了,再按照第二列排序
mysql> select * from exam_result order by math desc,chinese desc;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 3 | 猪悟能 | 88.0 | 98.0 | 90.0 |
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)
2.7条件查询(where)
比较运算符:
逻辑运算符:
注意:
1.WHERE条件可以使用表达式,但不能使用别名。
2.AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分
查询语文成绩大于60分的同学:
mysql> select name, chinese from exam_result where chinese > 60;
+-----------+---------+
| name | chinese |
+-----------+---------+
| 唐三藏 | 67.0 |
| 孙悟空 | 87.5 |
| 猪悟能 | 88.0 |
| 曹孟德 | 82.0 |
| 孙权 | 70.0 |
| 宋公明 | 75.0 |
+-----------+---------+
6 rows in set (0.01 sec)
数据库服务器收到SQL之后就会遍历表中的每一个数据(行)取出当前行,带入到条件之中,如果条件成立,当前这一行数据就会进入到结果集合中,如果不成立,跳过进入下一行
上述条件查询的过程,可以理解成按照条件进行“筛选”
可以在条件选择的时候使用order by来排序
(如果没有显示使用order by,顺序是不可预期的)
mysql> select name, chinese from exam_result where chinese > 60 order by chinese;
+-----------+---------+
| name | chinese |
+-----------+---------+
| 唐三藏 | 67.0 |
| 孙权 | 70.0 |
| 宋公明 | 75.0 |
| 曹孟德 | 82.0 |
| 孙悟空 | 87.5 |
| 猪悟能 | 88.0 |
+-----------+---------+
6 rows in set (0.00 sec)
查询语文成绩大于80或者英语大于60的同学:
mysql> select name, chinese, english from exam_result where chinese > 80 or english > 60;
+-----------+---------+---------+
| name | chinese | english |
+-----------+---------+---------+
| 孙悟空 | 87.5 | 77.0 |
| 猪悟能 | 88.0 | 90.0 |
| 曹孟德 | 82.0 | 67.0 |
| 孙权 | 70.0 | 78.5 |
+-----------+---------+---------+
4 rows in set (0.01 sec)
查询数学成绩在[80 90]的同学:
mysql> select name, math from exam_result where math >= 80 and math <= 90;
+-----------+------+
| name | math |
+-----------+------+
| 曹孟德 | 84.0 |
| 刘玄德 | 85.0 |
+-----------+------+
2 rows in set (0.00 sec)
mysql> select name, math from exam_result where math between 80 and 90;
+-----------+------+
| name | math |
+-----------+------+
| 曹孟德 | 84.0 |
| 刘玄德 | 85.0 |
+-----------+------+
2 rows in set (0.00 sec)
上述两种写法都是可以的
查询英语成绩是56分,67分,77分的同学:
mysql> select name, english from exam_result where english in(56,67,77);
+-----------+---------+
| name | english |
+-----------+---------+
| 唐三藏 | 56.0 |
| 孙悟空 | 77.0 |
| 曹孟德 | 67.0 |
+-----------+---------+
3 rows in set (0.00 sec)
mysql> select name, english from exam_result where english = 56 or english = 67 or english = 77;
+-----------+---------+
| name | english |
+-----------+---------+
| 唐三藏 | 56.0 |
| 孙悟空 | 77.0 |
| 曹孟德 | 67.0 |
+-----------+---------+
3 rows in set (0.00 sec)
上述这两种也是可以的
查询姓‘孙’的同学:
%匹配任意多个(包括0个)字符
mysql> select name from exam_result where name like '孙%';
+-----------+
| name |
+-----------+
| 孙悟空 |
| 孙权 |
+-----------+
2 rows in set (0.00 sec)
_匹配严格的一个任意字符
mysql> select name from exam_result where name like '孙_';
+--------+
| name |
+--------+
| 孙权 |
+--------+
1 row in set (0.00 sec)
查询没有数学成绩的同学:
mysql> select name, math from exam_result where math is null;
Empty set (0.00 sec)
查询有数学成绩的同学:
mysql> select name, math from exam_result where math is not null;
+-----------+------+
| name | math |
+-----------+------+
| 唐三藏 | 98.0 |
| 孙悟空 | 78.0 |
| 猪悟能 | 98.0 |
| 曹孟德 | 84.0 |
| 刘玄德 | 85.0 |
| 孙权 | 73.0 |
| 宋公明 | 65.0 |
+-----------+------+
7 rows in set (0.00 sec)
2.8分页查询(limit)
分页查询,限制了每次查询显示的最多为多少条数据,比如我们现在只查询俩条数据:
mysql> select * from exam_result limit 2;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
+------+-----------+---------+------+---------+
2 rows in set (0.00 sec)
搭配offset关键字,offset称为偏移量(相当于下标),offset默认是从0开始的
mysql> select * from exam_result limit 2 offset 2;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 3 | 猪悟能 | 88.0 | 98.0 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
+------+-----------+---------+------+---------+
2 rows in set (0.00 sec)
3、修改操作(Update)
--update 表名 set 列名 = 值 where 条件
mysql> update exam_result set english = 56 where name = '曹孟德';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
--修改结果:
mysql> select name, english from exam_result;
+-----------+---------+
| name | english |
+-----------+---------+
| 唐三藏 | 56.0 |
| 孙悟空 | 77.0 |
| 猪悟能 | 90.0 |
| 曹孟德 | 56.0 |
| 刘玄德 | 45.0 |
| 孙权 | 78.5 |
| 宋公明 | 30.0 |
+-----------+---------+
7 rows in set (0.00 sec)
修改多个列,set后面写多组列,分别进行= 赋值即可
修改操作也可以借助一些表达式,还可以搭配order by 和 limit
如果update不指定任何条件,所有的数据都会被修改
4、删除操作(Delete)
--delete from 表名 where 条件;
mysql> delete from exam_result where name = '宋公明';
Query OK, 1 row affected (0.01 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.0 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 56.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
+------+-----------+---------+------+---------+
6 rows in set (0.00 sec)
注意:删除操作也是在操作数据库服务器的硬盘,需要小心
delete 的操作,后面的条件是可以跟 update 一样的,支持 where,order by,limit 等操作
如果没有写任何条件,那就是把整个表中的数据都删除了