sql

sql对大小写不敏感,但数据库的数据对大小写敏感
select sale+0.15 from price
select (sale+0.15)retail from price   对新列重命名
select sale+0.15 retail from price    对新列重命名
select -sale retail from price
select (lowtemp - hightemp) difference from price
select * from price where sale is null
select * from price where location like '%back%'
select * from price where location like '_back_'
select fristname || lastname from price where ...   将两个字符串连接起来


select name from softball union select name from football     nuion 将返回两个查询的结果并去除其中的重复部分  union all 不去除重复记录


select name from softball intersect select name from football      intersect返回两个表中共有的行


select name from softball minus select name from football       minus 存在于表一但不存在于表二的记录


SELECT * FROM PRICE WHERE WHOLESALE BETWEEN 0.25 AND 0.75    between 
 


SELECT COUNT(*) FROM TEAMSTATS WHERE HITS/AB <3.5       count 该函数将返回满足 WHERE 条件子句中记录的个数


SELECT COUNT(NAME) NUM_BELOW_350 FROM TEAMSTATS
WHERE HITS/AB <0.3        如果你在使用 count
时无 WHERE 子句 那么它将会返回表中的所有记录的个数




SUM 就如同它的本意一样 它返回某一列的所有数值的和
AVG 可以返回某一列的平均值
如果你想知道某一列中的最大值 请使用 MAX   MIN


SQL>SELECT NAME FROM TEAMSTATS WHERE HITS=MAX(HITS)
ERROR at line 3
ORA-00934 group function is not allowed here
很不幸 你不能 这一信息提示你汇总函数无法在 WHERE 子句中使用




MAX也可以处理字符 返回最高的字符串




SELECT ABS(A) ABSOLUTE_VALUE FROM NUMBERS




CEIL 返回与给定参数相等或比给定参数在的最小整数 FLOOR 则正好相反 它返回
与给定参数相等或比给定参数小的最大整数




SELECT CONCAT (FIRSTNAME,LASTNAME) "FIRST AND LAST NAMES"
FROM CHARACTERS  连接字符串




LOWER 将参数转换为全部小写字母而 UPPER 则把参数全部转换成大写字



REPLACE 该函数需要三个参数 第一个参数是需要搜索
的字符串 第二个参数是搜索的内容 第三个参数则是需要替换成的字符串 如果第三个
参数省略或者是 NULL 那么将只执行搜索操作而不会替换任何内容




SUBSTR
这个函数有三个参数 允许你将目标字符串的一部份输出 第一个参数为目标字符串
第二个字符串是将要输出的子串的起点 第三个参数是将要输出的子串的长度




LENGTH 将返回指定字符串的长度


STARTING WITH 子句附加于 WHERE 子句上 它的作用与 LIKE exp% 相似




假如你已经知道了你想要进行排序的列是表中的第一列的话 那么你可以用 ORDER
BY 1 来代替输入列的名字




SELECT PAYEE,SUM (AMOUNT) FROM CHECKS GROUP BY PAYEE






SELECT 子句有一个正常的列 之后是一个汇总函数 如果它的后边只有 FROM
CHECKS 子句的话 那么你将会看到
INPUT/OUTPUT
SELECT PAYEE SUM AMOUNT FROM CHECKS
Dynamic SQL Error
-SQL error code = -104
-invalid column reference
分析
该信息表明 SQL 无法把正常的列和汇总函数结合在一起 这时就需要 GROUP BY 子
句 它可以对 SELECT 的结果进行分组后在应用汇总函数 查询 SELECT * FROM CHECKS
返回了 14 行 而 SELECT PAYEE SUM AMOUNT FROM CHECKS GROUP BY
PAYEE 则把返回的 14 行分成了 7 组 然后对每组应用了汇总函数




HAVING 子句对你需要进行分组的数据进行限制


INPUT/OUTPUT
SELECT TEAM AVG SALARY FROM ORGCHART
WHERE AVG SALARY 38000 GROUP BY TEAM
Dynamic SQL Error
-SQL error code = -104
-Invalid aggregate reference
分析
SQL 21 日自学通(V1.0) 翻译人 笨猪
EMAIL wyhsillypig@163.com 112
错误产生的原因是由于汇总函数不能工作在 WHERE 子句中 如果想要让这个查询工
作的话 我们需要一些新东西――HAVING 子句 输入下边的查询就会得到你想要的结果

INPUT/OUTPUT
SELECT TEAM AVG SALARY FROM ORGCHART GROUP BY TEAM
HAVING AVG SALARY 38000






SELECT 语句中出现的字段只能是在 GROUP BY 中出现过的才可以 — — 除非你
在 SELECT 子句中不指定任何字段




