这是不是你想要了解SQL的艺术,基础语法等等

2022-12-25,,,,

一、基础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 关键字来实现

当然也可以通过MODIFYALTER 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迁移数据库

这是不是你想要了解SQL的艺术,基础语法等等的相关教程结束。

《这是不是你想要了解SQL的艺术,基础语法等等.doc》

下载本文的Word格式文档,以方便收藏与打印。