0


Mysql表的增删查改(基础)

1.CRUD

  1. 在SQL中,我们可以在 -- 后写注释的内容。

  2. CRUD即增加(Create),查询(Retrieve),更新(Update),删除(Delete)的英文首字母缩写。

2.增加(Create)

SQL语句:

insert into 表名 (列名,列明...) values (值,值);

2.1 单行插入

举例:

b70e038de37f445ba8e619bf1e8dd92b.png

在以上所示的结构的表中插入一条id=1,名字为张三的数据。

 insert into student(id,name) values (1,'张三');

结果如下图

4ec60018b1a64cbe8178c34e2c47acda.png

注意事项:中文要用** ' ' 括起来,且后面括号中的赋值顺序要与前面括号里的列顺序一致。**

** **当有一列的属性没有手动赋值时,其就会被赋值为默认值。

insert into student(name) values ('李四');

bef0e76412b54d708f1b92bac91b27cd.png

2.2 多行插入

一条插入的SQL语句可以同时插入多条数据。

 insert into student(id,name) values (2,'王五'),(3,'赵六'),(4,'钱七');

运行结果

b31a665de95a41f68581d1c2b29ba259.png

小问题:一次插入一条数据和一次插入多条数据哪个的效率更高?

当我们执行所有的SQL语句时,都会有网络的开销,且插入数据时也有磁盘IO的开销,每次执行一条SQL语句都会形成一个新的事务,每个事务的开启与关闭都会消耗一定的系统资源,所以说,如果插入的数据的数量在可控的方位内,一次插入多条数据的效率要比一次插入一条数据效率高。

3.查询(Retrieve)

3.1 全列查询

SQL语句:

select * from 表名;

举例:查询student表中所有的学生信息

select * from student;

9392d13f7fbe4752892ce238ecf32a07.png

3.2 指定列查询

语法:

select 列名, [列名] from 表名;

b09fcde43bc748b6915d30bd2187e4cd.png

举例:在以上表中,查询exam表中的同学们的语文成绩。

 select name,chinese from exam;

运行结果

1ab7ed68f3e848359009c489aa82c088.png

3.3 表达式和别名查询

1.我们想查询的列也可以是一个表达式。

举例:我们想查询同学们语数英三科总分的信息。

select id,name,chinese+math+english from exam;

a7d91eae2f994b399e58222623b7ec04.png

同时,我们也可以对查询的列起别名。

 select id as 学号,name as 名字,chinese+math+english as 总分 from exam;

关键字 as 也可以去掉。

select id 学号,name 名字,chinese+math+english 总分 from exam;

运行结果

d7150baf98744480844be1fe56bb5a08.png

注意事项:起别名时,不论别名是英文还是中问,如果别名间有空格,那么别名要用 ‘ ’ 括起来,如果别名之间没有空格,‘ ’ 用或者不用都行。

3.4 去重查询(distinct关键字)

语法:

select distinct 列名 from 表名;

去重查询就是如果查询列的数据相同,那么查询之后出来的临时表就只会显示一条。要注意,这里的相同是指查寻列的数据相同就行了。

** **举例说明,我们先向exam表中插入一条新的数据,如下图

4639c7f77a484d5590a70bd294286390.png

从上图可知,孙悟空和孙大圣的语数英三科成绩一样 ,如果我们这样实现去重查询,如下:

 select distinct id,chinese,math,english from exam;

结果如下

c94eeaa5bbdd458a8e174889c02d69ff.png

我们发现语数英相同分数并没有实现去重,是因为所查询的列中的 id 的值不同。

 select distinct chinese,math,english from exam;

运行结果

90144a7a27a74edda571e876a0baca7c.png

这时候我们发现去重查询就成功了,去重中的数据中,他们的chinese,math和english的值是一样的。

3.5 排序查询 (order by)

在Mysql中,提供了两种排序方式,分别为asc(升序)和desc(降序)。

语法:

select 列名 from 表名 order by 列名 asc | desc;

举例:将下列成绩按数学成绩的升序进行查询

f7e3ba08a708472d9ec9c8b9cc065583.png

 select * from exam order by math asc;

运行结果

d7626bc83bcc41218a02c23ffea4ba88.png

排序时也可以用别名来查询。

举例:按总分大小以降序查询。

 select id,name,chinese+math+english total from exam order by total desc;

964b6faad27d4d85a5a3a33fabc212ae.png

3.6 条件查询(where)

我们先来介绍以下在SQL中的运算符。

1.比较运算符

运算符说明>,>=,<,<=大于,大于等于,小于,小于等于=等于,用于null之间不安全,null=null返回的结果为null<=>等于,专门针对NULL来做判断的!=,<>不等于between a0 and a1a1<=values<=a1in(option,...)如果属于集合任意一个,就得到返回值TRUE(1)is NULL是NULLis not NULL不是NULLlike模糊匹配,%表示任意多个字符(包括0个),_表示一个字符

2.逻辑运算符

