1.CRUD
1. 在SQL中,我们可以在 -- 后写注释的内容。
2. CRUD即增加(Create),查询(Retrieve),更新(Update),删除(Delete)的英文首字母缩写。
2.增加(Create)
SQL语句:
insert into 表名 (列名,列明...) values (值,值);
2.1 单行插入
举例:
在以上所示的结构的表中插入一条id=1,名字为张三的数据。
insert into student(id,name) values (1,'张三');
结果如下图
注意事项:中文要用 ' ' 括起来,且后面括号中的赋值顺序要与前面括号里的列顺序一致。
当有一列的属性没有手动赋值时,其就会被赋值为默认值。
insert into student(name) values ('李四');
2.2 多行插入
一条插入的SQL语句可以同时插入多条数据。
insert into student(id,name) values (2,'王五'),(3,'赵六'),(4,'钱七');
运行结果
小问题:一次插入一条数据和一次插入多条数据哪个的效率更高?
当我们执行所有的SQL语句时,都会有网络的开销,且插入数据时也有磁盘IO的开销,每次执行一条SQL语句都会形成一个新的事务,每个事务的开启与关闭都会消耗一定的系统资源,所以说,如果插入的数据的数量在可控的方位内,一次插入多条数据的效率要比一次插入一条数据效率高。
3.查询(Retrieve)
3.1 全列查询
SQL语句:
select * from 表名;
举例:查询student表中所有的学生信息
select * from student;
3.2 指定列查询
语法:
select 列名, [列名] from 表名;
举例:在以上表中,查询exam表中的同学们的语文成绩。
select name,chinese from exam;
运行结果
3.3 表达式和别名查询
1.我们想查询的列也可以是一个表达式。
举例:我们想查询同学们语数英三科总分的信息。
select id,name,chinese+math+english from exam;
同时,我们也可以对查询的列起别名。
select id as 学号,name as 名字,chinese+math+english as 总分 from exam;
关键字 as 也可以去掉。
select id 学号,name 名字,chinese+math+english 总分 from exam;
运行结果
注意事项:起别名时,不论别名是英文还是中问,如果别名间有空格,那么别名要用 ‘ ’ 括起来,如果别名之间没有空格,‘ ’ 用或者不用都行。
3.4 去重查询(distinct关键字)
语法:
select distinct 列名 from 表名;
去重查询就是如果查询列的数据相同,那么查询之后出来的临时表就只会显示一条。要注意,这里的相同是指查寻列的数据相同就行了。
举例说明,我们先向exam表中插入一条新的数据,如下图
从上图可知,孙悟空和孙大圣的语数英三科成绩一样 ,如果我们这样实现去重查询,如下:
select distinct id,chinese,math,english from exam;
结果如下
我们发现语数英相同分数并没有实现去重,是因为所查询的列中的 id 的值不同。
select distinct chinese,math,english from exam;
运行结果
这时候我们发现去重查询就成功了,去重中的数据中,他们的chinese,math和english的值是一样的。
3.5 排序查询 (order by)
在Mysql中,提供了两种排序方式,分别为asc(升序)和desc(降序)。
语法:
select 列名 from 表名 order by 列名 asc | desc;
举例:将下列成绩按数学成绩的升序进行查询
select * from exam order by math asc;
运行结果
排序时也可以用别名来查询。
举例:按总分大小以降序查询。
select id,name,chinese+math+english total from exam order by total desc;
3.6 条件查询(where)
我们先来介绍以下在SQL中的运算符。
1.比较运算符
运算符 | 说明 |
>,>=,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于,用于null之间不安全,null=null返回的结果为null |
<=> | 等于,专门针对NULL来做判断的 |
!=,<> | 不等于 |
between a0 and a1 | a1<=values<=a1 |
in(option,...) | 如果属于集合任意一个,就得到返回值TRUE(1) |
is NULL | 是NULL |
is not NULL | 不是NULL |
like | 模糊匹配,%表示任意多个字符(包括0个),_表示一个字符 |
2.逻辑运算符
运算符 | 说明 |
and | 多个条件都为true(1),表达式结果才返回true(1) |
or | 多个条件中有一个为true(1),表达式结果就返回true(1) |
not | 条件为 TRUE(1),结果为 FALSE(0) |
3.条件查询(where关键字)
条件查询就是根据一些指定条件来查询自己想要的结果。
语法:
select 列名 from 表名 where 条件;
1.练习
1.基本查询
select id,name,english from exam where english<60;
2.-- 查询语文成绩好于英语成绩的同学
select name,chinese,english from exam where chinese>english;
3.-- 查询总分在 200 分以下的同学
select name,chinese+math+english from exam where chinese+math+english<200;
此时,有一个小细节,就是where后面不能使用前面定义的别名。
如下图:
但下面这种写法就行
select name,chinese+math+english 总分 from exam where chinese+math+english<200 order by 总分 asc;
原因分析:这些与MySQL的内部实现有关,换句话说,就是与SQL语句的执行顺序有关。
1.首先,我们想要查询一些信息,我们现需要知道要从那张表中查询,所以要首先执行from 。
2. 确定那张表之后,要根据指定条件将特定的信息过滤出来,此时执行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;
2.-- 查询语文成绩大于80分,或英语成绩大于80分的同学
select name,chinese,english from exam where chinese>80 or english>80;
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 ...];
注意事项:由于删除是一个非常有风险的操作,就不过多介绍了。
谢谢观看!!!