一、SQL简单语法
1.集合运算
union、union all(保留重复)
intersect、intersect all(保留重复)
except、except all(保留重复)
2.空值
is null
= null(返回unknown)
3.聚集函数
avg()、max()、min()、sum()、count()
count()会计算null列,其他会忽略null列
不能用count(distinct *),但可count(distinct ID).
count(空集)返回0,其他函数如max(空集)会返回null.
group by ...
having ...(针对group by)
some、every处理布尔值的聚集
some:其中有true返回true,所有均为false返回false.
every:所有均为true返回true,其中有false返回false.
4.嵌套子查询
select (子查询句) as tablename1(a1,b1,c1..)
from (子查询句) as tablename2(a2,b2,c2...)
where tablename3(a3,b3,c3) in/not in (子查询句)
unique/not unque 传入表中是否含重复元组
exists/not exists 传入表中是否为空集
with tablename(a,b,c..) as (子查询句) with子句提供定义临时关系的方法,这个定义只包含with子句的查询有效.
5.连接表达式
table1 join table2 on table1.a=table2.a;
(inner) join
natural join 如果两张表中有相同名字的列,但是数据类型不一致,如果能隐式转换,则能正常连接,但如果隐式转换不成功,则报错。
left outer join 左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
right outer join 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
full outer join 完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
6.视图和索引
create view viewname(a,b,c...) as
(子查询句)
视图实际上只是存储了子查询句,方便调用查询句.(有物化视图能根据表的改变而改变,但是要付出较大的更新开销)
create index indexname on table(a,b..)
索引是将指定列的地址进行记录,下次调用时可以直接通过索引访问到该指定列,减少了查询的时间.
7.事务
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务的四个特性(A-C-I-D):1.原子性(atomicity) 2 .一致性(consistency) 3.隔离性(isolation) 4.持久性(durability)
commit work:提交当前事务
rollback work:回滚当前事务
8.like
例:
SELECT * FROM Persons WHERE City LIKE 'N%'
通配符 | 描述 |
---|---|
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或者 [!charlist] |
不在字符列中的任何单一字符 |
9.top 注释: 并非所有的数据库系统都支持 TOP 子句。
SQL Server 的语法:
SELECT TOP number|percent column_name(s) FROM table_name
MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的
MySQL 语法
SELECT column_name(s) FROM table_name LIMIT number
例子
SELECT * FROM Persons LIMIT 5
Oracle 语法
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number
例子
SELECT * FROM Persons WHERE ROWNUM <= 5
二、进阶SQL
1.存储过程和函数
语法举例:
存储过程:
create procedure procedurename(in a,out b)
begin
(子查询句)
end
in表示待赋值的参数
out表示为返回结果而在过程中设置的值
调用时:
exec
存储过程名 参数
函数(参数为20长度内的字符串,返回值为表):
create function functionname(a varchar(20)) return table(a,b,c...)
return table (子查询句);
调用时其实与系统函数的调用类似
总体来说,
存储过程
1. 功能强大,限制少
2. 不能直接引用返回值
3. 用select语句返回记录集
自定义函数
1. 诸多限制,有许多语句不能使用,许多功能不能实现
2. 可以直接引用返回值
3. 用表变量返回记录集
2.触发器
触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。
语法:
Create Trigger truStudent --truStudent是触发器名称
On Student --在哪个表中创建触发器
for Update --触发什么样事件/insert/delete
As
if Update(StudentID) --如果什么样的事件触发
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --那就做什么样的事(具体实现上面for update)
Where br.StudentID=d.StudentID
end