??xml version="1.0" encoding="utf-8" standalone="yes"?>
提v索引,应该不会感到陌生,若说它就是目?/span>,大概都知道了,数据库的索引与书的目录很怼,都叫index.书的内容相当于数据库表中的数?/span>,?/span>的目录通过늠指向书的内容,同样,索引也记录了表中的关键?/span>,提供了指向表中行的指?/span>.书的目录使读者很快的扑ֈ想看的内?/span>,而不必翻看书的每一?/span>,索引使得数据库应用程序能够不扫描全表而找到想要的数据.
索引是不是多多益?/span>?
索引可以创徏在一列或多列的组合上,也可以在数据库表的多个列上徏立不同的索引,但这些列应该是经怽为查询条件的?/span>.需要指出的?/span>,q不是表上的索引多好,在数据库设计q程中,q是需要ؓ表选择一些合适的索引。宁~勿烂,q是建立索引时的一个具体选择。在理论上,虽然一个表可以讄无限的烦引,?/span>表中的烦引越多,l护索引所需要的开销也就大。每当数据表中记录有增加、删除、更新变化的时候,数据库系l都需要对所有烦引进行更新?/span>
索引的分c?/p>
索引可以分ؓ三类:聚集索引(clustered index),非聚集烦?/span>,唯一性烦?/span>(unique index).Ҏ索引字段l成又有复合索引的说?/span>,复合索引可以是唯一索引也可以不是唯一索引.一个表上最多创Z个聚集烦引和249个非聚集索引.
创徏索引的条?/p>
Q?Qؓl常出现在关键字orderby、group by、distinct后面的字D,建立索引?/p>
Q?Q在union{集合操作的l果集字D上Q徏立烦引?/p>
Q?Qؓl常用作查询选择的字D,建立索引?/p>
Q?Q在l常用作表连接的属性上Q徏立烦引?/p>
Q?Q考虑使用索引覆盖。对数据很少被更新的表,如果用户l常只查询其中的几个字段Q可以考虑在这几个字段上徏立烦引,从而将表的扫描改变为烦引的扫描?/p>
创徏索引的限?/p>
Q?Q限制烦引数目?/p>
(2)唯一性太差的字段不适合单独创徏索引Q?/p>
(3)更新频繁的字D不适合创徏索引Q?/p>
(4)不会做ؓ查询条g的字D不创徏索引
存储q程是以一个名字存储在数据库中?/span>,l过预编译的T_SQL语句集合,可以独立执行或通过应用E序的调用来执行.
触发器是不由用户直接调用?/span>,而是在对表或视图中数据进?/span>update,insert或?/span>delete操作时自动执?/span>.一个表或视囑֏以有多个触发?/span>,每个触发器可以包含复杂的SQL语句.数据库表之间的引用完整性约?/span>,除了可以采用主键和外键的对应U束来实C?/span>,q可以用触发器,从而实现更复杂的用户定义完整性约?/span>.
q个函数一般接收字W作为参敎ͼq且可以q回字符或数?/span>
其中最常用有以下两个函?/span>
1.CONCAT函数
主要用于字符串的q接Q具体语法如?/span>
CONCATQc1,c2Q?/span>
接收两个参数Q将W二个参数连接到W一个参数的末尾Q假如第二个参数是NULLQ?/span>
则函数返回第一个参敎ͼ假如W一个参数是NULLQ则参数q回W二个参敎ͼ
假如都ؓNULLQ则函数q回NULL
为商品h格添加元单位CZ如下Q?br />
2.NVL函数
q个函数主要用于函数替换
NVL(e1,e2)
接收两个参数Q假如第一个参C为NULLӞ函数q回W一个参敎ͼ
假如W一个参CؓNULLӞ函数q回W二个参?/span>
具体的用示例如下:
查询商品表的相关信息Q对没有详细介绍的商品默认设|显C?#8220;暂无详细描述”
可用暂无详l描q来代替NULL
字符常用函数q有很多Q希望大家能在我的基上评?/span>
可以把SQL语言看成是客L与服务器端沟通的一个工P用来存取Q查询和更新Q关pL据库pȝ
Insert语句
INSERT语句的语法结构如下:
table值的是要插入数据的表的表名,Column指的是要插入数据的列名,Value指的是要插入的具体数据?/span>
例如往会员表中插入一个新的会员数据,可以q样dQ?/span>
前者的优点是可以指定哪些字D|加哪些数据,~点是表名后面的括号中的字D名需要和Value值相对照
后者的优点是书写简单,~点是要把所有的字段都在Value中进行赋?/span>
当需要插入数据包含有I值的时候,一般用第一U方法,而第二种Ҏq行插入需要用NULL关键字进行填?/span>
假如插入的数据包含时_而且旉是当前的旉Q?/span>
假如插入的是旉Qƈ且时间是某个具体的时_我们可以上q的语句q行修改如下Q?/span>
以上操作的都是单行的数据Q而下面的操作是多行的数据
插入多行数据CZ如下Q?br />
UPDATE语句
UPDATE语句l构如下Q?/span>
如初始化所有会员密码:
按条件更斎ͼ
做更新操作的时候,WHERE条g一般选择cM主键q样有唯一性约束的字段Q除非特D情况,
否则的话会引h想不到的误操作,比如更新用户表时以name作ؓ条g的话Q就十分危险Q?/span>
因ؓ名字是可以重复的
Select语句
我们Ҏ据库做得最多的操作是数据检?/span>
select语句显得极光?/span>
其中最单的查询实例如下Q?/span>
*指的是所有列
而查询所有VIP数据如下Q?/span>
查询两个条g同时成立的示例如下:
查询两个条g成立其中一个,CZ如下Q?/span>
查询条g为空的示例如下:
当要查询会员中所有姓李的会员Ӟ需要用到模p查询:
% 能匹?到多个字W?/span>
_ 能Q意匹配单个字W?/span>
查询商品表中h?00-400之间的商品数?
而查询会员表中张三、李四、王五的信息Ҏ如下Q?/span>
使用别名查询Q?/span>
其中查询中可能需要对查询的结果进行排序,其结构如下:
查询商品表,按上架时间进行排序:
如果惛_掉查询结果中的重复数据,可以使用Distinction关键字,如下
Delete语句
语法l构如下
其中的table ?condition在上面已l有提及
删除CZ如下
在实际操作中我们应该使用假删除,是再增加一个状态(一般ؓstatusQ的字段
在删除错误之后,我们可以?ROLLBACK来回滚事?/span>
在tmp目录下面有一个a.txt文gQ我们通过ls -l命o可以查看其详l信息:
-Q表C普通文Ӟd:表示目录文gQl:链接文g,b:讑֤文g中可以供存储的接口设?c:讑֤文g中串行端口设备如键盘?/p>
׃最前面?Q所以a.txt是普通文件?/p>
再看 rw-r--r--部分Q我们将其分Zl,分别对应文g所有者,文g所属组Q其他用L权限.
其中r代表d权限Qw:代表写权限,xQ代表执行权?q里没出?,-Q代表没有某U权限?/p>
那对上面的权限的解释是Q?/p>
owner:可以d写,不能执行
group:可以d不能写,不能执行
other:可以dQ不能写Q不能执?/p>
W一个root代表文g所有者,W二个root代表文g所属组
那么现在我如果想修改文g所有者,文g所属组Q文件权限该怎么做,Ll向下阅读:
chgrp:修改用户所属组QchownQ修Ҏ件所有者,chmod:修改文g权限
假设我的pȝ中又一个叫gavin的组(通过/etc/group查看)
如上图,通过chgrp命o该文g的group修改Zgavin
下面修改其所有者:
修改其权限:
chmod 777 a.txt q个777代表什?
在linux中用数字代表权限:
r:4 w:2 x:1
r-- =4+0+0=4;
rw- =4+2+0=6;
rwx =4+2+1=7
怿写到q里大家都应该明白了吧?/p>
权限对于文g和文件夹的意义是不一LQ?/p>
对于文gQ?/p>
r:代表可以d文g的内容,w:代表可以修改文g的内容,x:可以执行q个文g
对于文g夹:
r:可以获取文g夹中又哪些文Ӟw:可以d和删除文件夹中的内容Qx:可以q入文g夹,
如果某个角色对于一个文件夹的权限是rw-;
那么他仅仅可以用ls获取文g夹中的内容,但是不可以用cdq入该文件夹?/p>
文g的权限告一D落Q现在来看看linux中的那些常见目录中的内容Q?/p>
/bin pȝ有很多放|执行文件的目录Q但?bin比较ҎQ因?bin攄的是在单用户l护模式下还能够被操作的命oQ在/bin下面的命令可以被root和一般̎户用,如:cat,chmod,chown,data,mv,mkdir,cp ,bash{常用命令?/p>
/boot 主要攄开Z用到的文?/p>
/dev 在linuxpȝ中Q何设备与接口讑֤都是以文件的形式存在于这个目录当中,你只要访问某个文件就相当于访问该讑֤
/etc pȝ的主要配|文件几乎都在这个文件夹cR?/p>
/home q是pȝ默认的用户主文g?/p>
/lib pȝ的函数库非常多,?lib攄的是开Z使用到的函数?/p>
/mnt 如果你想临时挂在一些外部设备(光盘Q一般徏议放|到q个目录?/p>
/opt q是l第三方软g攄的目?/p>
/root pȝ理员的L件夹
/tmp q是让一般用h者正在执行的E序攄文g的地方,q个目录是Q何h都可以访问的Q所以你需要定期清理一下,当然重要数据时不能放到这里来的?/p>
关于文g权限的最后一点就是:文g默认权限umask
现在我们已经知道如何新徏或者改变一个目录的属性了Q不q你知道当你新徏一个新的文件或则目录是Q它的默认权限是什么吗Q那是于umaskq东西有关了Q那么umask是在搞什么呢Q基本上Qumask是制定目前用户在新建文件或目录的时候权限的默认|如果获得或设|umaskQ方法如下:
#umask 或则 umask -S
(四位敎ͼW一位我们先不管Q表C特D权限,我们从第二位开始看?
在默认权限上Q文件和目录是不一LQ对于一个目录,x权限是非帔R要的 Q而对于一个文Ӟx权限在默认是不应该有的,因ؓ文g大多是用来存储数据的Q所以在linux中,文g的默认权限是666,目录的默认权限是777
要注意的是umask的分数指的是“默认值需要剪掉的权限”,
所以新建文件时权限Qrw--r--r--
新徏目录Qr-xr-xr-x
---单行函数对单行操?/span>
---每行q回一个结?/span>
---有可能返回g原参数数据类型不一?转换函数)
---单行函数可以写在SELECT,WHERE,ORDER BY子句?/span>
---有些函数没有参数Q有些函数有一个或多个参数
---函数可以嵌套
分类Q?/span>字符函数Q数字函敎ͼ日期函数Q{换函敎ͼ通用函数
?字符函数
1.?/span>
定义Q?/span>主要指参数类型是字符型,不同函数q回值可能是字符或数字类?/span>
<1>.LOWERQ全写
LOWER('SQL Course')——>sql course
<2>.UPPERQ全大写
UPPER('SQL Course')——>SQL COURSE
<3>.INITCAPQ首字母大写
INITCAP('SQL Course')——>Sql course
<4>.CONCATQ字W串q接
CONCAT('Good','String')——>GoodString
<5>.SUBSTRQ字W串截取
SUBSTR('String',1,3)——>Str
<6>.LENGTHQ返回字W串长度
LENGTH('String')——>6
<7>.INSTRQ返回一个字W串在另一个字W串中的位置
INSTR('String','r')——>3
<8>.LPADQ左填充
LPAD(sal,10,'*')——>******5000
<9>.RPADQ右填充
RPAD(sal,10,'*')——>5000******
<10>.TRIMQ去掉左右两Ҏ定字W?/span>
TRIM('S' FROM 'SSMITH')——>MITH
<11>.REPLACE:替换字符?/span>
REPLACE('abc','b','d')——>adc
?数字函数
<1>.ROUND:四舍五入函数
ROUND(12.3)——>12
ROUND(12.5)——>13
<2>.TRUNC:截断函数
TRUNC(65.654,0)——>65
TRUNC(65.654,-1)——>60
<3>.MOD:取余函数
MOD(10,12)——>10
MOD(7,12)——>7
MOD(10,4)——>2
?日期函数
<1>.SYSDATE:q回pȝ日期
<2>.MONTHS_BETWEEN:q回两个日期间隔的月?/span>
select months_between('02-2?06','02-2?06') from dual;
<3>.ADD_MONTHS:在指定日期基上加上相应的月数
select add_months('02-2?06',8) from dual;
<4>.NEXT_DAY:q回某一日期的下一个指定日?/span>
select next_day('1-2?12','星期一') next_day from dual;
<5>.LAST_DAY:q回指定日期当月最后一天的日期
select last_day('1-2?12') last_day from dual;
<6>.ROUND(date[,'fmt'])Ҏ期进行指定格式的四舍五入操作Q按照YEAR、MONTH、DAY{进行四舍五?/span>
SELECT employee_id, hire_date, ROUND(hire_date, 'MONTH') FROM employees WHERE SUBSTR(hire_date,-2,2)='98';
<7>.TRUNC(date[,'fmt'])Ҏ期进行指定格式的截断操作。按?nbsp;YEAR、MONTH、DAY{进行截?/span>
SELECT employee_id, hire_date, TRUNC(hire_date, 'MONTH') FROM employees WHERE SUBSTR(hire_date,-2,2)='98';
<8>.EXTRACTQ返回从日期cd中取出指定年、月、日
SELECT last_name, hire_date, EXTRACT (MONTH FROM HIRE_DATE) MONTH FROM employees WHERE department_id = 90;
?转换函数
---通常在字W类型、日期类型、数字类型之间进行显性{换?/span>
<1>.TO_CHAR(date|number|'fmt'):把日期类?数字cd的表辑ּ或列转换为字W类?/span>
--‘fmt’:指的是需要显C的格式Q需要写在单引号中,q且是大写敏感Q可包含M有效的日期格?/span>
常用日期格式Q?/span>
---YYYYQ?位数字表C年? ---DY:星期的英文前三位字母
---YYQ两位数字年份,但是无世U{? ---DAY:星期的英文拼?/span>
---RRQ?位数字表C年份,有世U{? ---DQ数字表CZ星期的第几天Q星期天是一周的W一?/span>
---YEAR:q䆾的英文拼? ---DDQ数字表CZ个月中的W几?/span>
---MMQ两位数字表C月? ---DDDQ数字表CZq中的第几天
---MONTH:月䆾英文拼写 ---AM或PMQ上下午表示
---HH 或HH12或HH24Q数字表C小? ---MIQ数字表C分?
HH12代表12时计时,HH24代表24时计时 ---SSQ数字表C秒Q?/span>
Ҏ格式Q?/span>
THQ显C数字表C的英文序数词,如:DDTH昄天数的序数词
SPQ显C数字表C的拼写
SPTHQ显C数字表C的序数词的拼写
select to_char(sysdate,’ddspth’) from dual;
“字符?#8221;:如在格式中显C字W串Q需要两端加双引?br /> select to_char(sysdate,’dd “of” month ‘) from dual;
数字到字W型转换Q?/span>
q行数字cd到字W型转换Q格式中的宽度一定要过实际列宽度,否则会显CZؓ###
-- 9Q一位数?br />-- 0Q一位数字或?br />-- $Q显CZؓ元W?br />-- LQ显C按照区?br />-- .Q小数点
-- ,Q千位分割符
select to_char(9832, '$9,999.00') from dual;
<2>.TO_NUMBER(char[,’fmt’]): 把字W类型列或表辑ּ转换为数字类?/span>
select to_number('9832', 9999) from dual;
<3>.TO_DATE(char[,‘fmt’]): 把字W类型列或表辑ּ转换为日期类?/span>
select to_date('20120304', 'yy-mm-dd') from dual;
?通用函数
<1>NVL(表达?Q表辑ּ2)函数Q该函数功能是空D{换,把空D{换ؓ其他|解决I值问题。如果表辑ּ1为空Q则表达?是要{换成的倹{?/span>
注意Q数据格式可以是日期、字W、数字,?span style="color: #ff0000; ">数据cd必须匚w
select nvl(null,1) from dual;
select nvl(2,1) from dual;
<2>.NVL2(表达?, 表达?, 表达?)函数Q该函数是对W一个参数进行检查。如果第一个参C为空Q则输出W二个参敎ͼ如果W一个参CؓI,则输Z三个参数Q?span style="color: #cc0000; ">表达?可以ZQ何数据类?/span>?/span>
select nvl2(null,1,2) from dual;
select nvl2(3,1,2) from dual;
<3>.NULLIF(表达?Q表辑ּ2)函数Q该函数主要完成两个参数的比较。当两个参数不相{时Q返回值是W一个参数|当两个参数相{时Q返回值是I倹{?/span>
select nullif(1,1) from dual;
q回值是Q?img src="http://my.csdn.net/uploads/201208/01/1343792513_7008.png" alt="" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " />不是null;
select nullif(1,2) from dual;
<4>.COALESCE(表达?, 表达?, ... 表达式n)函数Q该函数是对NVL函数的扩展。COALESCE函数功能是返回第一个不为空的参敎ͼ参数个数不受限制?/span>
select coalesce(null,null,0,1) from dual;
<5>.CASE表达?/span>Q?/span>
SELECT last_name, commission_pct,
(CASE commission_pct
WHEN 0.1 THEN '?
WHEN 0.2 THEN '?
WHEN 0.3 THEN '?
ELSE '?
END) Commission
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY last_name;
<6>.DECODE函数Q?/span>
DECODE(字段|表达? 条g1,l果1[,条g2,l果2…Q][,~省值])
select last_name, commission_pct,decode( commission_pct,0.1,'?,0.2,'?,0.3 , '?,'?) commission
from employees where commission_pct is not null orderbylast_name;