数据库基础知识学习总结

  学了将近一年的程序,却对数据库的知识掌握想当欠缺,今天下午趁有时间对数据库中的知识做个总结,充充电。以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,非空,自动增长,主键       

  1.    alter table tabelname add new_field_name field_type default 0 not null auto_increment ,add primary key (new_field_name);   
  2.   
  3. #增加一个新字段   
  4.   
  5.    alter table tableName add new_field_name field_type;   
  6.    alter table tableName add new_field_name field_type not null default '0';   
  7.   
  8. #删除字段   
  9.   
  10.    alter table tableName drop column field_name;   
  11.   
  12. #重命名字段   
  13.   
  14.    alter table tableName change old_field_name new_field_name new_field_type;   
  15.   
  16. #改变字段的类型   
  17.   
  18.    alter table tableName change field_name field_name field_type;   
  19. #重命名表   
  20.   
  21.    alter table table_old_name rename table_new_name;   
  22.   
  23. #加索引   
  24.   alter table tablename add index 索引名 (字段名1[,字段名2 …]);   
  25.   alter table tablename add index index_name(name);   
  26.   
  27. #设置主键   
  28.   alter table tablename add primary key(field_name);   
  29.   
  30. #添加唯一索引   
  31.   alter table tablename add unique index_name(field_name);   
  32.   
  33. #删除索引   
  34.   alter table tablename drop index index_name;  

    2、视图

        

数据视图在程序里可以当一个表来处理.它就是把两个或多个表安一定的关系联系起来生成一个新的表.
 比如:表1中有员工编号,表2中有员工姓名,电话... 用视图把这两个表联系起来,生成一个新的表:员工编号,员工姓名,电话...
 但是,视图 一般只用于查询操作,而不利用视图进行数据的增、删、改操作
 MySQL 视图的操作是在新版本数据库才支持的,视图操作的好处是可以简化数据库的查询,特别是一些
 经常查询的数据表我们可以先创建一个视图,以后要在查询这个类式 的数据表时候,就可以直接查询该
 视图。这样也可以提高查询的效率。  视图还有个好处就是,你如果改变了基数据表的字段或者值,视图表也会随着改 变,所以我们不用去担
 心,改变基数据的字段值时候担心视图的数据不同步的问题。例如:创建视图,然后通过视图来查询。 create view v3 as SELECT b.sid, b.grade, c.cname FROM grade b, course c WHERE b.cid = c.cid
 然后查询从视图中查询出一条数据 select sid,grade,cname from v3 where sid=200410001
 这样是不是更好理解点,不要再一次使用联合查询去查询某条数据

    3、存储过程
         上篇文章对存储过程有详细介绍,这里举个例子说明
          --删除存储过程
          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. 在定义存储过程参数列表时,应注意参数名与数据库中字段名区别开来,否则将出现无法预期的结果
     4、其它一些主要的概念,包括左右连接、内连接、合并同类项、联合查询,一些主要的函数有计数count()  、汇总sum() 、最大值max()、最小值min(),分组group by、排序order by。
     连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

SQL-92
标准所定义的FROM子句的连接语法格式为:


FROM join_table join_type join_table
[ON (join_condition)]

 

join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。

 

内连接(INNER JOIN)使用比较运算符进行表间某()列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。

外连接分为左外连接(LEFT OUTER JOINLEFT JOIN)、右外连接(RIGHT OUTER JOINRIGHT JOIN)和全外连接(FULL OUTER JOINFULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
 
left join(左连接)包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。左连接即是把左边的表看成主表,将条件匹配的右边的表的数据连到左边的表上并查询出来。 
 right join(右连接),即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。与左连接相似
 而full join(全连接)顾名思义,左右表中所有记录都会选出来

 

 举例说明:

假设有AB两个表。 

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 数据类型数据的字段,将会发生错误  

 

注:leftright是外连接,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: 只要其中一个表中存在匹配,就返回行


你可能感兴趣的:(数据库基础知识学习总结)