目录
首先还是要明确一下我们操作的是哪部分数据
电脑上有一个数据库服务器 ---> 管理着很多个数据库(数据的集) --->很多张数据表(保存着我们真实的数据) --->很多数据行(记录) --->很多列(字段)
操作的是表中的记录
CRUD---增删改查
C-Create 新增
R-Retrieve 检索,查询
U-Update 更新
D-Delete 删除
一.新增(Create)---insert
1.单行数据 +全列插入
insert into 表名[(字段1,字段2)] values (值,值);
前面指定的列要和后面values中的值要一一对应,如果列与值的个数据不匹配就会报一个错误,并且这条记录无法写入数据表
insert into 表名 values (值,值);
简写方式,不用在表名后指定列名,在values列表中按表中定义字段的顺序设置相应的值
2.单行数据 +指定列插入
insert into student(指定列) values(值);
没有指定id这一列时,只写一个name的值,Id这一列就会用默认的值去填充,这个默认值就是NULL
3.多行插入
insert into 表名[(指定列..)] values (值[,值..])[,(值[,值..])][,(值[,值..])]...
一条insert语句在values部分,可以跟很多个values组,每一组表示要插入的一个数据行
一次插入一条数据和一次插入多条数据哪个效率高?
1.执行所有的SQL时都有网络开销--->是一个不可控的因素
2.写入数据时还会有磁盘IO的开销
3.每执行一条SQL语句都会开启一个事务,事务的开启和关闭都需要消耗系统资源
一次提交多条数据(在一个可控范围之内),比一次提交一条数据效率高那么一点
二.由于编码集设置错误导致的数据写入异常
如果在以后写入一条中文数据时,出现类似的提示,首先要考虑一下数据库的编码集是否设置正确
如果确定了是编码集的问题,那么就要把原来的库删了,重新创建新库并指定正确的编码集
三.查询(Retrieve)---select
1.全列查询
语法:select * from 表名
- select关键字,查询的意思
- *号表示的是要查询表中所有的列
- from关键字
- 表名,要查询哪个表
查询某个表中所有内容是非常危险的操作
因为在生产环境中,一个表中的数据量可能会很多很多,有可能达到TB级
1.当一个查询开始的时候,会有磁盘开销,网络开销,都是非常紧缺的资源
2.如果这一条语句开始执行,那么就有可能把服务器资源吃光,其他的程序或是数据库操作就要等待当前SQL执行完之后才能继续执行
不加任何限制的查询在生产环境不要使用
四.真实案例
\. C:\Users\50664\Desktop\crod.sql
show tables;
select * from exam;
全列查询
指定列查询
select 列名[,列名]... from 表名;
示例:只查询ld,name,语文成绩
查询结果是一个表达式
select id,name,chinese,10 from exam;
数值类型,效果就是让所有的列中都包含一个表达式中的值他本身并不在我们的真实的表里
列值加某一个值
列值相加
别名
给结果集中的字段起别名
语法:select 列名 [as] 别名[, 列名 [as] 别名].. from 表名;
表达式后面跟空格 再跟别名,as 是可以省略掉的
如果别名中包含空格就必须要用单引号包裹起来
我们的表里本来没有总分这一列,所以通过表达式查询出来的结果集是通过一个临时表返回给我们的,执行完之后临时表就删除了
在MSYQL中所有的查询结果都会通过临时表返回给用户
去重 distinct
使用了distinct关键字之后,发现重复的记录只保留了一条
在查询结果中,每一列都相同MYSQL才认为他们是重复数据
数据行与数据行之间,也就是两条记录完全一致
插入一条新记录
去重时,只有查询结果中所有的列都相同才会被认定为重复记录
去重后,重复记录只保留一条
五.排序---ORDER BY
用这个order by 子句,要查询结果中根据我们指定的规则去对结果排序
排序规则:
1.升序 ASC
2.降序 DESC
查看表结构用到了desc describe 描述
排序中desc descend 下降
在MYSQL中一个关键字,表示了两种意思,这是一个非常不好的反面案例我们可以吸取一下这个教训,以后在写代码的时候注意一下命名规范
语法: select 列名 from 表名 order by 列名 [ASC][DESC];
默认是升序,也就是ASC
1.按语文成绩从高到低排序(降序)
2.按数学成绩从低到高排序(升序)
没有order by 子句时,返回结果集是按哪个字段进行排序的?
没有指定order by 子句时,永远不要依赖默认排序返回结集顺序
默认MYSQL根据哪个字段进行排序,是不确认的
如果依赖某个排序规则 ,那么就明确指定order by 子句中的排序字段
NULL 数据排序
视为比任何值都小,升序出现在最上面,降序出现在最下面
使用表达式及别名排序
之前计算出来的总分,对总分进行排序
排序时使用别名
玉兔的语文,数学 是有成绩的,但是总分却是一个NULL
mysql中NULL 比较特殊
1.不论和什么值进行运算,返回的值都是NULL
2.NULL 始终被判定为FALSE
3.NULL 的值不是我们以前学习过的其他编程语言中的0,在MYSQL中就是NULL
多个字段进行排序
order by 列名 [asc|desc],列名 [asc|desc],列名 [asc|desc]
排序的优先级与书写顺序相关,可以为每个字段指定不同的排序规则
先按数学降序排列,再按语文升序排列,再按英文进行升序排列