select * from table1,table2   将 TABEL1 中的每一行与 TABEL2 中的每
一行都接合了起来 (交叉联合,笛卡尔叉积)


SELECT O.ORDEREDON O.NAME O.PARTNUM P.PARTNUM P.DESCRIPTION
FROM ORDERS O PART P WHERE O.PARTNUM = P.PARTNUM等值联合 因为它只显示第一个表中的数据以及第二个表中的 存在于第一个表中的数值




SELECT O.NAME O.PARTNUM P.PARTNUM O.QUANTITY * P.PRICE TOTAL
FROM ORDERS O PART P WHERE O.PARTNUM > P.PARTNUM    不等值联合




外连接保留了未匹配的行,也就是说在外连接一端的表上的行,即使在另一端上的表没有与之匹配的连接值也会出现在外连接的结果中。 
而左外连接保留了在操作符左边的未匹配的行,又外连接则保留了在操作符右边的未匹配的行。 
内连接是指两端的表都有匹配的行才会出现在结果表中。




select * from table,table   表的自我联合


子查询   select * from table1 where table1.somecolumn = (select someothercolumn form table2 where ...)  当使用< > = 时 ,必须确保子查询结果是唯一的




SELECT C.NAME C.ADDRESS C.STATE C.ZIP FROM CUSTOMER C
WHERE C.NAME IN
(SELECT O.NAME FROM ORDERS O PART P
WHERE O.PARTNUM = P.PARTNUM
AND
O.QUANTITY * P.PRICE> (SELECT AVG(O.QUANTITY * P.PRICE)
FROM ORDERS O PART P
WHERE O.PARTNUM = P.PARTNUM))




select * from orders where exites (select * form orders where name='11111')






SELECT NAME ORDEREDON FROM ORDERS WHERE NAME = ANY
(SELECT NAME FROM ORDERS WHERE NAME ='TRUE WHEEL')         ANY 与子查询中的每一行与主查询进行比较 并对子查询中的每一行返回一个 TRUE    将 ANY 用 SOME 替换将会得到同样的结果  都与in 用法相同






SELECT NAME ORDEREDON FROM ORDERS WHERE NAME > ANY
(SELECT NAME FROM ORDERS WHERE NAME ='JACKS BIKE')




INSERT INTO table_name (col1, col2...) VALUES (value1, value2...)
INSERT INTO COLLECTION VALUES
2 ('STRING',1000.00,'SOME DAY IT WILL BE VALUABLE')




对表进行备份insert into table1 select * from table2




insert into talbe_name(col1,col2..)
select col1,col2... from talbe name where .....


update table1 set worth = 900 where item = 'string'


update talbel set worth = 900,item = ball where item = 'string'




delete from collection where worth < 275




drop table temp


create table newTable(field1,field2)
as (select field1,field2 from ordTable where...)




ALTER TABLE 语句可以帮助你做两件事
l  加入一列到已经存在的表中  alert table bills add comments char(40)
l  修改已经存在的表中的某一列 alert table bills modify name char(40)
你可以增加或减少某一列的长度 但是你不能将它减少到使修改后的长度小于其中的
已有数据长度


ALTER TABLE table_name MODIFY (column_name data_type NULL)
如果想把一列由 NULL 改变为 NOT NULL 你必需经过以下步骤
1   确认要改变的列中有没有 NULL 值
2   删掉你所发现的任何 NULL 值 删除该记录 更新这一记录等等
3   使用 ALTER TABLE 命令






可以对封装的复合查询应用视图或虚表


视图并不占用数据库或表的物理空间


create view debts as select * from bills




视图是为用户对数据多种显示需求而创建的,其主要用在一下几种情况:
(1)限制用户只能访问特定表特定条件的内容,提高系统的安全性。
(2)隐藏表结构、创建多种形式的数透视,满足不同用户需求。
(3)将复杂的SELECT语句和表JION形成一个视图,给用户提供一个良好的接口。
(4)为使用频率较高的联表聚合运算创建索引视图,以提升程序的性能。
(5)创建分区视图调用远程数据,实现数据的分布式存储与查询,提升程序的吞吐能力。




在数据库中使用索引可以让 SQL 使用直接访问方式 SQL 采用树形结构来存储和返回
索引数据 用以指示的数据存储在树的最末端 也就是叶子 它们被称为结点 也可以叫
叶子 每一个结点中有一个指向其它结点的指针 结点左边的值只是它的双亲结点 结点
右边的值则是孩子结点或叶子
SQL 将从根结点开始直到找到所需要的数据


CREATE INDEX index_name ON table_name(column_name1)




drop index index_name


使用索引不会对表中的物理存储造成影响


