目录
增删改查关键字
SELECT
COUNT(*) 统计所有值
COUNT(*)
统计所有值,一般用于统计符合条件有多少条数据,相比于SELECT * FROM TABLE;
可以提高效率
SELECT * FROM TABLE;
SELECT COUNT(*) FROM student;
两相比较看到效率大大提高了,如果仅仅是想要判断符合条件的多少条数据完全可以使用COUNT关键字
DISTINCT 返回唯一值
写法:
SELECT DISTINCT student.student_sex FROM student;
结果:
查找前:
查找后:
DELETE
DELETE
delect 是删除表内的数据,可以根据条件删除要删除的数据;
写法:
DELETE FROM student WHERE student_age = 26;
结果:
删除前:
删除后:
显示数据已经删除了
TRUNCATE
TRUNCATE 会直接将表中的数据清除
写法:
TRUNCATE teacher;
先查找表内数据条数
运行后结果:
DROP
drop 语句会直接把表删除,
语句:
DROP TABLE teacher;
结果:
显示表不存在,说明表已经被删除完成了
DELETE、TRUNCATE 、DROP的区别
从执行速度上来说
DROP> TRUNCATE > DELETE
原理
DELETE:
1、DELETE
属于数据库DML操作语言
,只删除数据不删除表的结构,会走事务,执行时会触发trigger;
2、在 InnoDB
中,DELETE其实并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记为已删除, 因此 delete 删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见。虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以重用这部分空间(重用 → 覆盖)。
3、DELETE执行时,会先将所删除数据缓存到rollback segement
中,事务commit
之后生效;
4、delete from table_name
删除表的全部数据, 对于MyISAM
会立刻释放磁盘空间,InnoDB
不会释放磁盘空间;
5、对于delete from table_name where xxx
带条件的删除, 不管是InnoDB
还是MyISAM
都不会释放磁盘空间;
6、delete操作以后使用 optimize table table_name
会立刻释放磁盘空间。不管是InnoDB
还是MyISAM
。所以要想达到释放磁盘空间的目的,delete以后执行optimize table
操作。
7、delete 操作是一行一行执行删除的,并且同时将该行的的删除操作日志记录在redo和undo表空间中以便进行回滚(rollback)
和重做操作
,生成的大量日志也会占用磁盘空间。
TRUNCATE:
1、truncate
属于数据库DDL定义语言
,不走事务,原数据不放到 rollback segment
中,操作不触发 trigger
。(不能够回滚撤回!!!)
2、truncate table table_name
立刻释放磁盘空间 ,不管是 InnoDB和MyISAM 。truncate table其实有点类似于drop table 然后creat,只不过这个create table 的过程做了优化,比如表结构文件之前已经有了等等。所以速度上应该是接近drop table
的速度;
3、truncate
能够快速清空一个表。并且重置auto_increment
的值。
DROP:
1、drop
属于数据库DDL定义语言
,同truncate
;(不能够回滚撤回!!!)
2、drop table table_name
立刻释放磁盘空间 ,不管是 InnoDB
和 MyISAM
; drop
语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index); 依赖于该表的存储过程/函数将保留,但是变为 invalid
状态。
UPDATE
condition 条件
WHERE
CASE
函数方法关键字
TO_CHAR
TO_CHAR 是一种转换函数,意在将不指定格式的的内容转换成简单的字符串形式,存在多种用法:
简单用法:
- 不指定格式的 TO_CHAR函数将数值转换成简单字符串形式。
TO_CHAR(123) 结果 123
TO_CHAR(-123) 结果 -123
- 用元素9的格式
TO_CHAR(1234,'9999') 结果 1234
TO_CHAR(567,'9999') 结果 567
TO_CHAR(-567,'9999') 结果 -567
TO_CHAR(1234567,'9999') 结果 ####
TO_CHAR(45.789,'9999') 结果 46
TO_CHAR(567,'9999.99') 结果 567.00
TO_CHAR(-567,'9999.99') 结果 -567.00
TO_CHAR(1234567,'9999.99') 结果 #######
TO_CHAR(45.789,'9999.99') 结果 45.79
TO_CHAR(567,'9,999,999') 结果 567
TO_CHAR(-567,'9,999,999') 结果 -567
TO_CHAR(1234567,'9,9999,999') 结果 1,234,567
TO_CHAR(0.44,'9,999,999') 结果 0
- 用元素$的格式
TO_CHAR(1234,'$9999') 结果 $1234
TO_CHAR(-567,'$9999') 结果 -$567
- 用元素B的格式 如果被转换数值整数部分是0就显示为空格
TO_CHAR(567,'B999.9') 结果 567.0
TO_CHAR(-567,'B999.9') 结果 -567.0
TO_CHAR(0.44,'B999.9') 结果 .4
- 用元素MI的格式 负数则转换成末尾带减号的数
TO_CHAR(567,'999MI') 结果 567
TO_CHAR(-567,'999MI') 结果 567-
- 用元素S的格式 转换成带有正负号的数字字符
TO_CHAR(567,'S999') 结果 +567
TO_CHAR(-567,'S999') 结果 -567
TO_CHAR(567,'999S') 结果 567+
TO_CHAR(-567,'999S') 结果 567-
- 用元素PR的格式 用尖括号包围负数
TO_CHAR(567,'9999PR') 结果 567
TO_CHAR(-567,'9999PR') 结果 <567>
- 用元素D的格式 在指定位置插入小数点
TO_CHAR(567,'9999D99') 结果 567.00
TO_CHAR(-567,'9999D99') 结果 -567.00
TO_CHAR(567.866,'9999D99') 结果 567.87
- EEEE 科学计数法
TO_CHAR(567,'9.9EEEE') 结果 5.7E+02
TO_CHAR(45,'9.9EEEE') 结果 4.5E+01
TO_CHAR(0.0666,'9.9EEEE') 结果 6.7E-02
加深学习:
-
TO_CHAR(date[,format[,nlsparams]]):将日期date转化为VARCHAR2字符串, format缺省日期格式为Oracle的缺省日期格式(NLS_DATE_FORMAT)。
-
TO_CHAR(number[,format[,nlsparams]]):将数值number转化为VARCHAR2字符串, format缺省,结果字符串包含有和number中有效位数相同位数的字符。
① 0与9:每一个0或9都表示一个有效位,转换值得有效位与0或9的各位相同。负数有前导负号,前导为0时,使用0,保持不变,使用9则视为空格。如果精度减小,自动四舍五入。
TO_CHAR(0.37,'00.000') ---值:" 00.370",一个空格
TO_CHAR(0.37,'90.000') ---值:" 0.370",两个空格
② 千分位与小数位:
逗号",“:在指定位置返回一个逗号(可以不在千分位位置)。不能与G,D等格式元素同时使用
G:返回千分位分隔符,不一定是”,“,要看Oracle数据库的默认设置或nlsparams的值。
句点”.“:在指定位置返回一个句点(可以不在小数位位置)。不能与G,D等格式元素同时使用
D:返回小数位分隔符,不一定是”.",要看Oracle数据库的默认设置或nlsparams的值
PARTITION BY
partition by是分区函数像(sum()等是聚合函数:聚合函数对一组值执行计算并返回单一的值。)
DECODE
decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)
这个是decode的表达式,具体的含义解释为:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
简单用法
一、判断前面的条件,如果值为1则是男生,值为2则是女生
SELECT
t.id,
t.NAME,
t.age,
decode( t.sex, '1', '男生', '2', '女生', '其他' ) AS sex
FROM
STUDENT2 t
二、decode比较大小
sign(value)函数会根据value的值为0,正数,负数,分别返回0,1,-1
年龄在20以上的显示20以上,20以下的显示20以下,20的显示正好20
select t.id,
t.name,
t.age,
decode(sign(t.age - 20),
1,
'20以上',
-1,
'20以下',
0,
'正好20',
'未知') as sex
from STUDENT2 t