文章观看路线
1. 新增
插入列的相关数据
分类:
1.一次插入一个
insert into 表名 values (值,值);
注:插入的值必须和列(个数与类型)对应
正确写法:
mysql> insert into student values (16,'dog',202320401167,'2003-10-18');
错误写法:
mysql> insert into student values (16,'dog');
2.一次插入多个
insert into 表名 values (值,值),(值,值); 语法正确
insert into 表名 values (值,值),(值,值,值); 语法错误
一次插入一个或多个均要求新增值的类型必须和表中列的个数和类型相同
3.一次选定字段进行插入(建议用)
insert into 表名(列名,列名) values (值,值);
**注:**sql中没有字符串类型,只有字符类型。在sql中表示字符串用 ‘ 或 ’‘
2. 查询
数据库中的增删改都比较简单,唯有查询‘’玩的挺花~‘’,查询方式很多,我已经创建了student表,现在进行查询操作
注:查询都是针对行或列操作的临时数据,也就是说一下所有的操作都不会使MySQL服务器中的数据改变
有以下几种查询方式:
2.1 全列查询(针对列)
select * from 表名; (在工作中此操作要慎重)
-- 查询student表的所有内容
mysql> select * from student;
+------+----------+---------+---------------------+
| id | name | grade | time |
+------+----------+---------+---------------------+
| 1001 | 高生 | 2002203 | 2004-10-18 00:00:00 |
| 1002 | 十六 | 2023201 | 2002-10-16 12:00:00 |
| 18 | zhangsan | 002 | 2004-10-16 00:00:00 |
| 18 | 张三 | 002 | 2004-10-16 00:00:00 |
| 18 | 高博 | NULL | NULL |
| 17 | 亏 | NULL | NULL |
| 10 | 十三 | NULL | NULL |
| 2 | 一 | NULL | NULL |
| 1002 | 十六 | NULL | NULL |
+------+----------+---------+---------------------+
9 rows in set (0.00 sec)
不要使用该操作,现在是自己在电脑上创建数据库进行查询,但进入公司后数据库的数据表是很庞大的,而MySQL是一个客户端-服务器的软件,客户端和服务器通过网络进行交流。进行全列查询,大量数据会把硬盘io(或网卡的带宽)跑满,让其他客户端访问很慢(也就是服务器挂掉)
2.2 指定列查询(针对列)
select 列,列 from 表名;
-- 查询student表的id,name
mysql> select id,name from student;
+------+----------+
| id | name |
+------+----------+
| 1001 | 高生 |
| 1002 | 十六 |
| 18 | zhangsan |
| 18 | 张三 |
| 18 | 高博 |
| 17 | 亏 |
| 10 | 十三 |
| 2 | 一 |
| 1002 | 十六 |
+------+----------+
9 rows in set (0.00 sec)
2.3 查询的列为表达式(针对列)
select 列+列 from 表名;
-- 查询student表的id+grade
mysql> select name,id+grade from student;
+----------+----------+
| name | id+grade |
+----------+----------+
| 高生 | 2003204 |
| 十六 | 2024203 |
| zhangsan | 20 |
| 张三 | 20 |
| 高博 | NULL |
| 亏 | NULL |
| 十三 | NULL |
| 一 | NULL |
| 十六 | NULL |
+----------+----------+
9 rows in set (0.00 sec)
select 列(±*/) from 表名;
-- 查询student表的id+8
mysql> select id+18 from student;
+-------+
| id+18 |
+-------+
| 1019 |
| 1020 |
| 36 |
| 36 |
| 36 |
| 35 |
| 28 |
| 20 |
| 1020 |
+-------+
9 rows in set (0.00 sec)
表达式查询,是列与列之间(或单独列)进行的计算,并且不修改数据库中原始的值,只是在最终的临时结果里进行计算,以临时表的形式进行展示。
原因是数据库的服务器接收到客户端的请求后只对数据进行处理(不进行修改),再响应到客户端。
2.4 查询时给列起别名(针对列)
select 列+列 as 别名 from student;
-- 查询student表的id+grade时起别名
mysql> select name,id+grade as total from student;
+----------+---------+
| name | total |
+----------+---------+
| 高生 | 2003204 |
| 十六 | 2024203 |
| zhangsan | 20 |
| 张三 | 20 |
| 高博 | NULL |
| 亏 | NULL |
| 十三 | NULL |
| 一 | NULL |
| 十六 | NULL |
+----------+---------+
9 rows in set (0.00 sec)
查询时给列/表达式指定别名,也能给表指定表名
2.5 查询时去重(针对行)
select distinct 列名 from 表名; (查询并去重一列)
-- 查询student表时给id去重
mysql> select distinct id from student;
+------+
| id |
+------+
| 1001 |
| 1002 |
| 18 |
| 17 |
| 10 |
| 2 |
| NULL |
| 16 |
+------+
select distinct 列名,列名 from 表名; (查询并去重多列,但多列时只有它们每行相同才能去重)
-- 查询student表id和name同时去重
mysql> select distinct id,name from student;
+------+----------+
| id | name |
+------+----------+
| 1001 | 高生 |
| 1002 | 十六 |
| 18 | zhangsan |
| 18 | 张三 |
| 18 | 高博 |
| 17 | 亏 |
| 10 | 十三 |
| 2 | 一 |
| NULL | NULL |
| 16 | dog |
+------+----------+
2.6 查询时排序(针对行)
注:
- asc是升序,desc是降序,若省略不写就是升序
- 查询时不加order by查出来的数据库是无序的
select 列名 from 表名 order by 列名 (asc/desc);
-- 查询student表时将id升序排列
mysql> select id,name from student order by id asc;
+------+----------+
| id | name |
+------+----------+
| NULL | NULL |
| 2 | 一 |
| 10 | 十三 |
| 16 | dog |
| 17 | 亏 |
| 18 | zhangsan |
| 18 | 张三 |
| 18 | 高博 |
| 1001 | 高生 |
| 1002 | 十六 |
| 1002 | 十六 |
+------+----------+
select 列名,列名 from 表名 order by 列名 (asc/desc),列名 (asc/desc);
-- 查询student表时先按id升序排列,若id相同则按name降序排列
mysql> select id,name from student order by id asc,name desc;
+------+----------+
| id | name |
+------+----------+
| NULL | NULL |
| 2 | 一 |
| 10 | 十三 |
| 16 | dog |
| 17 | 亏 |
| 18 | 高博 |
| 18 | 张三 |
| 18 | zhangsan |
| 1001 | 高生 |
| 1002 | 十六 |
| 1002 | 十六 |
+------+----------+
2.7 条件查询
select 列名 from 表名 where 条件;
[注]
null参与运算依旧是null,如null+2 = null;
条件查询中是无法起别名的!!!
比较运算符:
1.> , < , >= , <= (大于,小于,大于等于,小于等于)
-- 查询student表中id>1000的值
mysql> select id,name from student where id > 1000;
+------+------+
| id | name |
+------+------+
| 1001 | 高生 |
| 1002 | 十六 |
| 1002 | 十六 |
+------+------+
2.= (等于,相当于Java中的== ),(不能使用null,如null=null,最后结果是null)
-- 查询student表中grade等于002的值
mysql> select id,name,grade from student where grade = 002;
+------+----------+-------+
| id | name | grade |
+------+----------+-------+
| 18 | zhangsan | 002 |
| 18 | 张三 | 002 |
+------+----------+-------+
3.<=> (等于,能使用null,如null=null,最后结果是true)
-- 查询student表中id不等于null的值
mysql> select id,name from student where id <=> null;
+------+------+
| id | name |
+------+------+
| NULL | NULL |
+------+------+
4.!= (不等于,不适用于null)
-- 查询student表中id不等于18的值
mysql> select id from student where id != 18;
+------+
| id |
+------+
| 1001 |
| 1002 |
| 17 |
| 10 |
| 2 |
| 1002 |
| 16 |
+------+
5.between A and B (查询的结果是闭区间)
-- 查询student表中id是[1,1001]的值
mysql> select id,name from student where id between 1 and 1001;
+------+----------+
| id | name |
+------+----------+
| 1001 | 高生 |
| 18 | zhangsan |
| 18 | 张三 |
| 18 | 高博 |
| 17 | 亏 |
| 10 | 十三 |
| 2 | 一 |
| 16 | dog |
+------+----------+
6.in( ) (在几个数内)
-- 查询student表中id是1001,18,56的值
mysql> select id,name from student where id in (1001,18,56);
+------+----------+
| id | name |
+------+----------+
| 1001 | 高生 |
| 18 | zhangsan |
| 18 | 张三 |
| 18 | 高博 |
+------+----------+
7 is null (只能针对一列)
-- 查询student表中id为空有哪些
mysql> select id from student where id is null;
+------+
| id |
+------+
| NULL |
+------+
8 is not null (只能针对一列)
-- 查询student表中grade不为空的值
mysql> select grade,name from student where grade is not null;
+--------------+----------+
| grade | name |
+--------------+----------+
| 2002203 | 高生 |
| 2023201 | 十六 |
| 002 | zhangsan |
| 002 | 张三 |
| 202320401167 | dog |
| 202320401167 | dog |
+--------------+----------+
9.like (模糊匹配)
like的使用要搭配通配符使用,分别是 % 和 _ (一个 _ 代表一个字符,%则不限制字符个数)
使用规则:
十%:查询以十开头的
%十:查询以十结尾的
%十%;查询包含十的
-- 查询student表中姓十的name有哪些
mysql> select name,id from student where name like '十%';
+------+------+
| name | id |
+------+------+
| 十六 | 1002 |
| 十三 | 10 |
| 十六 | 1002 |
+------+------+
-- 查询student表中包含三的name有哪些
mysql> select name from student where name like '%三%';
+------+
| name |
+------+
| 张三 |
| 十三 |
+------+
逻辑运算符:
1.and
mysql> select id,name,grade from student where id > 1 and grade < 20232012003;
+------+----------+---------+
| id | name | grade |
+------+----------+---------+
| 1001 | 高生 | 2002203 |
| 1002 | 十六 | 2023201 |
| 18 | zhangsan | 002 |
| 18 | 张三 | 002 |
+------+----------+---------+
2.or
3.not
2.8 分页查询
分页查询犹如百度网站浏览的页数,会有第一页,第二页,正因为数据量过大,所以百度网站进行了分页查询
语法:select * from 表名 limit N offset M;(M是下标,从0开始查;N是查询几个结果)
-- 查询student表中只查出三个结果
mysql> select id,name from student limit 3;
+------+----------+
| id | name |
+------+----------+
| 1001 | 高生 |
| 1002 | 十六 |
| 18 | zhangsan |
+------+----------+
-- 查询student表从下标5开始查询,查两条结果
mysql> select id,name from student limit 2 offset 5;
+------+------+
| id | name |
+------+------+
| 17 | 亏 |
| 10 | 十三 |
+------+------+
3. 修改
语法:
- update 表名 set 列名=值 where 条件;(这里=是赋值,不是上篇文章中的运算符)
- update 表名 set 列名=值,列名=值 where 条件;(一次修改多列)
- update 表名 set 列名=值; 修改所有行的记录
语法剖析:
- set 设置要修改的数据
- where 条件 限制修改哪些行
-- 修改student表中id为1的数据,改成100
mysql> update student set id=100 where id=1;
mysql> select id from student where id=100;
+------+
| id |
+------+
| 100 |
+------+
-- 修改student表中id为80这一行的数据,id改为10,name改为‘程小时’
mysql> update student set id=10,name='程小时' where id=80;
mysql> select id,name from student;
+------+--------+
| id | name |
+------+--------+
| 1001 | 高生 |
| 1002 | 十六 |
| 10 | 程小时 |
| 10 | 程小时 |
+------+--------+
-- 将id+grade总数值倒数前三的id+10
mysql> select id,name from student order by id+grade asc limit 3;
+------+--------+
| id | name |
+------+--------+
| 10 | 小时 |
| 10 | 小时 |
| 190 | 十六树 |
+------+--------+
mysql> update student set id = id + 10 order by id+grade asc limit 3;
-- 给所有人的id+10
mysql> update student set id=id+10;
mysql> select id,name from student limit 10;
+------+------+
| id | name |
+------+------+
| 1011 | 高生 |
| 1012 | 十六 |
| 20 | 小时 |
| 20 | 小时 |
| 30 | 小时 |
| 30 | 小时 |
| 30 | 十三 |
| 110 | 一 |
| 1012 | 十六 |
| NULL | NULL |
+------+------+
4. 删除
语法:delete from 表名 where 条件/order by/limit;
-- 删除表中id为30或name为null的数据
mysql> delete from student where id=30 or name=null;
mysql> select id,name from student;
+------+--------+
| id | name |
+------+--------+
| 1011 | 高生 |
| 1012 | 十六 |
| 110 | 一 |
| 1012 | 十六 |
| NULL | NULL |
| 26 | dog |
| 26 | dog |
| 200 | 十六树 |
+------+--------+
番外小知识:
1.在条件查询时起别名无效,而order by却能起别名的原因:
根于MySQL执行语句的顺序,如下
mysql> select id+grade as total,name from student where total > 100;
ERROR 1054 (42S22): Unknown column 'total' in 'where clause'
select条件查询的语句执行顺序:
step1. 遍历表中的每个记录
step2. 把当前记录的值带入条件,根据条件进行筛选
step3. 如果条件成立,则保留,进行列上表达式的计算
step4. 如果有order by操作,order by最后执行
结合上述分析上面sql语句,where语句是第二步,在对记录进行筛选;而定义别名是第三步,当然是无效的~
2.不等于的另一种写法:
<> 是比较古老的写法了
3.通配符
通配符相当于扑克牌中的“王”,可以代替别的牌
4.模糊查询的功能有限:
若要查student表中包含两个三的name,模糊查询不适用,需要用正则表达式,一般现查就行,不用背
5.id is null 和 id <=> null的区别:
is null只能比较一个列,<=>可以比较两个列
6.delete和drop的区别:
delete是删除表中的数据表还在,drop是删除表连带着表中的数据一起删除
7.where,order by和limit同时书写的先后顺序:
先where,再order by,再limit
8.delete和drop都是很危险的操作,执行永久生效,一旦操作有错误无法挽回
9.数据库的备份方式:
- 全量备份:直接把数据库存在硬盘上的数据(二进制文件)拷贝到另一个电脑
- 全量/增量备份:mysql中自带的mysqldump工具可以把该数据库的所有语句转成insert语句,再把这些语句放到其他mysql中
- 增量(实时)备份:MySQL中的binlog功能,可以把mysql的各种操作通过日志记录下来。借助binlog功能,再让另一个mysql执行binlog内容就能得到一模一样的数据