这是不是你想要了解SQL的艺术,基础语法等等
一、基础sql语句:
模块定义 | 基础语句 | 基础功能 |
数据定义 | create table | 创建数据库表 |
drop table | 删除数据表 | |
alter table | 修改表结构 | |
create view | 创建视图 | |
drop view | 删除视图 | |
create index | 给表创建索引 | |
drop index | 从表中删除索引 | |
create procedure | 创建存储过程 | |
drop procedure | 删除存储过程 | |
create trigger | 创建触发器 | |
drop trigger | 删除触发器 | |
create schema | 向数据库添加一个新模式 | |
drop schema | 从数据库删除一个模式 | |
create domain | 创建数据值域 | |
alter domain | 改变域定义 | |
drop domain | 从库删除域 | |
数据查询 | select | 查询表中的数据 |
数据操作 | insert | 向表中添加数据行 |
delete | 删除表中数据行 | |
update | 更新表中的数据 | |
数据控制 | grant | 授予用户访问权限 |
deny | 拒绝用户访问 | |
revoke | 解除用户访问权限 | |
事务控制 | commit | 提交当前事务 |
rollback | 回滚当前事务 | |
set transaction | 定义当前事务数据访问特征 | |
程序化SQL | declare | 为查询设定游标 |
explan | 为查询描述数据访问计划 | |
open | 为查询结果打开游标 | |
fetch | 检索一行查询结果 | |
close | 关闭游标 | |
prepare | 为动态执行准备SQL | |
execute | 动态的执行SQL | |
describe | 描述准备好的查询 |
二、表的基础
永久表:存储在数据库中的SQL数据--常见表 创建语句:create table
全局临时表 :只会在上下文引用该表的定义时实际的表才会存在
创建语句:create global temporary table
局部临时表 :和全局临时表一样,但局部临时表只有在会话过程中才能被使用
创建语句:create local temporary table
三、SQL数据类型
字符串数据类型 char(size)\varchar(size)\varchar2(size)-oracle\Nchar(size)\Nvarchar(size)
注:size可以随意设置,但不能超过255个字符
数值数据类型:Bit\Int(Interger)\Number(Decimal)\Double\Float\SumallInt\TinyInt
日期数据类型:Date\dateTime
-- 获取当前日期函数 DB2: CURRENT_DATE \ MySQL:CURRENT_DATE() \ Oracle : SYSDATE \ Access : NOW()
文本数据类型:Text\NText
图形数据类型:Image
自定义数据类型:除了数据库系统提供数据类型外,我们还可以自定义数据类型;语句:create type 列如:create type UserN As Munerlc(10,2)
四、在库中对表认识
1、表的创建
创建表: create table table_name(column_name1 data_type,column_name2 data_type,....)
注:第一个字符必须是A~Z之一
非空约束:SQL允许表中列的值为null(空值) ,有的不允许为null,在后面紧跟关键字 not null
向表中添加数据: insert into table(column_name1,column_name2,...) values (column_value1,column_value2,...)
给某个字段指定缺省值:关键字Default <column_name><data_type> default <default_value>
2、表的修改
不同的数据库系统有着不同的限制,Oracle数据就限制对列的修改,只能加大列的宽度而不能缩小,而还不能删除列
新增新列:alter table table_name Add column_name data_type 跟着还可以新增非空约束和缺省值
给表中已有列新增非空约束:alter table table_name Add column_name data_type not null
给表中已有列新增缺省值:alter table table_name Add column_name data_type default 'default_value'
删除列:alter table table_name drop column column_name 想要删除多个列,可以用逗号隔开即可,如果要删除的列又有缺省值,那么先要删除缺省值 alter table table_name drop constraint constration_name ,constraint_name 为要删除的约束名,约束名可以根据直接删除列系统报错信息中获取
修改列:在不破坏数据情况下操作:alter table table_name modlfy column_name data_type 在SQL Server数据库系统不支持Modify关键字操作,我们可以通过 ALTER COLUMN 关键字来实现
当然也可以通过MODIFY和ALTER COLUMN关键字增加或取消某列的非空约束。
3、表的删除和重命名
表的删除:drop table table_name 这里的删除不仅经删除了表内存储的数据,而且整个表结构都被删除
表的重命名:通过关键字SP_RENAME 语句:SP_RENAME 'table_name','MY_table_name'
重命名表中的列:SP_RENAME 'table_name.column_name',MY_column_name','COLUMN'
4、创建数据库、删除数据库
创建数据库:create database database_name additional parameters 创建数据库时我们还需要设置数据库的一些基本参数
删除数据库:drop database database_name 如果数据正在被使用时,使用drop database 删除操作就会失败
五、索引和视图的认识
1、索引(index)
索引:提高数据检索数据的能力,索引是一个单独的,物理的数据库库结构,是数据库的一个表中所包含的值的列表,其就是注明了表的各个值所在的存储位置。按存储结构的不同又分为簇索引和非簇索引
索引的创建与销毁:创建通过关键字:create index;销毁通过关键字:drop index
创建语句: create index index_name on table_name(column_name1,column_name2,..)
注意点:create [unique|distinct|cluster] index index_name on table_name(column_name1[ASC|DESC],column_name1[ASC|DESC],...)
unique(distinct): 唯一性索引,不允许表中不同的行在索引列上取相同值
clustered/nonclustered:聚集/非聚集索引
ASC|DESC: 索引表中索引值的排序次序
索引销毁语句:drop index index_name
2、视图
视图是从一个或多个表中导出来的表,其结构和数据是建立在对表的查询基础上的,和表一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言,数据来源都是所引用的表,所 以视图不是真实存在的基础表,而是一张虚拟表,
我也可以对视图进行查询、修改(但是有一定的限制)和删除,就是我们对视图数据进行修改时,相对引用的基础表也要发生变化。
优点:简化操作、定制数据、合并分隔数据、安全性
缺点:性能》由于视图是虚拟的表,在使用包括视图所引用的SQL语句时,数据除了执行所键入的SQL语句中查询或更新之外,还要告诉DBMS执行定义视图查询,就影响查询效率
更新限制》不是所有的视图可以更新的。SQL可将更新的视图限制为基于对单个表的,并且没有group by 或者 having 子句的查询
视图的创建:创建主要通过create view关键字来实现
create view <view_name> [(column1,collumn2'..)] as select <column_names> from <table_name> 注意:column1(新定义字段)可写可不写
视图的销毁:drop view view_name
注意:视图中禁止查询语句中使用group by (SQL Server)
六、查询(select)
好玩的操作
--测试玩法 dual
select <funtion> from dual
--查询所有表的表名
select tname from tab
select语句基本结构
select [distinct|all] select_list --distinct:去掉重复值 all:默认的关键字(类比于*号) from table_name_source [where search_condition] [group by group _by_expression] --group by :分组查询 [having search_econdition] --having:对group by 子句产生的结果筛选行 [order by order_by_expression[ASC|DESC]] --order by :对查询的结果排序 ASC升序 (默认) DESC 降序
注意点(优化):对于使用‘*’通配符时我们要谨慎,在不需要查询所有列时,尽量采用单列或者多列查询,以免占用过多资源
七、运算符
AS关键字--取别名
单值比较运算符:
= > < >= <= 说明:等于 大于 小于 大于等于 小于等于
<> != !< !> 说明 : 不等于 不等于 不小于 不大于
BETWEEN运算符范围筛选:A1~A2
where column_name between A1 and A2
NULL值得判断:
where column_name IS [NOT] NULL --用于判断数值是否为Null
AND运算符:
and运算符表示“与”,全真为真 ,也就是表达式1和表达式2都为true,则为true
OR运算符:
or运算符表示“或”,有真为真,也就是说表达式1和表达式2有一个为true,则为true
IN运算符:
in运算符可以使用一系列值进行筛选条件,语句:in(value1,value2,...)
比较OR和IN运算符:两者的结果是完全相同的,为什么还要IN的运算符呢
IN运算的优势:1、但选择的条件多时,采用IN可以看出很简便,只需要在括号内使用逗号隔开即可,运行效率要比OR运算符要高,OR效率O(n),IN效率O(logn),当n越大的时候效率相差越明显
2、使用IN运算符,其后面所列的条件可以是SELECT语句,也就是子查询
NOT运算符:
用于对搜索条件的布尔值求反,表示否定的,但是NOT运算符不能单独应用,需要和其他运算符联合使用
NOT运算符与<>运算符:对于简单的查询条件来说,它两功能上几乎是没有什么区别的,NOT优势:可以和其他运算符组合使用,<>运算符是不可以实现的
注:MySql数据库系统不支持NOT运算符,而在MySql,NOT运算符在EXISTS运算符前面使用 --NOT EXISTS
LIKE运算符:
like运算符也就是我们经常说的模糊查询,但是要通过搭配通配符来实现的,SQL语言提供的通配符有'%','-'和'[]',以及'*',只用char\varchar\text数据类型使用到Like运算符和通配符
八、连接符\运算符\函数
1.连接符:
在数据库中,我们常用到的连接符"+"或者"||"
在Access\SQL Server和Sybase数据库系统中,采用的连接符为"+"
在DB2\Oracle\PostereSQL和Sybase数据库系统中,采用的连接符"||"
2.数据值运算符:
+ - * / % 加 减 乘 除 求余
3. CAST表达式转换数据类型:
CAST(value expression AS data type)
CAST可以任何数据类型转换成char或者varchar类型
4.CASE表达式
CASE表达式实际上是一个条件表达式,能够根据列的值选择实际值,提供了一种决策能力
语法:
CASE WHEN search_condition THEN result_expression1 WHEN search_condition THEN result_expression2 ...... ELSE else_result_expression END
解读:表达式在执行时,系统首先检测第一个条件search_condition,当其值为true时,则CASE表达式取第一个值result_expression1,以此类推即可,如case表达式没有else时其他都为false时,ease表示取值null
5.函数
在SQL对不同类型的数据处理提供了几种类型的函数,有字符串处理函数\算术运算函数\时间日期处理函数等
功能 : 截取字符串中的部分字符\日期形式转换\获取当前日期
截取字符串中的部分字符:
Access数据库中使用MID()函数
DB2\Oracle\PostgreSQL数据库中使用SUBSTR()
MySql\SQL Server\Sybase数据库中使用SUBSTRING()
期形式转换:
Access\Oracle数据库使用复合函数
DB2\PostgreSQL数据库使用CAST表达式
获取当前日期:
Access数据库--now()
DB2\PostgreSQL数据库--CURRENT_DATE
Mysql数据库--CURRENT_DATE()...
Oracle数据库--SYSDATE
SQLServer\Sybase数据库 GETDATE()
对于大多数函数,每个数据库系统都提供函数不同,所以自行前往各个数据库官网查询和学习
6.聚合函数
求和 SUM()\最大值MAX()\最小值MIN()\平均值AVG()\计数COUNT()
九、连接
1.多表基本连接
语法:
select table_name1.column_name1,table_name2.column_name2 from table_name1,table_name2 where table_name1.column_name1 = table_name2.column_name2
注:from 子句应列出所有连接的表名.where子句应定义连接的关联条件
2.采用JOIN关键字建立连接
语法:
select columns from join_table join_type jion_table on (join_condition)
join_taboe : 指出参与连接的表名
on (join_condition) : 指出连接条件,由被连接表中的列和比较运算符\逻辑运算符等构成
join_type : 连接类型
natural join : 自然连接 --指表与其自身进行连接--SQL Server不支持此连接
inner join : 内连接--返回的结果是两个表中所相匹配的数据,舍弃不匹配的数据
外连接 : 分为左外连接:left outer join或left join 和 右外连接:right outer join 或者 right join 也可以不使用join关键字,在where子句上 "*="(左外)和"=*"(右外)--Oracle
全外连接 : full outer join 或者 full join
交叉连接 : cross join
union运算符 与 union join 连接
union运算符用于执行集合并的运算,结合ALL使用,保留重复元素 UNION ALL
UNION 具有自动去除重复元素的功能,在使用union运算符时select语句中不能使用order by,但是我们可以把order by 放在最后select语句后面,对最后的结果进行排序
union join 连接:不会对表中的数据进行任何匹配处理,只是把来自一个源表中的行与另一个源表中的行并合起来,注:SQL Server中不支持UNION JOIN连接
十、插入(insert)
语句:
insert into table_name(column_name1,column_name2,...) values (column_value1,column_value2,...)
使用insert...select语句插入:
insert into table_name (column_name1,column_name2,...) select column_name1,column_name2,... from table_name2 where search_condition
注:(1).在insert into 语句中,列的数目必须等同于从select语句返回列的数目
(2).在insert into语句中,列的数据类型必须与从select语句返回的列数据类型一致
使用select...into是复制数据:但是在使用select...语句前,首先要创建一张新表(DB2数据库不支持)
语句:
select column1,column2,... into new_table_name from table_name where search_condition --SQL Server
而在Oracle和Mysql中,语句有着不同的形式
语句:
create table new_table_name AS select column1,column2,... from table_name where search_codition
从外部数据源导入、导出数据:每个数据库系统的操作大不相同,需要查询资料学习
十一、数据的更新和删除
更新(Update):
语法:
update table_name set column1=value1,column2=value2,... where seatch_condition
删除(Delete):
语法:
delete from table_name where search_condition TRUNCATE table table_name: --只删除数据不删除表结构
十二、安全性控制
对于安全性来说,SQL语言提供了数据控制语句DCL(Data Control Language)对数据库进行统一的管理,SQL的数据控制功能主要有安全性控制和完整性控制。安全是指保护数据库,防止不合法的使用造成数据泄漏、修改和破坏。
在SQL系统中,有两种安全机制(视图机制、安全机制也可以称为权限机制)
权限机制:是给用户授予不同类型的权限,在必要时可以收回授权,通过权限机制,SQL使用户能够进行的操作以及所操作的数据权限定在指定的范围内,禁止用户超越权限对数据库进行非法的操作,从而保证数据库的安全性
十三、完整性控制
完整性也是一种机制,用来检查数据是否满足规定的条件,以保证数据正确,避免一些不合语法的错误数据的输入和输出。SQL提供了大量的完整约束,保证数据库表中数据的完整
完整性约束--待后续
十四、SQL中的存储过程和函数
存储过程是由SQL语句和控制流语句构成的语句串。可以带有输入输出参数,被调用时可以返回成功和失败状态。存储过程允许组件式编程,被创建后可以在程序中多次调用而不必重新编写该存储过程的SQL语句,从而极大提高了程序的可移植性。存储过程能够实现较快的执行速度,如果某一操作包含大量SQL代码,或分别多次执行,那么使用存储过程能够提高执行速度。存储过程能够减少网络流量,降低网络负载
函数--聚合函数、时间函数、数值计算函数
1、BEGIN···END语句 --用来定义一串顺序执行的SQL语句构成的快
BEGIN END Statement block
2、IF···ELSE语句--用来定义有条件执行的某些语句,其中else语句是可选的
IF boolean_expression statement ELSE IF boolean_expression statement
3、WHILE、BREAK和CONTINUE语句
--WHILE 用来表示当某条件满足时,重复执行某语句或者语句块的情况
while boolean_expression statement
4、DECLARE语句 --用来定义一个局部变量 ,可用select语句为该变量赋初值,这个变量必须用@开头,后面跟着一个标识符(合法)
declare @variable_name1 datatype1, --variable_nameb:变量名 datatype:系统的数据类型,也可以是用户自定义的数据类型 @variable_name2 datatype2, ......
--用select语句给局部变量赋初值的语法
select @variable_name =
{expression | (select_statement)},
@variable_name = {expression | (select_statement)}
from clause
where clause
十五、Oracle备份和恢复
查询是否有权限:grant execute on dbms_flashback to username;
15.1 闪回技术
闪回技术共分为7种闪回技术:闪回查询、闪回数据归档、闪回事务查询、闪回事务、闪回表、闪回删除和闪回数据库
●闪回查询、闪回事务查询、闪回事务、闪回表:取决于undo数据保留时间(可以再细分为4种,参考后文)
--闪回查询 select * from table_name as of timestamp(to_timestamp('时间点'),'yyyy-mm-dd hh24:m:ss') where ...
--闪回版本查询 在某个时间段查询
select versions_xid,* from table_name
versions between timestamp(to_timestamp('时间点1'),'yyyy-mm-dd hh24:m:ss') and (to_timestamp('时间点2'),'yyyy-mm-dd hh24:m:ss') where ...
--闪回事务 需要相关权限、相关日志
--查询闪回的操作记录
desc flashback_transaction_query
--闪回事务
--使用包:bdms_flashbak.transaction_backout
--如果事务成功结束,就没有任何依赖关系了,单个事务被成功退出
dba_flashback_txn_state
dba_flashback_txn_report
--基于undo的闪回
●闪回数据归档:取决于历史表(存于普通表空间中)保留时间
--创建闪回归档的表空间 create tablespace fda_tbs1;
--创建保留地址
create tablespace fratfile '' size 1G autoextend on next 2m; --创建闪回归档 create flashback archive fda1 tablespace fda_tbs1 optimize data quota 10M retention 1 year; --指定表使用闪回归档 alter table database_name.table_name flashback archive fda1;
--删除数据归档
drop flashback fda1;
--开启某张表的闪回数据归档 这样会使用默认的闪回数据归档
alter table table_name flashback archive;
或者
alter table table_name flashback archive fda1;
--取消对于数据表闪回归档
alter table table_name no flashback archive;
--闪回数据归档的管理
待定。。。
●闪回删除:取决于回收站对象是否存在,当表空间存在空间压力时,Oracle自动清除回收站对象
--启动表的行移动功能
alter table datebase_name.table_name enable row movement;
--闪回表到某个时间点
flashback table table_name to timestamp to_timestamp('时间点','yyyy-mm-dd hh24:mi:ss');
--闪回drop表及数据-删除时是删除到回收站的
--查询回收站:只针对表,视图、存储过程都不会放到存储过程
show recyclebin;
--闪回已经drop的表结构
flashback table table_name to before drop (rename to table_name1闪回并重命名表名);
--清楚回收站里的表
purge table table_name;
--查询回收站开关状态
show parameter recyclebin;
--关闭回收站--如果关掉误删只能通过介质恢复找回--不关占一定空间
alter system set recyclebin=off scope=spfile;
●闪回数据库:取决于闪及归档日志保留时间
15.2 RMAN备份及恢复
15.3 数据泵
15.4 Rman迁移数据库