1、数据库和****sql**
SQL****的语句种类
DDL
Date define language.数据定义语言,用来创建或删除存储数据用的数据库以及数据库中的表等对象
CREAT
DROP
ALTER
DML
Data manipulation language.数据操纵语言,用来查询或变更表中的记录,
Select
Insert
Update
Delete
DCL
Data control language, 数据控制语言,用来确认或取消对数据的变更,除此之外,还可以确定对方是否有操作数据库中对象的权限,
Commit
Rollback
Grant
Revoke
基本书写规则
语句以****; 英文分号为结尾;
语句关键字(****select insert****等)不区分大小写;
常数(字符串、、数字)的书写方式是固定的;字符串和日期用单引号阔起来,数字无需特殊
单词要用半角空格或者换行分割开来
表的删除
Drop table
删除的表格无法恢复!
查询数据
排序
升序: ORDER BY score 例如按照成绩从低到高进行排序:
降序: ORDER BY score DESC 成绩从搞到低进行排序
ORDER BY语句要放到WHERE 语句后面
分页查询
使用****LIMIT
分页查询需要先确定每页的数量和当前页数,然后确定****LIMIT****和****OFFSET****的值。
M表示每页多少行(取M行数据),N表示从第几条记录开始取数据
聚合查询
SELECT COUNT(*) FROM students; 查询students表有几行
SQL还提供了“分组聚合”的功能:GROUP BY
按照class_id分组:SELECT COUNT(*) num FROM students GROUP BY class_id;
1班、2班、3班分别有几个人
修改语句
插入 insert into ……****()values():
在一个表中插入一条记录;也可以一次性添加多条记录
INSERT语句的基本语法是:
INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);
例如,我们向students表插入一条新记录,先列举出需要插入的字段名称,然后在VALUES子句中依次写出对应字段的值:
INSERT INTO students (class_id, name, gender, score) VALUES (2, '大牛', 'M', 80);
添加多条记录
Update 更新数据
UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;
set****后面是更改的内容;update的表名是指更新哪张表;where是从整张表中筛选的条件;****不接where的话,整张表的字段都会被更新成set的内容
当where筛选出来的内容是多个记录时,update可以同时更新多条内容;
Delete****删除数据
Delete from <****表名> WHERE
where****筛选出条件,delete 删除符合条件的记录;
如果不接where那么整张表的数据都会被删除!会得到空表;
Caution:
WHERE 语句筛选条件时 and 和or可以组合用,但是逻辑会默认先执行AND语句再执行OR语句。因此如果想要先执行OR语句就需要将要执行的OR语句用圆括号括起来!
圆括号较AND和OR有更高的计算次序!!
操作符 in
用来制定条件范围;in的用法类似于OR;条件用圆括号括起来,每个条件用逗号分割开来;
操作符not
not****操作符要放在where语句的条件的前面,用来否定跟在它之后的条件!
使用通配符进行过滤
LIKE 操作符
%****通配符(匹配0个或者多个字符)
%表示任意字符出现的任意次数;注意搜索中有的是可区分大小写的,这种情况下'fish%'搜索不出来 ‘Fish bean……’
_****下划线通配符(匹配单个字符,不能为0个,也不能更多)
_只能匹配单个字符
[]****方括号通配符****(****只能在字符集中匹配唯一的一个字符,表示OR的关系,有点类似IN的使用****)
https://www.cnblogs.com/cherrysu/p/8023371.html
亲测:文中的like '[JM]%' 对于MYSQL不管用,搜索不出来!!参照上述网页链接进行修改!
[]用来指定一个字符集,他必须匹配指定位置(通配符位置)的一个字符;
需要否定的关系时,用^否定;
如非必要,尽量不使用通配符!;
mysql****表达式
01 基本字符匹配
与like使用方式相近 REGEXP 后面跟的东西作为正则表达式
Select prod_name from product
Where prod_name regexp '1000'
Like 语句中,使用_下划线通配符作为单个字符通配符,正则表达式则使用'.' 英文半角字符句号作为单个字符匹配
Select prod_name from product
Where prod_name regexp '.000'
02 进行or匹配
'|'竖线表示or,1000或2000,可以匹配两个以上的OR条件
Select prod_name from product
Where prod_name regexp '1000|2000'
03 匹配几个字符之一
Select prod_name from product
Where prod_name regexp '[123] ton'
表示匹配 1ton 、2ton、或者3ton
与'|'相近,但不能写成1|2|3ton,sql会理解为1或2或3ton
但是[123]表示除123外的任何字符,[]中加上表示否定
04 匹配范围
[0123456789] = [0-9]
0123 = [0-3]
[a-z]匹配任意字母
05 匹配任意字符
由于. | - 在正则表达式中有特殊含义,因此如果需要查找字符'.|-'需要加上\ ;如果需要查找\则要写成\\
[\也用来引用元字符](file://也用来引用元字符)
元字符 | 说明 |
---|---|
[\f](file://f) | 换页 |
\n | 回车 |
06 匹配字符类
字符类 (character class)
07 匹配多个实例
09 定位符
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:^:]] | 词的开始 |
[[:>:]] | 词的结尾 |
7、创建字段
01 计算字段
02 拼接字段
拼接(Concatenate):将值连接到一起,构成单个值;
操作符 '+' ||
select vend_name || ' ( ' || vend_country || ' )' from Vendors order by vend_name;
经过实际操作,MYSQL显示了六行0值,并未向书上的一样两个字段拼接;
Mysql需要 用函数concat:
select concat (vend_name, ' ( ' ,vend_country,' )' ) as vend_namecontry from Vendors order by vend_name;
As vend_namecontry****;更名;
别名可以时一个单词也可以是一个字符串,但是字符串应当使用半角单引号引起来;
1****、格式化#
(1)拼接字段||(oracle和sqlite等使用) 或+(sql server和access使用):如:select name+'('+price+')' from product;输出形如: apple (3.2)
(2)mysql使用函数concat,如****select concat(name,'(',price,')' )from product;
(3)别名:as
来自 <https://www.cnblogs.com/Qi-Lin/p/11334021.html>
03 执行算数计算
select prod_id,
quantity,
item_price,
quantity*item_price as expanded_price #计算两个字段相乘并命名为expanded_price
from Orderitems where order_num =20008;
sql的运算操作符:+、-、*、/ 分别是加、减、乘、除
8****、使用函数**
01 函数
每个DBMS数据库管理系统都有自己的函数;由于SQL语句不同,SQL函数是不可移植的;
使用函数时,应当做好代码注释,以便他日可以确切知道函数的意义;
02 使用函数
(1)·文本处理**
版权归作者所有,任何形式转载请联系作者。
作者:ohYogi(来自豆瓣)
来源:https://www.douban.com/note/666299969/
返回数字的字符串函数
instr****(字符串,‘-’) 返回‘-’在字符串中的位置
position() 给字符串定位,返回结果为数值,当得到的定位为0时,表示不存在该值;(类似VBA中的instr)
select position('characters' in vchar_fld) from string_tbl;
locate() 接受第三个参数,指定搜索起始位置;类似position,函数内容不太一样,直接逗号隔开,不用IN
select locate('is', vchar_fld,2) from string_tbl;
#表示从第二个字符开始查找,但是返回的值是在整个字符串中的位置,不会减2
strcmp() 比较同一字段中两个字符串的位置大小; strcmp 对大小写不敏感
返回 -1,如果第一个字符串位于第二个字符串之,前;
返回 0,两个相同;
返回 1,第一个位于第二个之后;且此函数不区分大小写;类似功能可用 ‘like'、‘regexp’操作符完成;
select strcmp('12345','12345') 12345_12345 ,
strcmp('abcd','xyz') abcd_xyz,
strcmp('qrstuv','QRSTUV') qrstuv_QRSTUV ;
结果如下图,函数后面不需要接 from [table]:表明大小写位置等同
返回字符串的字符串函数
内建函数:
concat() 连接字符串的内建函数,可用连接操作符 || 或者连接字符 + 替代;
insert() 插入功能,参数为:(原始字符串、开始位置、替换的字符数、替换字符串);
从第二参数的位置开始插入或替换
第三参数为0,则表示插入;
第三参数大于0,比如5,则表示 相应的字符数被新字符代替;
select insert('goodbye world',9,3,'cruel '); 不需要接from[table];
select insert('goodbye world',9,0,'cruel ');
replace() 搜索替换所有实例,慎用;
select replace('goodbye world','goodbye','hello');
可能不止替换了 goodbye world中的goodbye;
substring() 从字符串中提取字符串,参数:‘字符串’,开始位置,提取字符数;
截取字符串中的子串,不需要接from[table];
select substring('nihao nikuailema',9,6);
cell() 向上取整;
floor() 向下取整;
round() 四舍五入取整,第二个可选参数表示保留小数点位数;
truncate() 简单地抹去不需要的小数位,不进行四舍五入;
Pow(2,8)第一个参数的第二个参数幂次方 2^8
Select pow(2,8); 输出256
Mysql 可以将半角单引号作为转义符,如:句子中存在 don''t,
SQL****中可以使用斜杠\作为 作为转义符,如:don\'t
select @@session.sql_mode; #修改为警告模式
set sql_mode = 'ansi';
/*quote可以将整个字符串包含起来,
并为字符串本身的单引号增加转义符*/
select quote(text_fld) from string_tbl;
/*char中存放字符串是使用空格向右补齐的,MYSQL在获取数据时,会删除char类型数据的尾端空格,因此无论存放的数据为何种类型,该字符串函数得到的结果都是相同的;下例子中char列的字符数设定为30,但运行结果为28 */
select length(char_fil),length(vchar_fld),length(text_fld) from string_tbl;
用于处理文本串(删除或填充值,转换值为大写或者小写)的文本函数
文本函数 | 说明 |
---|---|
left() | 返回串左侧字符 |
right() | 返回串右边字符 |
lower() | 将串转换为小写(access用Lcase()) |
upper() | 将串转换为小写(access用Ucase()) |
Ltrim() | 去掉串左边的空格 |
Rtrim() | 去掉串右边的空格 |
right() | 返回串右边的字符 |
soundex() | 返回串的soundex值 对串的发音进行比较,可以返回发音类似的值 |
select cust_name, cust_contact from Customers
where soundex(cust_contact) = soundex('MICHAel green');
寻找读音接近 Michael green的数据;
(2) 日期和时间处理函数
用于处理日期、时间值并从这些值中提取特定成分(如返回两日期只差,检查日期有效性等)的日期和时间函数;
每个数据从处理系统的日期处理函数各不相同,需要因地制宜;
函数 | 数据库 |
---|---|
datepart(yy, date) | SQL sever |
sybase' | access |
year(date) | MySQL |
Date_part(yyyy,date) | postgreSQL |
To_number( to_char(date,yy)) | Oracle |
MYSQL中常用的日期和时间处理函数
函数 | 说明 |
---|---|
AddDate() | 增加一个日期(天、周等) |
ADDtime() | 增加一个时间(时、分等) |
Curdate() | 返回当前日期 |
CURtime() | 返回当前时间 |
date() | 返回日期时间的日期部分 |
datediff() | 计算两个日期之差 |
Date_add() | 高度灵活的日期运算函数可以为指定日期增加任意一段时间间隔(年、月、天),并产生另外一个日期,时间间隔类型如下表: |
Date_format() | 返回一个格式化的日期或者时间串 |
day() | 返回一个日期的天数部分 |
dayofmonth() | 对于一个日期,返回对应的该月的第几天 |
dayofyear() | 对于一个日期,返回对应的该年好的好的,嗯,谢谢!的第几天 |
dayof() | 对于一个日期,返回对应的该周的第几天,默认星期日为一周的开头, |
Hour | 返回时间的小时部分 |
Minute | 返回时间的分钟部分 |
Now | 返回当前的日期和时间 |
Second | 返回一个时间的秒部分 |
Time | 返回一个日期时间的时间部分 |
Year | 返回一个日期的年份部分 |
Month | 返回一个日期的月份部分 |
Last_day(日期) | 返回一个日期所在月份的最后一天, |
select datediff(current_date(),last_day(current_date())); | 计算当前到月底剩余的天数, |
dayname() | 返回日期是星期几 |
select datediff(current_date(),last_day(current_date())); | 计算当前到月底剩余的天数, |
Str_to_date 函数(‘字符串’,‘日期格式’)他的第2个参数指明了带转换字符串的日期格式,
如 str_to date('September 17,2008' ,'%M %d, %Y)
日期格式部件,
格式部件 | 描述, |
---|---|
%M | 月名称(1月~12月), |
%m | 月序号(01~12), |
%d | 日序号(01~31), |
%j | 日在一年中的序号(001~366), |
%w | 星期名称,星期日~星期六, |
%Y | 4位数字表示的年份, |
%y | 两位数字表示的年份, |
%H | 小时00~23, |
%h | 小时01~12 |
%i | 分钟00~59, |
%s | 秒钟00~59, |
%f | 微秒,000000~999999. |
%p | A.m.或P.M. |
常用的时间间隔类型,
间隔名称 | 描述, |
---|---|
Second | 秒数 |
Minute | 分钟数, |
hour | 小时数, |
Day | 天数, |
Month | 月好,份 |
Year | 年份, |
Minute_second | 分钟数和秒数中间用":"隔开, |
hour_second | 小时数、分钟数和秒数,中间用":"隔开, |
Year_month | 年份和月份中间用“-”隔开, |
9、汇总数据
01 聚集函数
聚集函数即:运行在行组上,计算和返回单个值的函数;
汇总数据,而非返回数据本身;
sql的五个聚集函数
函数 | 说明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
min() | 返回某列的最小值 |
sum() | 返回某列之和 |
·AVG()函数
求列的和的平均值;
·count()函数
表中行的数目或者符合特定条件的行的数目。
count的两种使用方式:
01 使用count(*) 对表中行的数目进行计数,不管时否有null值,都计算在内!
02 使用count(column)对特定的列中具有值的行进行计数,null值不计!
· max和min分别表示最大和最小
·sum(column)函数
用来返回指定列值的和。
也可用来合计计算值;
02 聚集不同的值
对所有行执行,指定参数或者不给参数
只包含不同的值,指定 DIStinct参数(distinct 去掉重复值或者重复行);
03 组合聚集函数
可以组合来用
10、分组数据(group by,having)**
01 数据分组
针对特定的字段进行分组;
02 创建分组
Group by的使用规定
· group by,可以包含任意数目的列,使得可以对分组进行嵌套;
例句:
select product_cd, open_branch_id,
sum(avail_balance) tat_balance
from account
group by product_cd,open_branch_id with rollup;
With rollup****和****with cube
上例中:假设需要在为每种产品支行组合计算合计余额的同时,还需要为每种产品单独计算合计数,那么就要使用 with rollup. 如果处理计算产品合计还需要为每个支行进行计算合计的话可以使用 with Cube 选项,但是 Mysql 不支持 with cube 只有 sql serve R和 oracle 数据中可用。
03 过滤分组
where过滤行;having过滤分组;
where在数据分组前进行过滤;having在数据分组后进行过滤;
下图是各个语句的执行顺序:
·先根据where的条件过滤,
·再根据GROUPBY的条件进行分组;
·计算分好的组的 行数;
·过滤并选择行数>=2 的分组出来!
04 分组和排序
Order by 可以使用未被选择的列进行排序;
Group by 只能使用选择列或者表达式列,而且必须使用每个选择列表达式;
05 Select 子句顺序
Select
From
Where
Group by
Having
Order by
Limit(要检索的行数???)
11、使用子查询
01 子查询
嵌套在其他查询中的查询;
关联子查询
关联语句 WHERE y.continent=x.continent
的条件下先从select语句中选取 area,然后逐条判断,符合条件的列出,不符合条件的省略,
关联子查询与非关联子查询不同的是,他并不是在包含语句执行之前一次执行完毕,而是为每一个候选行执行一次,
非关联子查询
非关联查询可以单独执行,而不需要引用包含语句中的任何内容,
多行单列:
注意,如果在等式条件下使用子查询,而子查询又返回多行,结果那么将会出错,因为单一的事物不能等于多个事物的结合;情况可以用以下几种方式,
In 或者 not in in运算符被用于查看能否在一个表达式集合中找到某一个表达式,
如果对此查询返回的重复性感到困扰,那么可以对子查询的select语句中增加关键字distinct,并且不会改变包含查询的结果集。
select emp_id,lname,fname from employee where emp_id not in
(select distinct superior_emp_id from employee
where superior_emp_id is not null);
上述例子查询检索所有不管理别人的雇员,
all运算符,all运算图则用于将某单值与集合中每个值进行比较,构建这样的条件,需要将其中一个比较运算符与all运算符配合使用
select emp_id,lname,fname from employee where emp_id <> all
(select distinct superior_emp_id from employee
where superior_emp_id is not null);
-- 与上述例子的不同是将not in改成了<> all,
当用数值比较时,all运算符相较于in运算符更方便;
例如:查找可用余额小于Frank Tucker的所有账户的账户,
SELECT account_id,cust_id,product_cd,avail_balance from account
where avail_balance < all (select a.avail_balance from account a
inner join individual i on a.cust_id = i.cust_id
where i.fname='Frank' and i.lname ='Tucker') ;
any****运算符,与all不同的是,any 运算符只要有一个比较成立,那么条件为真,all运算符是只有与集合中所有成员比较都成立时条件才为真
any的这一特性可以用来查找可用余额大于Frank Tucker任意账户的所有账户
SELECT account_id,cust_id,product_cd,avail_balance from account
where avail_balance > any (select a.avail_balance from account a
inner join individual i on a.cust_id = i.cust_id
where i.fname='Frank' and i.lname ='Tucker') ;
多列子查询
select account_id, product_id ,cust_id
from account
where (open_branch_id, open_emp_id) in
(select b.branch_id,e.emp_id
from branch b
inner join employee e on b.branch_id = e.branch_id
where b.name = 'Woburn Branch'
and (e.title = 'Teller' or e.title = 'Head Teller'));
检索Woburn支行的Id及所有银行柜员的Id,同时包含查询使用这个信息,查找所有Woburn分行柜员开立的账户,
02 利用子查询进行过滤
可以根据select进行嵌套;
根据where in的嵌套;
03 作为计算字段使用子查询
select cust_name,cust_state, (select count(*) from orders where orders.cust_id =customers.cust_id) as orders from customers order by cust_name;
子句中的where与通常的where语句有所不同,它使用了完全限定列名(???),上面的语句告诉sql比较orders表中的cust_ID,与当前正从customer表中的检索的cUst_Id,
涉及外部查询的子查询:叫做“相关子查询”;
12、联结表
Sql是一种非过程化的语言,他只需要描述要获取的数据库对象,而如何以最好的方式执行查询,则由数据库服务器负责,因此,在from子句中各表出现的顺序并不重要,
创建连接:
连续两次使用同一张表(SQL学习指南);
如果需要在结果集合中包含这两个支行的名称,就需要在from子句中两次引用branch表,一次与employee表连接,另一次与account表联结,
为了使他正常工作,给每个branch表的实例定义不同的别名,以便服务器能够在各自之中正确的引用他们,
例如:下列例子中分别将branch表命名为b_a和b_e,以表明它和两个不同表的联结,并起名为不同的名字,
select a.account_id, e.emp_id,
b_a.name open_branch, b_e.name emp_branch
from account a inner join branch b_a
on a.open_branch_id = b_a.branch_id
inner join employee e on a.open_emp_id = e.emp_id
inner join branch b_e on e.assigned_branch_id = b_e.branch_id
where a.product_cd = 'CHK';
自联结;
不仅可以在同一查询中多次包含同一表,还可以对表自身进行连接,下面的例子中,是一个在查询中需要定义表别名的例子,否则服务器将无法确定连接条件中所指代的是雇员还是雇员的主管,
例如:e和e_s都是employee的别名
select e.fname, e.lname, e_s.fname as superior_fname,
e_s.lname as superior_lname
from employee e inner join employee e_s
on e.emp_id = e_s. superior_emp_id;
相等联结和不相等联结
大多数查询是相等连接,但有时也可以通过限定值的范围实现代表的连接,即不等连接;
上面例子查询连接的两个表并没有外键关联,他的意图是找出所有在no-fee cheking产品存续期间入职的银行雇员,
例如:
select e.emp_id,e.fname,e.lname,e.start_date
from employee e inner join product p
on e.start_date >= p.date_offered
and e.start_date <=p.date_retired
where p.name = 'no-fee cheking';
例子2:
select e1.fname ,e1.lname, 'VS' as vs , e2.fname,
e2.lname
from employee e1 inner join employee e2
on e1.emp_id < e2.emp_id
where e1.title = 'Teller' and e2.title ='Teller';
例子2中是一个不等自连接的例子,假如执行经理决定举办一次面向银行柜员的象棋锦标赛,那么需要创建所有对弈者的列表,这就需要为所有的柜员进行employee表的自连接并返回emp_id不同的行,因为柜员无法和自己下棋
14、组合查询
·Union 类似于OR ,表示并集
Union****和where语句会从查询结果中自动去除重复行;如果想要返回所有匹配行(不去除重复行),可以使用union all;
·排序:
Order by 语句只能出现在最后一条select语句之后;不允许使用多条order by 语句;
15、数据插入
01 数据插入
插入完整行
Insert into 表名(field 1,field 2……) Values( 值1,值2,……)
如果是完整行,可以不用写字段,只需要把相应的值录进去就可以了,如果某一列没有值用null代替;
值的顺序要和字段的顺序相一致,字段顺序可以不必和表中字段顺序相同;
尽量不使用没有明确给出列的列表的insert语句
插入行的一部分
插入部分行时,省略的列必须满足以下几个条件:
第一该列定义为允许空值,
或者在表定义中给出默认值,表示如果不给出空值将使用默认值;
如果不满足这两个条件,那么插入行不成功
插入某些查询结果
插入检索出的数据 insert select
将cust_new中的数据插入到customers里面
INSERT SELECT中的列名为简单起见,这个例子在INSERT和SELECT语句中使用了相同的列名。但是,不一定要求列名匹配。事实上,DBMS甚至不关心SELECT 返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管其列名)将 用来填充表列中旨定的第一个列,第二列将用来填充表列中指定的第二个列,此等等。
INSERT SELECT中 SELECT语句可包含whERE子句以过滤插入的数据。
插入多行 iNSERT通常只插入一行。为了插入多行,必须执行多个INSERT语句,INSERT SELECT是个例外,它可以用单条iNSERT插入多行,不管SELECT语句返回多少行,都将被INSERTE入。
02 从一个表复制到另一个表
讲一个表的内容复制到一个全新的表格;
可以使用select into 语句
Insert select
与 select into
他们之间的一个重要差别是前者导出数据,而后者导入表,
比如:
select * into custcopy from customers;
MYSQL用法与oracle稍微不一样:
create table custcopy as
select *
from customers;
select可以联结多个表插入数据;
不管从多少个表中检索数据,数据都只能插入到单个表中;
16、更新和删除数据**
01 更新数据
UPDATE(更新表中特定的行 更新表中所有行,)
使用where子句的时候,会更新where筛选出来的行,
不使用where的时候会更新所有的行!
因此使用update语句的时候,一定要注意跟上****where,
Update <表名> set 字段名 = '', 字段名 = '', where
可以更新一个字段或者多个字段;
02 删除数据 delete
同一个表中删除特定的行,
从一个表中删除所有行,
请同样记得,不要省略where子句,因为省略where子句后会删除所有行!
Delete 删除的是整行,删除表的内容,而非表本身;
Delete from <表名> where……
要删除所有行可以使用TRUECATE table语句,删除速度更快
03 更新和删除的指导原则
17、创建和操纵表
01 创建表
Create table,或者select into
Create table 表名
(字段1,数据类型,约束条件(not null),
字段2,数据类型,约束条件(not null));
例如:
create table orderitems01
(
order_num integer not null,
order_item integer not null,
prod_id char(10) not null,
quantity integer not null default 1,
item_price decimal(8,2) not null
);
约束条件为空,则表示'null',即:可以是空值;
主键不能为允许空值的字段~,当约束非空字段没有填入值时,会填入设置的default值,默认值;
02 更新表
Alter table用来增删列
- 增加列:
Alter table <表名>
Add vend_phone char(20;)
- 删除列:
Alter table <表名>
Drop Column vend_phone;
warning****:增加列或者删除列时,要注意备份数据,以免增删后无法更改!!
能不能重命名列??
03 删除表
Drop table <表名>
warning****:删除表执行语句无需确认即可删除,删除后不能撤销,即:无法UNDO !!
04 重命名表
DB2、MYSQL、Oracle、postgreSQL用户使用 Rename table;
SQLserver 和sybase使用 sp_rename存储过程
无一例外要提供更名前的表名和更名后的表名
例如:将表A\C\E更名为表B\D\F
Rename Table <表名A> TO <表名B>,
<表名C> TO <表名d>,
<表名e> TO <表名F>;
Rename 可以一次改多个表名;
18、使用视图
01 视图
02 使用视图
·视图的创建和删除,
视图用create view语句来创建;
使用show create view viewname;来查看创建视图的语句,
用drop删除视图,语法为,
Drop view viewname.
更新试图时可以先用drop,再用create;也可以直接用create or replace view。如果要更新的视图不存在,
则第2条更新语句会创建一个视图,如果要更新的视图存在,那么第2条语句会替换原有视图;
·利用视图简化复杂的联结:
create view productcustomers as #创建视图
select cust_name,cust_contact, prod_id
from customers, orders,orderitems
where customers.cust_id= orders.cust_id
and orderitems.order_num = orders.order_num;
使用视图
select cust_name, cust_contact
from productcustomers where prod_id = 'BR01';
视图极大简化了复杂的SQL语句,在上述使用视图查询中,它将制定的 WHERE 语句添加到已有的 where 字句之中,以便正确过滤数据,
001 用视图重新格式化检索出的数据,
要这个格式的结果,不必在每次需要时执行联结,创建一个视图,每次需要时使用它即可!
例如
create view vendlocation as
select concat(vend_name,'(',vend_country,')') as vend_title
from vendors order by vend_name;
select * from vendlocation;
002用视图过滤不想要的数据,
视图对于应用普通的where子句也很有用,例如可以定义customerEMAILlist视图,它过滤没有电子邮件地址的客户。
例如:
create view custemaillist as
select cust_id,cust_name,cust_email
From customers where cust_email is not null;
发送电子邮件到邮件列表时,需要排除没有电子邮件地址的用户,这里的where字句过滤了cast EMAIL列中具有null值的这些行,使他们不被检索出来,这样可以像使用其他表一样使用视图customer EMAIL list。
003 使用视图与计算字段,
视图对于简化计算字段的使用特别有用,
例如:
create view orderitemsexpanded2 as
select prod_id,
quantity,
item_price,
order_num,
quantity*item_price as expanded_price
from orderitems;
select * from orderitemsexpanded2 where order_num = 20005;
视图非常容易创建,而且很好使用。正确使用的话,视图可以极大的简化复杂的数据处理。
19、全文本搜索
使用全文本搜索
使用全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断的重新索引.
在索引之后select可以match和against一起使用以执行搜索;
01 启用全文本搜索支持
Create table一句接受fulltext的语句,它给出被索引列的一个逗号分隔的列表,
02 进行全文本搜索
select note_text
from productnotes
where match(note_text)against('rabbit');
rabbit为搜索文本,note_text为指定列;
03 使用查询扩展
查询扩展用来设法放宽所返回的全文本搜索结果的范围,利用查询扩展能找出可能相关的结果,即使他们并不精确包含所查找的词;
select note_text
from productnotes
where match(note_text)against('anvils' with query expansion);
04 布尔文本搜索 in boolean mode
可以搜索:
要匹配的词
要排斥的词
排列提示
表达式分组
另外一些内容
是没有full text索引也可以使用布尔搜索,只是布尔搜索非常慢,
20、管理事务处理
事务处理
并非所有引擎都支持事务处理,但是InnoDB支持;
事务处理可以用来维护数据库的完整性,保证成批的SQL操作完全执行或完全不执行;
事务(transaction):指一组SQL语句
rollback:指撤销指定的SQL 语句的过程;
commit:将未存储的SQL语句写入数据库表;
保留点(savepoint):指事务处理中临时设置的占位符,
你可以对它发布回退(与回退整个事务处理不同);
脏读
幻读
重复读