运算符说明and
多个条件都为true(1),表达式结果才返回true(1)
or多个条件中有一个为true(1),表达式结果就返回true(1)not

  条件为 TRUE(1),结果为 FALSE(0) 

3.条件查询(where关键字)

条件查询就是根据一些指定条件来查询自己想要的结果。

语法:

select 列名 from 表名 where 条件;

9adf259e7eaf41f59d8f09399cddeab0.png

1.练习

1.基本查询

1.--查询英语成绩不及格的同学

 select id,name,english from exam where english<60;

b0610b15de64485b88b4dcf6ef04ff44.png

2.-- 查询语文成绩好于英语成绩的同学

select name,chinese,english from exam where chinese>english;

819465ff3009482cb0033f9cac1f7eba.png

3.-- 查询总分在 200 分以下的同学

 select name,chinese+math+english from exam where chinese+math+english<200;

12b20665a985421cb8dca9bc5a2b173c.png

此时,有一个小细节,就是where后面不能使用前面定义的别名

如下图:

963c7d01acbf4536b207ed2c35c3925a.png

但下面这种写法就行

 select name,chinese+math+english  总分 from exam where chinese+math+english<200 order by 总分 asc;

1ec0d01bbc4840e987ef16b66ea58e33.png

原因分析:这些与MySQL的内部实现有关,换句话说,就是与SQL语句的执行顺序有关。

5ad1773d414e4e258e08a6143b1b6fa6.png

1.首先,我们想要查询一些信息,我们现需要知道要从那张表中查询,所以要首先执行from 。

  1. 确定那张表之后,要根据指定条件将特定的信息过滤出来,此时执行where,由于此时select还没执行,所以别名还没定义,此时使用别名就会报错。

3.接着要打印我们要查询的信息(字段),此时执行select

4.最后根据过滤出来的信息,进行排序,此时执行order by

2.and与or

1.-- 查询语文成绩大于80分,且英语成绩大于80分的同学

select name,chinese,english from exam where chinese>80 and english>80;

911e53dc84164a849edba3dc980c8c39.png

2.-- 查询语文成绩大于80分,或英语成绩大于80分的同学

select name,chinese,english from exam where chinese>80 or english>80;

f46e30e88c054368922233f4c2045420.png

3.--观察and和or的优先级

观察代码以下两列代码

select name,chinese,math,english from exam where chinese>80 or math>70 and english>70;

运行结果

select name,chinese,math,english from exam where (chinese>80 or math>70) and english>70;

仔细观察,能得知and的优先级顺序大于or的优先级顺序。 整体的优先级顺序为not>and>or

4.范围查询

4.1 between...and...

1.--查询语文成绩在 [80, 90] 分的同学及语文成绩

 select name,chinese from exam where chinese between 80 and 90;

2.--使用 AND 也可以实现

 select name,chinese from exam where chinese >=80 and chinese<=90;

4.2 in关键字

1.-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩

select name,math from exam where math in(58,59,98,99);

2.-- 使用 OR 也可以实现

select name,math from exam where math=58 or math=59 or math=98 or math=99;

5.模糊查询(like关键字)

1.-- % 匹配任意多个(包括 0 个)字符

select * from exam where name like '孙%';

2.-- _ 匹配严格的一个任意字符

select * from exam where name like '孙_';

6.分页查询(limit关键字)

1.语法:

1.select 列名 from [ where 条件 ] [order by 列名 asc|desc ] limit n;

说明:从0开始,筛选出n条数据。

2.select 列名 from [ where 条件 ] [order by 列名 asc|desc ] limit start,n;

说明:从start条数据开始筛选出n条数据。

3.select 列名 from [ where 条件 ] [order by 列名 asc|desc ] limit n offset start;

说明:从start条数据开始筛选出n条数据。

star=(当前页数-1) 每页显示条数(n)*

2.练习

按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页

第一页:

select * from exam limit 3;

第二页:

select * from exam limit 3,3;

第三页:

select * from exam limit 6,2;
select * from exam limit 6,3;

4.修改(Update)

1.语法:

update 表名 set=新值 列名 [where 条件] [ order by...] [ limit n];

2.练习

1.-- 将孙悟空同学的数学成绩变更为 80 分

update exam set math=80 where name='孙悟空';

2.-- 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分

 update exam set math=60,chinese=70 where name='曹孟德';

3.-- 将总成绩倒数前三的 3 位同学的数学成绩加上 10 分

update exam set math=math+10 order by chinese+math+english asc limit 3;

5.删除(Delete)

语法:

**delete from 表名 [where 条件] [ order by 列名 asc|desc ] [limit ...]; **

注意事项:由于删除是一个非常有风险的操作,就不过多介绍了。

谢谢观看!!!

标签: mysql 数据库

本文转载自: https://blog.csdn.net/2302_80826557/article/details/142004711
版权归原作者 徐子童 所有, 如有侵权,请联系我们删除。

“Mysql表的增删查改(基础)”的评论:

还没有评论