学了将近一年的程序,却对数据库的知识掌握想当欠缺,今天下午趁有时间对数据库中的知识做个总结,充充电。以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,非空,自动增长,主键
- alter table tabelname add new_field_name field_type default 0 not null auto_increment ,add primary key (new_field_name);
- #增加一个新字段
- alter table tableName add new_field_name field_type;
- alter table tableName add new_field_name field_type not null default '0';
- #删除字段
- alter table tableName drop column field_name;
- #重命名字段
- alter table tableName change old_field_name new_field_name new_field_type;
- #改变字段的类型
- alter table tableName change field_name field_name field_type;
- #重命名表
- alter table table_old_name rename table_new_name;
- #加索引
- alter table tablename add index 索引名 (字段名1[,字段名2 …]);
- alter table tablename add index index_name(name);
- #设置主键
- alter table tablename add primary key(field_name);
- #添加唯一索引
- alter table tablename add unique index_name(field_name);
- #删除索引
- alter table tablename drop index index_name;
2、视图
DROP PROCEDURE IF EXISTS proc_employee_findById;
--创建存储过程
CREATE PROCEDURE proc_employee_findById(in|out|inout n int)
BEGIN
SELECT * FROM employee where id=n;
END
--定义变量
SET @n=1;
--调用存储过程
CALL proc_employee_findById(@n);
1. 删除存储过程时只需要指定存储过程名即可,不带括号;
2. 创建存储过程时,不管该存储过程有无参数,都需要带括号;
3. 在使用SET定义变量时应遵循SET的语法规则;
SET @变量名=初始值;
4. 在定义存储过程参数列表时,应注意参数名与数据库中字段名区别开来,否则将出现无法预期的结果
SQL-92标准所定义的FROM子句的连接语法格式为:
FROM join_table join_type join_table
[ON (join_condition)]
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
而full join(全连接)顾名思义,左右表中所有记录都会选出来。
举例说明:
假设有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 操作符拥有连接两张表,