目录
2.6.2、按照降序顺序排序 (关键字desc——》descend)
2.7.4、判断要查询的数据在指定的集合中(in(值,值....))
3.3、与where 、order by和表达式等的搭配使用
1、新增/插入数据
1.1、给表中所有字段插入数据
语法结构:
insert into 表名 values (值,值,....);
注意:
- 在表中插入数据的时候,数据的个数,类型,顺序要和创建这个表的时候是一致的(表头/字段一致) 。
- 在数据库中没有字符类型,所以单引号和双引号都可以表示字符串。
- 数据库在创建时,没有修改字符集,默认情况下数据库使用的字符集时“拉丁文”字符集,不能表示汉字。
1.1、给表中指定字段(列)插入数据
语法格式:
insert into 表名 (列名,列名,....)values ('值','值',....);
//后面给的值,要和前面的列名顺序、个数、类型一致
我们可以通过(select*from 表名)来查看结果,select语句下面会说到。
1.2、一次插入多条记录
语法格式:
1、insert into 表名 values ('值','值',....),('值','值',....); 2、insert into 表名 (列名,列名,....) values ('值','值',....),('值','值',....);
❗❗❗ 总结:一次插入N个记录,比N次插入一个记录,效率要高一些。因为数据库是一个客户端服务器结构的程序,输入一次,客户端就要和服务器交互一次,那么交互的次数越少,使用的时间就越少。
1.3、时间日期数据的插入
这里单独说时间日期在表中的插入,主要是因为插入时间的时候,是通过特定格式的字符串来表示日期的,例如:2023-4-21 17:48:00
1.3.1、手动插入某个时间
1.3.2、插入当前时刻的时间
sql中提供了一个特殊的函数now(),可以得到当前时刻的时间。
2、查找操作
数据库是一个客户端服务器结构的程序,客户端发送一个请求,服务器会根据请求的sql查询保存的数据,把数据读取出来,通过网络返回个客户端,这个结果相当于一个“临时表”,这个临时表也叫做“结果集”。
2.1、全列查找(查找表的所有行,所有列)
语法格式:
select * from 表名; // *号表示所有的列,这种特殊含义的符号,计算机中叫做“通配符”
上述说到查询的时候,客户端向服务器发送请求,服务器会根据sql语句,将数据从硬盘中读取出来,通过网络发送给客户端。
这样就导致了一个问题,当我们采用select *这样的方式查询数据,如果表当中的数据非常多,这样就会瞬间将硬盘贷款和网络的带宽全部吃满,就可能导致其他程序无法使用硬盘或者网络。所以这种查询方式非常危险。
什么是带宽??
- 带宽,将它想象成一条公路,有的路较窄,单位时间能通过的车就比较少,称为“带宽低”,有的路比较宽,单位时间能通过的车就很多,称为“带宽高”。可以用1s能够读写多少个字节,或者多少个bit来衡量带宽。
- 说到带宽,有的同学会想到总线的问题,就电脑而言,有的电脑是32位总线,有的是64位总线。这里我们可以将总线想象成车速。带宽是公路。
全列查询操作非常危险,下面的操作可以针对上述的问题,进行一些优化,但是还是存在一定的危险,在使用查询语句的时候一定要非常的谨慎。
2.2、指定列查询
语法格式:
select 列名,列名...from 表名;
指定查询某一列或者某些列
2.3、查询字段为表达式 (进行的是列和列之间的运算)
表示的意思是查询过程中,可以做一些简单的运算,(这里的查询时的运算是列和列之间的运算,而不是行和行之间)。因为我们后面还会说到聚合查询,这是行和行之间运算。
2.3.1、对查询的列加减乘除
例如:
select name,math+10 from exam_result;
❗❗❗注意:
我们在创建exan_result这个表的时候,指定的成绩的数据类型为decimal(3,1),表示的意思为只能插入deciaml类型的数据且有效数字为3位,小数点之后只能有一个数字。所以我们不能插入三位整数,当插入三位整数的时候,实际上插入的是四位有效数字(xxx.x)。
给表exam_result中插入数据
对exam_result表中的每一行的数学成绩+10.
❓❓❓上面说到,成绩的数据类型是decimal(3,1)不能插入3位整数,但是math+10之后,成绩成为3位数字了,有效数据为4位,那就不符合我们建表时的规定了,为什么程序没有报错,输出了结果???
这里我们还是要说到MySQL是一个客户端-服务器结构的程序。我们在插入数据的时候,将数据插入到服务器中,服务器中的数据保存在硬盘中,我们通过查询的时候,在客户端输入sql,通过请求发送给服务区,服务区解析并执行sql把查询的结果从硬盘中读取出来,通过网络响应还给客户端,客户端把这些数据以临时表的形式展示出来。客户端上展现出来的表和硬盘上的表没有什么关系。在客户端中临时表的成绩的数据类型,我们可以认为是decimal类型的,没有规定有效数字位数和小数点位数。
2.3.2、 对查询的多个列进行加减乘除
2.4、别名(使用as关键字)
像上述的,查询字段为多个列的求和,最终列名和表达式一样,这样很多时候表达式是不直观的我们不可能在阅读表的时候,根据表达式分析这一列表示的是什么。所以我们给他起一个名字,能够表达这一列是什么意思。
❗❗❗ as可以神略,但是不建议使用,不加as 这使代码的阅读性降低
2.5、去重查询 (关键字distinct)
distinct针对指定列经行去重(把重复的行只保留一个)
distinct针对单个列进行去重。
distinct针对多个列进行去重的时候,要求这些列的值都相同,才视为重复。
2.6、按照查询结果排序(order by 语句)
order by 子句,指定某些列进行排序,有可能是升序,有可能是降序。
2.6.1、按照升序顺序排序(关键字asc)
❗❗❗注意:使用asc关键字表示升序排序,但是省略不写默认就是升序
按照一个列查询,将查询结果进行排序
❗❗❗ 注意:对于MySQL来说,如果一个sql没有指定order by,此时的查询结果集的数据顺序,是不可预期的,顺序是乱的。
2.6.2、按照降序顺序排序 (关键字desc——》descend)
❗❗❗注意:
- 这里的desc写在erder by 之后,表示的是descend的缩写,表示的降序排序。
- 若直接写在开头后面跟的是表名,这里他是describle的缩写,表示描述一个数据表结构
2.6.3、指定多个列来排序
- 指定多个列来进行排序,多个列之间使用逗号(,)来分割。这个列越靠前,就是越关键的排序依据。
- 先按照第一列排序,如果第一列的值中存在相同的,再按照第二列排序。
可以这样理解,先按照数学成绩降序排序,如果数学成绩中存在相同的,则使用语文成绩进行排序,将数学成绩重复的两个人的语文成绩进行降序排序,其他人的语文成绩排序无效。
2.7、条件查询
在查询的时候指定筛选条件,符合条件的数据留下,不符合的直接不显示。
sql中通过一系列的运算符来表示条件。
通过where子句,搭配上条件表达式,就可以完成条件查询
2.7.1、条件运算符
比较运算符:
运算符 | 说明 |
> ,>= ,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于,null不安全,例如null = null 结果是null |
<=> | 等于,null安全,例如null <=> null的结果是true |
!=,<> | 不等于 |
between 数值 and 数值 | 范围匹配,[ a0,a1],如果a0 <= value <= a1,返回true |
in(option,...) | 判断或者查找的元素如果是option中的任意一个,返回true |
is null | 是null |
is not null | 不是null |
like | 模糊匹配。%表示任意多个(包括0个)任意字符; _表示任意一个字符 |
❗❗❗注意:
- 这里的(=与<=>)都有比较的意思,只不过=不能比较null,而<=>能过比较null,当null<=>null的时候,结果为true。
- =在sql中别的地方表示的意思有可能是赋值,但是在条件查询这里表示的意思为比较的意思。
逻辑运算符:
运算符 | 说明 |
and | 多个条件都为true,结果才是true,相当于Java当中的&& |
or | 任意一个条件为true,结果为true,相当于Java当中的|| |
not | 条件为true,结果为false,相当于Java当中的! |
2.7.2、使用比较运算符进行条件查询
1、查询语文成绩不及格的成绩(<60)
相当于将语文成绩通过遍历,将不及格的显示出来作为结果集。
2、查询语文成绩好于英语成绩的同学
条件查询可以直接拿两个列进行的比较
3、查询总分在200分以下的同学(条件查询,可以使用表达式作为条件)
两种查询方式都可以实现查询总分小于200的人。
- 第一种,默认将查询到的人的所有信息都显示出来,表达式作为查询条件,最终没有显示总分,这里在sql种指定的条件,可以在select查询的列中出现,也可以不出现。
- 第二种,我们指定显示总分没有超过200的人姓名,和总分信息。第二种select查询中出现的列名,是以表达式的方式显示,但是这种方式不直观。我们可以给表达式作为列名的这一列起一个别名,让表格阅读更加直观。
在条件查询的时候给总分列设置别名
❗❗❗ 注意:
给第二种显示总分的条件查询中,总分那一列设置别名的时候,存在一个小问题。
我们在前面虽然说给Chinese+math+English设置了别名,但是这句代码报错的原因就是在判断的时候并不认识total.
sql语句存在的执行规则
- 这里就表明我们写下一个sql语句之后,在执行的时候,并不是从前往后的执行,它的执行是由一定的顺序。
- 就上述代码而言,它的执行规则就是。
- 遍历每一行数据
- 把这一行数据带入到where的条件中
- 符合条件的结果,再根据select这里指定的列,进行查询/计算
2.7.3、使用逻辑运算符进行条件查询
1、查询语文成绩大于80并且英语成绩大于80(and)
2、查询语文大于80或者英语大于80(or)
如果一个where中即存在and有存在or,先执行and后执行or。
2.7.4、指定范围查询(between and )
(between and ) 约定的是前闭后闭的区间。包含两侧边界。
1、查询语文成绩在[80,90]之间同学的成绩
2.7.4、判断要查询的数据在指定的集合中(in(值,值....))
1、查询数学成绩是58或者59或者98或者99的同学的数学成绩
2.7.5、模糊查询(like)【重点】
模糊查询起到的一个效果就是,能够模糊匹配,不要求元素完全相同,只要满足一定的规则就可以。
like支持两个用法:
1、使用%:代表任意0个或者N个字符
2、使用 (下划线)_:代表任意1个字符
1、查询姓孙的同学的成绩(%)
这样就可以查到两个同学,不论孙后边是几个字,只要是满足(孙%)规则的就会全部输出。
2、使用下划线(_)按照上述查找姓孙同学的成绩
一个下滑线,只能代表一个字。
2.7.6、NULL的查询
❗❗❗注意:
- sql中null和其他数值进行运算,结果还是null,null和null进行比较相等,最终结果还是null,在查询条件中相当于false。(不能使用null = null,进行比较)
- 在sql中null要比较相等,提供了<=>,用来处理null的比较。
使用=比较null相等。
使用<=>比较相等。
也可以使用is null这个比较运算符(is null 判断是否为空)
2.8、分页查询(limit搭配offset)
limit规定每一页查询几行数据。
offset规定每一页从第几行开始查询。
这种是我们在前端中常见的分页查询,当数据特别多的时候,我们可以使用分页查询,先查询一部分,每一页查询5个数据。想要查询剩余数据,点击下一页。这样查询的好处在于系统的压力就大大减小。
limit单独使用
limit与offest搭配使用
limit 3 offset 6 与limit6,3是一个等价的写法,但是limit 6,3这种写法不推荐,可读性不高。
❗❗❗ 注意:limit可以和前面的查询条件,搭配使用的(例如:与条件查询,去重查询,模糊查询...)
举例:查询总分前三名的同学。
3、修改(update)
语法格式
update 表名 set 列名 = 值,列名 = 值.... (where 条件/order by /limit等); //这里的set表示的意思为设置。()中的这些可以有也可以没有,主要看题目的需求。
3.1、针对单个列进行修改
将孙悟空同学的数学成绩变为80分
注意:不设置条件 ,修改就是针对所有行的math列进行的
3.2、针对多个进行修改
3.3、与where 、order by和表达式等的搭配使用
1、将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
修改超出范围,不会执行
❗❗❗ 注意:
在修改值的时候,不能使用Java中的math += 30,这种写法,sql中是不支持的。、
update这也是一个非常危险的操作。操作不当可能会将所有数据都改掉。
4、删除(delete)【针对表中的行】
语法格式:
delete from 表名 (where 条件、order by、limit....) //括号中的内容可以与delete 搭配使用。
删除孙这一行的记录
4.1、删除的时候什么都不搭配
这样的操作与删表基本没有什么区别了(drop table exam_result;)
只不过这样写,exam_result表还存在,使用 drop table exam_result,这个表和数据都会被删除。
❗❗❗注意:
- 这里还有一种清空表的方式使用关键字truncate,truncate直接将表中所有的数据一次删完。
- delect 关键字,删除表中的数据,是一条一条删除。删的慢。
- 如果误删大量数据的话,还可能停止保留一部分数据,但是使用truncate,则没有挽救的机会了
- delect这个操作也是比较危险的。