当你使用 ORDER BY 子句
时每次运行它都需要重新进行排序 而当你使用索引的时候 数据库会建立一个物理索引
对象 就是前边提到的树结构 而在你每次运行查询时都访问同一个索引








这里给出了几个在使用索引时需要记住的技巧
l  对于小表来说 使用索引对于性能不会有任何提高
l  当你的索引列中有极多的不同的数据和空值时索引会使性能有极大的提高
l  当查询要返回的数据很少时索引可以优化你的查询 比较好的情况是少于全部数据的
25% 如果你要返回的数据很多时索引会加大系统开销
l  索引可以提高数据的返回速度 但是它使得数据的更新操作变慢 在对记录和索引进
行更新时请不要忘记这一点 如果要进行大量的更新操作 在你执行更新操作时请不
要忘记先删除索引 当执行完更新操作后 只需要简单的恢复索引即可 对于一次特
定的操作 系统可以保存删除的索引 18 个小时 在这个时间内数据更新完后你可以恢
复它
l  索引会占用你的数据库的空间 如果你的数据库管理系统允许你管理数据库的磁盘空
间 那么在设计数据库的可用空间时要考虑索引所占用的空间
l  对字段的索引已经对两个表进行了归并操作 这一技术可以极大地提高归并的速度
l  大多数数据库系统不允许你对视图创建索引 如果你的数据库系统允许这样做 那么
可以使用这种方法来在 SELECT 语句中对视图的数据进行排序 很不巧 一些数据库
系统中也不允许在视图中使用 ORDERY BY 子句
l  不要创建对经常需要更新或修改的字段创建索引 更新索引的开销会降低你所期望获
得的性能
l  不要将索引与表存储在同一个驱动器上 分开存储会去掉访问的冲突从而使结果返回
得更快






SQL 也允许你对多个字段进行索引 这种索引被称为复合索引 下边的代码是一个简
单的复合索引的例子 注意虽然是对两个字段进行索引 但索引在物理结构上只有一个


SQL> CREATE INDEX ID_CMPD_INDEX ON BILLS( ACCOUNT_ID, AMOUNT );


选择唯一值最多的列建立索引可以达到你所希望的性能 例如 在 BILLS 表中 NAME
字段中的每一个值都是唯一的 当使用复合索引时 要把最可能选择的字段放在前边 也
就是说 把你最经常在查询中使用是字段放在最前边 在 CREATE INDEX 中列的出现次
序不必与表中的次序一致 如果你经常使用下边的语句
SQL> SELECT * FROM BILLS WHERE NAME = "Cable TV Company";
为了想达到所期望的性能 你必须在索引中将 NAME 字段放在第一位 这里有两个例

SQL> CREATE INDEX NAME_INDEX ON BILLS NAME, AMOUNT

SQL> CREATE INDEX NAME_INDEX ON BILLS NAME
在这两个例子中 NAME 都在索引字段的最左边 所以这两个索引可以提高对 NAME
的查询的性能




hecking 值在这里出现了三次 所以它的选择性要低于
ACCOUUNT_ID 请注意 每一个 ACCOUNT_ID 的值都是唯一的 要想提高你的索引的
选择性 你可以将 TYPE 字段与 ACCOUNT_ID 字段组合在一起建立一个索引 这将将创
建一个唯一的索引值




create unique index unique_id_name
on bills(account_id,name)






群簇   临时表    游标    存贮过程    触发机制




update empployee 
set lastName = 'smith'
where exists (select employee from pay where implyee = '2')




动态sql






当数据库服务为执行某一个 SQL 语句需要对表中的每一个记录进行检查时就会发生全
表扫描 它通常在执行 SELECT 语句时发生 但有时也会在更新和删除记录时发生
通常通过对经常在 WHERE 子句中使用的字段建立索引来避免全表扫描




如果所使用的查询有规律可循 那么你可以试着使用过程 






如果可能的话应该在查询尽量避免使用逻辑操作符 OR OR 会不可避免的根据表的大
小降低查询的速度






每一种数据库都有它自己的数据字典 或系统目录 在今天的介绍中这两个词我们都
会使用 数据字典是在数据库环境中的一个系统区域 它包含着关于数据库成份的信息
数据字典中包括的信息如数据库设计 存储的 SQL 代码 用户统计 数据库过程 数据库
的增长情况和对数据库性能的统计


当一
个用户尝试去登录数据库的时候 数据字典将会将该用户的名字 密码 和权限做为联接
数据库的参考 数据库也会通过它来确定是否用户具有访问特定数据的权限 






PL/SQL  是一种可以让
关系数据库用户以一种直接的方式来访问数据库的方法   是 ORACLE 的过程型语言 它由标准的 SQL 语句和一系列可以让你在不同的
情况下对 SQL 语句的执行进行控制的命令组成



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值