好兄弟们,有没有忘了咱们上节说的知识点呢?忘了也没关系,让我们开始复习吧!!!
上期我们介绍了数据类型,还有一些表的操作,我们常用的数据类型有:
1.数值类型 tinyint int bigint decimal(M,D)
2.字符类型varchar(M) text char(N)
3.日期类型date datetime
表操作
1. show tables;查看当前数据库中所有的表
2. use 数据库 :选择你要使用的数据库
3. select database(); :查看你使用的数据库
2. create table (
字段名1数据类型 comment ' 备注名',
字段名2 数据类型 );
3.desc 表名; 查看表结构
4. drop table [if exists] 表名;
通过上面的复习,相信大家对于上一章的内容已经了如指掌了,让我们接下来开始对新内容进行学习吧!!加油,各位!!
1.新增 (Create)
1.单行数据+全列插入
insert into 表名[(字段1,字段2)] values (值,值 );
插入一条新数据行 值 按照前面字段名的顺序,设置对应的值
定义表时的字段名,可以是多个也可是一个
字符串类型的值用英文的单引号包裹
mysql> select * from student; 前面指定的列,与后面values中的值要一一对应
如果列与值的个数据不匹配就会报一个错误,并且这条记录无法写入数据表
2 全类插入
insert into 表名values (值,值,值...);
简写方式,不用在表名后指定列名,在values列表中按表中定义字段的顺序设置相应的值
如果values列表中的值与列的个数据不匹配,依然会报
3.指定列插入
insert into 表名[(字段1,字段2)] values (值,值 );
没有指定ld这一列时,只写一个name的值,ld这一列就会用默认的值去填充,这个默认值就是NULL
4.多行插入
insert into 表名 [(指定列...)] values (值[,值..]) [,(值[,值..])][,(值[,值..])]...
一条insert语句在values部分,可以跟很个values组,每一组表示要插入的一个数据行
插入了五条数据行
5.通过以上插入方式,大家有没有什么疑惑呢?
思考:
一次插入一条数据和一次插入多条数据哪个效率高?
在 MySQL 数据库中,通常情况下一次插入多条数据的效率要比一次插入一条数据的效率高,主要原因如下:
网络开销方面
- 当一次插入一条数据时,每次插入操作都需要与数据库服务器进行一次网络通信交互。这意味着如果要插入多条数据,就会产生多次网络往返开销,包括建立连接、传输数据、等待服务器响应等过程,而网络通信往往是相对耗时的操作。
- 一次插入多条数据则可以将多条数据打包成一个批次,通过一次网络交互发送到数据库服务器,大大减少了网络开销,节省了频繁建立和断开网络连接以及传输小数据包所耗费的时间。
数据库事务处理方面
- 数据库操作通常是在事务的环境下进行的。一次插入一条数据,每条数据插入都可能会开启一个单独的事务(如果没有显式控制事务范围的话),事务的开启、提交或回滚都有一定的开销,多次这样的操作累积起来会影响性能。
- 而一次插入多条数据可以在一个事务中完成,只需开启一次事务,执行插入多条数据的操作,最后统一提交事务,减少了事务管理的总体开销。
数据库内部执行优化方面
- MySQL 的存储引擎(如 InnoDB 等)对于批量插入操作有一定的优化机制。例如,在插入多条数据时,它可以更有效地利用缓存、批量处理数据的写入逻辑等,相比多次单条插入能够更高效地将数据存储到磁盘等存储介质上。
小编在撰写博客,在使用数据库时,发现了一个问题,
为什么我们在插入时明明是汉字,但是MYSQL所给我们展示的数据不是汉字,而是一堆乱码呢?
让我来教大家来处理这个问题吧!!
首先声明一下这是由于编码集设置错误导致的数据写入异常
我们先写入这个命令去查看我们的字符集编码:
show variables like %character%;
在配置文件中把数据库服务的编码集改成latin1,这个编码集也是5.7版本中默认的编码集(画横线部分)
这时我们要打开MYSQL的配置文件去配置我们的字符集编码。
修改完成后重启MYSQL服务
或者手动设置新数据库的编码集
mysql> create database test_db character set latinl;
所以如果在以后写入一条中文数据时,出现类似的提示,首先要考虑一下数据库的编码集是否设置正确
如果确定了是编码集的问题,那么就要把原来的库删了,重新创建新库并指定正确的编码集
2.查询 (Retrieve)
1.全列查询
语法: select * from 表名;
这个表名-----> 要查询哪个表
注意我们一般再生产环境(日常工作)中在不清楚这个数据库的前提下不要随便查询全部的数据
非常危险的操作
因为在生产环境中,一个表中的数据量可能会很多很多,有可能达到TB级
1.当一个查询开始的时候,磁盘开销,会网络开销,
都是非常紧缺的资源
2.如果这一条语句开始执行,那么就有可能把服务器资源吃光,其他的程序或是数据库操作就要等待当前SQL执行完之后才能继续执行
因此不加任何限制的查询在生产环境不要使用。
我们在学习完插入后就可以给数据表插入数据了,这样才让我们有数据可以查,博主这里创建的例子为
2.指定列查询
select 列名[,列名] ... from 表名;
示例: 只查询Id,name,语文成绩
select id, name, chinese, 10 from exam; 查询的结果是一个表达式
数值类型,效果就是让所有的列中都包含一个表达式中的值
10 他本身并不在我们的真实的表里
把所有学生的语文成绩在原来的基础上加10分
mysql> select id, name. chinese +10 from exam;
我们可以看到在原来的基本上语文加了10分
列与列之间也可以参与运算
select id, name , chinese+ math + english from exam;
这个查询的效果就是计算总分
关键字 as表达式的别名用法
1.为列或表达式取别名
select id, name, chinese +math +englishas as 总分 from exam;
我们想将这三列合并显示,并为合并后的结果取一个别名。
2 关键字 as表达式还可以省略
表达式后面跟空格再跟别名
即这个as 是可以省略掉的
个人习惯用最简单的书写方式
3.如果别名中包含空格就必须 要用单(双)引号包裹起来
我们的表里本来没有总分这一列,所以通过表达式查询出来的结果集是通过一个临时表返回给我们的,执行完之后临时表就删除了
在MSYQL中所有的查询结果都会通过临时表返回给用户
去重:DISTINCT
关键字
语法:select distinct 列名from 表名;
只查询数据成绩,发现有两个80.5分和两个89.5,此时有两条重复记录
使用了distinct关键字之后,发现重复的记录只保留了一条
在查询结果中,每一列都相同MYSQL才认为他们是重复数据
数据行与数据行之间,也就是两条记录完全一致
加上ld之后,第一条记录与第三条记录,ld列不重复,distinct也就不把他们当做相当的行
去重时,只有查询结果中所有的列都相同才会被认定为重复记录
去重后,重复记录只保留一条
3.排序: ORDER BY
用这个order by 子句,要查询结果中根据我们指定的规则去对结果排序
排序规则: 查看表结构用到了desc describe 描述
1.升序 ASC 排序中asc 升序
2.降序 DESC 排序中desc descend 降序
在MYSQL中一个关键字,表示了两种意思,这是一个非常不好的反面案例
我们可以吸取一下这个教训,以后在写代码的时候注意一下命名规范
StringBuilder sb = new StringBuilder();
大家以后写代码的时候,最好写一个有意义的变量名
stringBuilder
GOOGLE编码规范,阿里编码规范
1.按语文成绩从高到低排序(降序)
select * from exam order by chinese DESC:
指定了排序的列,返回的结果就是针对这个列进行排序后的结果集
2.对数学成绩进行升序排序
mysql> select * from exam order by math ASC; 升序
3.没有写排序规则的时候默认是升序排序
select * from exam order by math;
强烈建议明确指定排序规则
没有order by 子句时,返回结果集是按哪个字段进行排序的? 比如说,找工作面试的时候,两个公司的hr
没有指定order by 子句时,永远不要依赖默认排序返回结集顺序 A说: 我们公司不加班
默认MYSQL根据哪个字段进行排序,是不确认的 B说: 我们公司没有明确要求加班
如果依赖某个排序规则,那么就明确指定order by 子句中的排序字段
注意:
NULL 数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面
使用表达式及别名排序
之前计算出来的总分,对总分进行排序
select id, name, chinese + math + english '总 分'from exam order by chinese + math + english desc;
丽丽的语文是有成绩的,但是总分却是一个NULL
mysql中NULL 比较特殊
1.不论和什么值进行运算,返回的值都是NULL
2.NULL 始终被判定为FALSE
3.NULL 的值不是我们以前学习过的其他编程语言中的0,在MYSQL中他就是NULL
可以对多个字段进行排序,排序的优先级与书写顺序相关
可以为每个字段指定不同的排序规则 order by 列名 [asc|desc],列名 [asc|desc],列名 [asc|desc] ...
先按数学降序排列,再按语文升序排列,再按英文进行升序排列
我们可以看到在数学排序的基础上,对语文成绩进行升序排列,英文成绩是在前两个排序结果的基础上进行升序
总结:
我们今天学习了如何插入数据,查询和排序的关键字使用:
1.单行数据+全列插入: insert into 表名 [(字段1,字段2)] values (值,值 );
2.全列查询 : select * from 表名;
3.为表达式取别名 :select 字段名 as自创名 from 表名;
4.去重 : select distinct 列名from 表名:
5. 排序:select 列名 from 表名 order by 列名 【ASC(升序) | DESC(降序)】