ITPub博客

首页 > Linux操作系统 > Linux操作系统 > (原)SQL扫盲贴

(原)SQL扫盲贴

原创 Linux操作系统 作者:urinator 时间:2009-03-06 18:03:01 0 删除 编辑

select 这句话,我相信你已经知道了

就是 select 表里面的列 column1, column2 from 表的名字;

比方表的名字是 employee 雇员,然后列,有 ID, 姓名 name,职位 title,部门dpet,薪水 salary,你只要知道名字和薪水

就是 select name, salary from employee;

简单吧?

如果要加上条件,就是加一句 where 在最后,比方你要知道部门 id 是 20 的职员的薪水,

就是:


select name, salary from employee where dept=20;

也很简单,是不是?

order by 你也会用的,我不用说了吧?就是排序?

正排,反排是 order by column_name desc

上面这些,对于一个表的操作,基本上就是这些了,

但是要注意的地方,比方在 where 这句里面

如果是 文字的 列 要用 单引号或者双引号

WHERE tblStaff.Department = "Marketing”

or

  WHERE tblStaff.Department = 'Marketing’

数字就是不用。

  WHERE tblInvoices.InvoiceNumber > 1500

据说日期要用 # 我不记得了,你自己试验一下

WHERE tblStaff.BirthDate = #09/27/1950#

对了,还有一个地方,要明确一下,就是 where 的时候要用括号

比方,你要找 dept 10 和 20 的月薪大于 2000 的人

要用到 括号

where (dept=20 or dept=10) and salary >2000  这样来限定你选择的数据


比方说,同样的 employee 的表,你要知道每个部门每个月发放的的工资,要这样写

select dept, sum(salary) from employee
group by dept;


这样你使用的单列的 function, 如果需要对上面数据作限定,比方 部门单月工资超过 100,000 的,这个时候用 having


select dept, sum(salary) from employee
group by dept
having sum(salary) > 100000;

 

如果说多个表,就要说到表之间的关联,所谓的 primary key and foreigh key 就是外键之间的关系

 

RDBMS relational database management system 中要把数据放入一个数据库,要遵循 normalization, 这玩意一级一级说上去,挺麻烦的,主要就是说,在数据库里面的数据不要重复存放。

比方上面说的 employee 的表,就存放的一个 部门 id,  因为如果存放了 部门的名字,就会出现很多重复的数据,这个时候,就要另外做一个部门表


dept  包括 dept_id, dept_name, location(地点),在这个表里面,部门 id 不能重复的,可以做 primary key.

在 employee 的表里面,每个员工的 id 也是不能重复的,是 primary key. 


这个时候,employee 表里面的存在的 dept_id 的这个列,就要对应 dept 里面 dept_id 的这个列。他们之间的关系,是 多 对 一

dept_id 在 employee 的表里面,就是外键,foreign key 对应 dept 表的 PK

这是联系这两个表的线索。

这个关系不一定是物理存在,但是如果要 query 两个表,这两个表一定要有某种关系

n 个表之间,如果算起来最少的关系,应该有 n-1 个 条件


比方:

表: A  列  x, y   其中 x, pk  y fk to B.y
表  B     列  y, p  ....  跟上面相同
表 C  列 p, q  ...

如果要把所有的数据选出来,是这样

select A.x, B.y, C.p, C.q
from A, B, C
where A.y=B.y
and B.p = C.p;


这个关系理顺了,表才能联合正确。条件要刚刚好,如果重复加叠已经建立正确的关系的表,会引发 performance 性能方面的问题

pk primary key 主键的意思,简单点说,就是这个字段或者这个一组字段不能重复,如果重复则报错,保存不进去。
那个query 的意思是,如果你想从2个表中去数据,那必须2个表其中的字段能够关联起来。比如你的人事表中有工号,你的薪资表中也有工号,那可以通过2个表的工号连接,把2个表的数据显示在一行。

pk 就是 primary key  是不是叫主键,一般来说每个表都有一个主键,不能空,不能重复这样的列。

query 就是 查询语句。

关于 union 有两种,union 和 union all


如果两个表的结构完全相同,你可以:


SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

如果这两个表中又重复的数据,union 之后重复的数据只出现一次,


SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

这样的话,重复的数据,不会被踢出去~~~

pk是主键,fk是外键

例如2个表
1.   item,name,item_type,warehouse....

  2.   warehouse,name ,quantity

   2表 的warehouse关联,      item 为 1这个表的 pk,warehouse 是其外键,warehouse 是表2的主键,,

比方你说得你的十二个月的工资表

如果要要查询数据,十二个月并起来,是没有问题的

但是如果十二张单表,都是用 employ_id 做的主键

如果一个人领了超过两次的工资,这个 id 就有重复了,就不能符合主键的定义了
所以如果合并的话,不能有主键


但是你如果建立一个新表,不设立主键,只要你自己知道数据没有错误,也是没关系的:比方

create table ABC as
(select columns from A union all select columns from B ...)

你选的 columns 都要一致。。。
2、如果要从6个表中查询某人在6个月的工资,怎么写?


第二个,

如果这个人的emp_id 是 008

select emp_id, name, salary from table_month_1 where emp_id=008
union all
select emp_id, name, salary from table_month_2 where emp_id=008
union all
select emp_id, name, salary from table_month_3 where emp_id=008
union all
select emp_id, name, salary from table_month_4 where emp_id=008
union all
select emp_id, name, salary from table_month_5 where emp_id=008
union all
select emp_id, name, salary from table_month_6 where emp_id=008;


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7942439/viewspace-563135/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 感恩的心
请登录后发表评论 登录
全部评论

注册时间:2007-12-06

  • 博文量
    3868
  • 访问量
    1865427