目录
1、新增/插入数据
1.1、给表中所有字段插入数据
1.1、给表中指定字段(列)插入数据
1.2、一次插入多条记录
1.3、时间日期数据的插入
1.3.1、手动插入某个时间
1.3.2、插入当前时刻的时间
2、查找操作
2.1、全列查找(查找表的所有行,所有列)
2.2、指定列查询
2.3、查询字段为表达式 (进行的是列和列之间的运算)
2.3.1、对查询的列加减乘除
2.3.2、 对查询的多个列进行加减乘除
2.4、别名(使用as关键字)
2.5、去重查询 (关键字distinct)
2.6、按照查询结果排序(order by 语句)
2.6.1、按照升序顺序排序(关键字asc)
2.6.2、按照降序顺序排序 (关键字desc——》descend)
2.6.3、指定多个列来排序
2.7、条件查询
2.7.1、条件运算符
2.7.2、使用比较运算符进行条件查询
2.7.3、使用逻辑运算符进行条件查询
2.7.4、指定范围查询(between and )
2.7.4、判断要查询的数据在指定的集合中(in(值,值....))
2.7.5、模糊查询(like)【重点】
2.7.6、NULL的查询
2.8、分页查询(limit搭配offset)
3、修改(update)
3.1、针对单个列进行修改
3.2、针对多个进行修改
3.3、与where 、order by和表达式等的搭配使用
4、删除(delete)【针对表中的行】
4.1、删除的时候什么都不搭配
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这个操作也是比较危险的。