学了将近一年的程序,却对数据库的知识掌握想当欠缺,今天下午趁有时间对数据库中的知识做个总结,充充电。以mysql数据库为例,其他数据库也大同小异,sql语句都是通用的。
站在数据库的高度看,数据库包括表、视图、存储过程、索引、函数、触发器,其中表、视图、存储过程、索引最常用的元素。
1、表
在数据库中,表是由数据按一定的顺序和格式构成的数据集合,是数据库的主要对象,其他一切对象都是建立在表的基础之上。每一行代表一条记录,每一列代表记录的字段。
对表的操作主要有,创建表、删除表、修改表。
创建表sql语句:create table table_name (字段名称 类型 [null | not null] [primary key|unique] [foreign key (column)]);多个字段之间用逗号分隔。如:
use database1 ;
create table table1(
学号 varchar(30) not null ,
课程号 varchar(30) ,
成绩 double(6,2),
学分 double(6,2),
primary key(学生号,课程号)
);
表创建以后,可以对表增加、删除、修改表的字段和表名称。如
#新增一个字段,默认值为0,非空,自动增长,主键
2、视图
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。
举例说明:
假设有A,B两个表。
表A记录如下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115
表B记录如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408
--------------------------------------------
1.left join
sql语句如下:
select * from A
left join B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
(所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.
2.right join
sql语句如下:
select * from A
right join B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
--------------------------------------------
3.inner join
sql语句如下:
select * from A
innerjoin B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
--------------------------------------------
PS:
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。
语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2
说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误
注:left和right是外连接,Inner是内连接。
sql union用法
sql union在查询中可以将两个SQL 语句的结果合并起来。如果这样看的话, UNION 跟 JOIN 是相似的,两个指令都可以由多个表格中撷取资料。
sql union的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。
sql union只是将两个结果联结起来一起显示,并不是联结两个表,sql用法如下:
两个表格, StoreData_200903 表格 StoreData_200904,这两张表格的数据结构是完全一样的,只是存放了不同月份的数据库(注意:这样做是为了能够分表,而且可以按月存档数据),现在需要联合查询,就是从两个表中查询出数据,SQL 语句:
SELECT top 50 FROM StoreData_200903
UNION
SELECT top 50 FROM StoreData_200904
sql union all用法
sql union all这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 sql union all和 sql union不同之处在于 sql union all会将每一次符合条件的数据列出来,无论数据库有无重复。
用法也很简单:
SELECT top 50 FROM StoreData_200903
UNION ALL
SELECT top 50 FROM StoreData_200904
值得注意的是,sql union all的执行效率要比sql union效率要高很多,这是因为,使用sql union需要进行排重,而sql union All 是不需要排重的,这一点非常重要,因为对于一些单纯地使用分表来提高效率的查询,完全可以使用sql union All。
UNION 操作符用于合并两个或多个 SELECT 语句的结果集
如
select id,name from A
union
select id,name from B
注意:两个select 参数的名称是否相同不重要,union只会按一个select 参数的顺序去链接另一个select的参数
这就要求,两个select的参数个数要相同,且相同位置的参数类型也要相同
union all 与union 的语法 一样,只是union all是结果集里准许有重复记录,而union的结果集里不准许有重复记录
JOIN 操作符拥有连接两张表,
JOIN: 如果表中有至少一个匹配,则返回行 (亦 inner join) LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行 RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行 FULL JOIN: 只要其中一个表中存在匹配,就返回行