一、数据库的几个概念
(1) 域(domain):是字段的取值范围,例如1到10之间等等这样的限制
(2)“视图”:是虚拟的表,可以将某几个表的字段做一个视图即像是个虚拟的表一样,直接操作
(3)“存贮过程”:就是一段SQL语言程序(可以有参数),如果某个操作常用到,就在数据库里将这段程序写到数据库里,每个存储过程都有一个ID名,使用的时候可以直接调用。
************************************ 查询 ************************************
二、查询语句小技巧
(1)where title like '%''s%'
是指title中含 's
(2)select * from movie where title like 'Star___'
表示选出title长度为7,而且title 4个字母为Star,下划线是占位符
三、联合查询:intersection求交集、union求和集、except求差集
(1) intersection例子:
(select name,address from Star where sex='F') Intersect (select name,address from Singer where salary>10000)
意思是选出月薪高于10000 歌星同时又是女明星
(2)except例子:(select name,address from dancer) except (select name,address from singer)
选出 是仅仅是舞蹈演员而不是歌手的人
(3)union例子:(select title from movie) union (select name AS title from cartoon)
将movie和cartoon的片名都选出来
!注:这三种都是以第一句为主,后面的相当于是一个修饰;
列名要绝对一致,不一致的用as起个相同的别名。
四、处理重复记录
关键字:DISTINCT
例子:select distinct name from movie
五、聚合操作符
关键字:SUM(总和 AVG(平均值)MIN(最小值)MAX(最大值)COUNT(记录数(注:包括重复的记录,要去掉重复的需要用DISTINCT))
例子:
select COUNT(DISTINCT name) from star
六、聚合显示控制符
(1)关键字:GROUP BY(写在where之后,相当于分组排序)
例子:
select StudioName
from Movie
where GROUP BY StudioName
(2)关键字:HAVING(写在where之后,将附加条件写在HAVING后面进一步限制结果记录集)
例子:
select name,SUM(length)
From Movie
where star='Mickey Mouse'
Having MIN(year)<1990
七、子查询
(1)select name from star where movie=(select m_id from movie where title='Star Wars')
选出星战的演员
(2)关键字
第一组:IN、NOT IN
IN在……结果集中
NOT IN不在……结果集中
第二组:>ALL、 <>ALL
ALL:大于……结果集中任何一条记录
<>ALL:相当于NOT IN
第三组:、>ANY、 =ANY
>ANY:只要大于……结果集中的一条记录
=ANY:相当于IN
:相当于NOT IN
第四:EXIST R
R表非空
例子1:
select name from Star
where movie IN
(select id from movie where (title,year)IN
(select name,date from cartoon where studio='Ford')
)
“自相关的子查询”例子2:
select title
from movie as old
where year < ANY (
select year from movie
where title=old.title
)
选择的是title一样,year不一样的电影
************************************ 表 *****************************************
八、删除表
关键字:drop
例子:drop R
九、修改表结构(添加、删除列)
关键字:ALERT TABLE
“添加”示例:ALERT TABLE movie ADD phone CHAR(10)
“删除”示例:ALERT TABLE movie DROP year
十、定义缺省值
关键字:DEFAULT
例子:birthday DATE DEFAULT DATE'0000-00-00'
ALERT TABLE movie ADD phone CHAR(10) DEFAULT 'unknown'
十一、域
(1)“定义”关键字:CREAT DOMAIN …… AS ……
“定义”例子:CREAT DOMAIN movieDomain AS VARCHAR(50) DEFAULT 'unknown'
(2)“修改”关键字:ALERT DOMAIN …… SET ……
“修改”例子:ALERT DOMAIN movieDomain SET DEFAULT 'null'
(3)“删除”关键字:DROP DOMAIN ……
“删除”例子:DROP DOMAIN movieDomain
十二、索引
(1)“建立索引”关键字:CREAT INDEX …… ON ……
例子:CREAT INDEX yearIndex ON movie(year)
(2)“删除索引”关键字:DROP INDEX ……
例子:DROP INDEX yearIndex
************************************ 表的联接 ********************************
十四、Join联接
1. 外联接
!!!注:必须有on指明连接条件,且条件为字段相等(字段名称可以不同),否则作笛卡尔积
左向外联接:
关键字:(NATURAL)LEFT OUTER JOIN或(NATURAL)LEFT JOIN
结果:包括左表中的所有行。不包括右表中的不匹配行。例如,下面的 SQL 语句说明 titles 表和 publishers 表之间的左向外联接包括所有的书名,甚至包括那些没有出版商信息的书名:
SELECT titles.title_id, titles.title, publishers.pub_name
FROM titles LEFT OUTER JOIN publishers ON titles.pub_id= publishers.pub
右向外联接:
关键字:(NATURAL)RIGHT OUTER JOIN或(NATURAL)RIGHT JOIN
结果:包括右表中的所有行。不包括左表中的不匹配行。例如,在 titles 和 publishers 表之间的右向外联接将包括所有的出版商,甚至包括那些在 titles 表中没有书名的出版商。所得到的 SQL 可能象下面这样:
SELECT titles.title_id, titles.title, publishers.pub_name
FROM titles RIGHT OUTER JOIN publishers
ON titles.pub_id = publishers.pub_id
完整外部联接:
关键字:(NATURAL)FULL OUTER JOIN或(NATURAL)FULL JOIN
结果:包括所有联接表中的所有行,不论它们是否匹配。例如,titles 表和 publishers 表之间的完整外部联接显示所有书名和所有出版商,甚至包括那些在另一个表中没有匹配值的书名和出版商。
SELECT titles.title_id, titles.title, publishers.pub_name
FROM titles FULL OUTER JOIN publishers
ON titles.pub_id = publishers.pub_id
2. 内联接
!!!注:必须有on指明连接条件,且条件为字段相等(字段名称可以不同),否则作笛卡尔积
仅显示两个联接表中的匹配行的联接。(这是查询设计器中的默认联接类型。)例如,可以联接 titles 表和 publishers 表以创建显示每个书名的出版商名称的结果集。在内联接中,结果集内不包含没有出版商信息的书名,也不包含没有书名的出版商。这类联接所得到的 SQL 可能象下面这样:
SELECT title, pub_name
FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id
注意:当创建内联接时,包含 NULL 的列不与任何值匹配,因此不包括在结果集内。空值不与其它的空值匹配。
3.交叉联接
在这类联接的结果集内,两个表中每两个可能成对的行占一行。例如,在通过作者 CROSS JOIN 出版商输出的结果集内,每个可能的作者/出版商组合占一行。所得到的 SQL 可能象下面这样:
SELECT * FROM authors CROSS JOIN publishers
************************************ 视图 ************************************
十三、视图
(1)创建视图
例子:
CREAT VIEW allmovie AS
Select title,year
From cartoon,movie
(2)操作视图记录(语法与操作表记录一样)
“添加记录”(对于视图没有涉及的相关表列,会填上缺省值)
例子:INSERT INTO allmovie VALUES(……)
“删除记录”(会删除相关表的行)
例子:DELETE FROM allmovie WHERE ……
“修改记录”(会修改相关表的行)
例子:UPDATE allmovie SET …… WHERE ……
(3)删除视图
例子:DROP VIEW allmovie
*********************************** 空值的处理 ********************************
十五、Null值的操作
(1)Null值参与算数运算(加减乘除……),结果得Null
(2)Null值作比较(大于、等于……),结果得unknown
(unknown介于false、true之间,即介于0、1之间相当于1/2)
十六、“unknown、false、true”的“AND、OR、NOT(取反)”运算
(1)原则:unknown相当于1/2; false相当于0; true相当于1;
AND相当于“取小的”; OR相当于“取大的”; NOT相当于“1-x”
对应表
|
参数 |
结果 |
X |
Y |
AND |
OR |
NOT(x) |
|
true |
true |
true |
true |
false |
|
true |
unknown |
unknown |
true |
false |
|
true |
false |
false |
true |
false |
|
unknown |
true |
unknown |
true |
unknown |
|
unknown |
unknown |
unknown |
unknown |
unknown |
|
unknown |
false |
false |
unknown |
unknown |
|
false |
true |
false |
true |
true |
|
false |
unknown |
false |
unknown |
true |
|
false |
false |
false |
false |
true |
(2)例子:
select * from movie where length>=120 OR length<120
此时当length的值为null那么length>=120得unknown,length<120得unknown,
(unknown OR unknown)=unknown 不能被查询语句选出,所以上述语句选出的是length不为null的记录。
************************************ 递归 ******************************** 难点 (at P313)
十七、Recursion(递归)
例子: