欢迎使用CSDN-markdown编辑器

来源:互联网 发布:淘宝第一名怎么排 编辑:程序博客网 时间:2024/05/21 12:48

sql基础教程笔记-2

commit 确认对数据库中的数据进行的更改
rollback 取消对数据库中的数据进行的更改
grant 赋予用户操作权限
revoke 取消用户的操作权限

mysql:
ALTER TABLE Shohin ADD COLUMN shohin_mei_kana VARCHAR(100);

Oracle:
ALTER TABLE Shohin ADD (shohin_mei_kana VARCHAR2(100));
ALTER TABLE Shohin DROP 列名

SQL Server:
ALTER TABLE Shohin ADD shohin_mei_kana VARCHAR2(100);

修改表名:
ALTER TABLE 表名 RENAME TO 新表名;

查询基础:
AS设定别名
别名是汉语时需要用双引号括起来,注意,不是单引号

列名前加DISTINCT删除重复行
只能用户第一个列名之前,NULL也会被视为一类数据

Oracle不允许SELECT省略FROM子句

<>500 不等于500

有值:IS NOT NULL

括号强化

知道什么是三值逻辑
这就是尽量设置为NOT NULL的原因

聚合函数COUNT不计算NULL行
但是COUNT(*)时会计算总行数,包括NULL行

聚合函数,如果列名为参数,那么在计算之前已经把NULL排除在外了
COUNT(*)除外

使用聚合函数删除重复值:(下例即计算值的种类)
COUNT(DISTINCT 列名);

子句书写顺序:SELECT->FROM->WHERE->GROUP BY

GROUP BY 会将NULL看成一类数据

当WHERE和GROUP BY并用时,子句的执行顺序是FROM->WHERE->GROUP BY->SELECT

GROUP BY子句中不能使用SELECT定义的别名

WHERE子句里不能使用聚合函数

HAVING子句写在GROUP BY 子句之后

聚合函数可以在SELECT,HAVING,ORDER BY子句中使用

HAVING子句使用限制与SELECT类似,必须包含在GROUP BY子句当中,或者必须在聚合函数中使用。

WHERE子句=指定行所对应的条件
HAVING子句=指定组所对应的条件

WHERE子句和HAVING子句 的执行速度

通常情况下,为了得到相同的结果,将条件写在WHERE子句中,要比写在HAVING子句中的处理速度要快,返回结果时间更短。

聚合键所对应哪个的条件不应该书写在HAVING子句中,而应该写在WHERE子句中

对自己使用的DBMS功能研究下,比如排序时,NULL是在开头还是结尾汇总。

执行顺序:FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY

多行插入不适合Oracle

INSERT ALL INTO 表名 VALUES(
)
(
)
(
)
SELECT * FROM DUAL;
DUAL是Oracle特有(安装时的必选项)的一种临时表。因此“SELECT * FROM DUAL”部分也只是临时性的,并没有实际的意义。

TRUNCATE清空数据表但是不能指定条件。比DELETE FROM 速度上要慢

UPDATE多列更新可以用,隔开,也可以用括号括起来,以清单方式显示。但是以括号的方式不常用,有些DBMS里面不能使用,因此尽量使用第一种。

DBMS 原子性Atomicity, 一致性Consistency, 隔离性Lsolation, 持久性Durability 统称为ACID特性。

函数:
ABS

MOD(被除数,除数)
ROUND(对象数值,保留小数的位数)–四舍五入
||在字符串拼接
LENGTH() 字符串长度
不同的DBMS,执行结果不一定相同
LOWER 转小写
UPPER 转大写
REPLACE(对象字符串, 替换前的字符串,替换后的字符串)
SYBSTRING(对象字符串 , 截取的起始位置 , 截取的字符数) Oracle版
CURRENT_DATE 没有参数因此不需要括号。 返回当前日期 Oracle语法略不同

CAST转换函数 CAST( AS )

LINK 前方一致 aaa% ,中间一致 %aaa% ,后方一致 %aaa
也可以使用代替%,代表单个字符,可以多个_连用

BETWEEN 10 AND 100 包含临界值

IS NULL,IS NOT NULL

IN的用法
WHERE PRICE IN (10,100,105)

也可以使用NOT IN

但是IN和NOT IN 均无法取出值为NULL的数据

有意识地编写易于维护的代码,尽量少使用死数据来进行查询。

EXIST后期深入了解

CASE WHEN 判断表达式 THEN 表达式
WHEN 判断表达式 THEN 表达式
WHEN 判断表达式 THEN 表达式
WHEN 判断表达式 THEN 表达式
ELSE 表达式
END

select case使用方法

例:
SELECT CASE WHEN GPRS_MONTH_FEE > 0 THEN TRUE
ELSE FALSE END AS TRPE
FROM INF_PRODUCT_5XX_YYYYMM a ,xt_xj_test b WHERE a.PRODUCT_NO = b.PRODUCT_NO
ORDER BY B.ID;

UNION 并集,会去掉重复记录

列数必须一样,数据类型必须一样

INNERSECT交集

MINUS代替EXCEPT Oracle版

内联结要点:1.FROM中表尽量使用别名 2.ON必须写在FROM和WHERE之间 3.在SELECT中尽量使用表名.列名的方式书写

PARTITION BY有分组的功能但是不像GROUP BY拥有聚合功能

RANK:计算排序时,会跳过相同位次的记录–1, 1, 1, 4
DENSE_RANK:计算排序时,不会跳过相同位次的记录–1, 1, 1, 2
ROW_NUMBER:赋予唯一的连续位次–1, 2, 3, 4, 5

原则上,窗口函数只能在SELECT中使用

视图尽量使用单一视图,避免出现楼中楼现象,尤其是刚接触的时候,多重视图会降低SQL性能。
避免在视图上建立视图。

通常DBMS中是无法在视图中使用ORDER BY子句的,但有例外比如PostgreSQL.

对视图的更新插入删除操作有限制,根本上是因为无法判断如何将视图的更改反映到原表中。因为视图是从原表中得到的,中间经过了结构上的变化。
比如通过聚合的视图是无法更新的。即如果要更新视图,那么必须视图的结构与原表相同。

在Oracle的FROM子句中,不能使用AS(会发生错误)。因此,在Oracle中写sql时,FROM子句中去掉舍去AS即可。

尽量避免使用多层嵌套的子查询。

标量子查询就是必须而且只能返回1行1列的子查询。

牢记 WHERE子句中不能使用聚合函数,可以嵌套一个子查询来代替聚合函数。