SQL扫盲贴
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;