//目录

结构化查询语句

By TreeDream

基本表的定义,修改,删除

建表考虑列名,数据类型,列级完整性,表级完整性(参照性约束)

create table Salvaging
(
    prj_num char(8) primary key,
    prj_name varchar(50),
    start_date datetime,
    end_date datetime,
    prj_status bit,
);
​
create table Stock
(
    mat_num char(8) primary key,
    mat_name varchar(50) not null,
    speci varchar(20) not null,
    warehouse char(20),
    amount int,
    unit decimal(18,2),
    total as(amount*unit),
    check(mat_num like '[m][0-9][0-9][0-9]'),
);
​
create table Out_stock
(
    prj_num char(8),
    mat_num char(8),
    amount int,
    get_date datetime default getdate(),
    department char(20),
    primary key (prj_num,mat_num),
    foreign key(prj_num) references Salvaging(prj_num),
    foreign key(mat_num) references Stock(mat_num),
);
​
alter table Salvaging add prj_director varchar(10);
alter table Salvaging drop column prj_director
​
drop table Salvaging

 

简单查询

单表查询

select prj_name 项目名称,start_date 开始日期,end_date 结束日期,DATEDIFF(day,start_date,end_date) 抢修天数
from Salvaging

 

select *
from Stock
where unit>=50 and unit<=100 --条件

 

in集合

select mat_num,speci,amount,warehouse
from Stock
where warehouse not in ('供电局1#仓库','供电局2#仓库')

 

字符匹配

select *
from Stock
where mat_name like '__绝缘%'

 

NULL值(is)

select *
from Stock
where unit is null

 

排序:只能对最后的查询结果排序

select *
from Stock
where mat_name='护套绝缘电线'
order by unit desc  --默认从低到高(asc),desc从高到底

 

聚集函数

select MAX(amount),min(amount),avg(amount)
from Out_stock
where mat_num = 'm001'

 

分组

select prj_num 项目号,count(*) 物资种类
from Out_stock
group by prj_num

 

select prj_num 项目号,count(*) 物资种类
from Out_stock
group by prj_num
having count(*)>=2

 

连接查询

等值与非等值查询

等值 与非等值根据连接谓词

广义笛卡尔积不带谓词,没有意义;

自然连接:在等值连接的基础上,去除重复列

select Salvaging.prj_num,Salvaging.prj_name,mat_num,amount,get_date,end_date,department
from Salvaging,Out_stock
where Salvaging.prj_num = Out_stock.prj_num

 

外连接查询

连接操作中,如果有一个关系没有与之对应,就不会有输出,但是也丢失了另一个关系的基本情况,解决方案是外连接

外连接:左外连接,右外连接,全外连接

select Salvaging.prj_num,Salvaging.prj_name,mat_num,amount,get_date,end_date,department
from Salvaging left outer join Out_stock on (Salvaging.prj_num = Out_stock.prj_num)

 

复合条件查询

select distinct Salvaging.prj_num,Salvaging.prj_name
from Salvaging,Out_stock,Stock
where Salvaging.prj_num = Out_stock.prj_num and Out_stock.mat_num = Stock.mat_num and Stock.mat_name='护套绝缘电线'

 

自身连接查询

select A.prj_num
from Out_stock A,Out_stock B
where A.prj_num = B.prj_num and A.mat_num = 'm001' and B.mat_num = 'm002'

 

嵌套查询

带谓词in的嵌套查询(子查询往往是一个集合)

select Stock.mat_name,speci,amount
from Stock
where warehouse in (        -- = 亦可
        select warehouse
        from Stock
        where speci = 'BVV-120' and mat_name = '护套绝缘电线'
    )

 

/*
select Stock.mat_num,Stock.mat_name
from Salvaging,Out_stock,Stock
where Salvaging.prj_name='观澜站光缆抢修' and Salvaging.prj_num = Out_stock.prj_num and Out_stock.mat_num = Stock.mat_num
*/
​
select mat_num,mat_name
from Stock
where mat_num in (
    select mat_num
    from Out_stock
    where prj_num in (
        select prj_num
        from Salvaging
        where prj_name = '观澜站光缆抢修'
    )
)

 

带比较运算符的嵌套查询

select mat_num,mat_name
from Stock s1
where amount > (
    select avg(amount) 
    from Stock s2
    where s2.warehouse = s1.warehouse
)

 

带any或all谓词的嵌套查询

select mat_name,speci,amount
from Stock
where warehouse <> '供电局1#仓库' and amount < ALL (
    select amount
    from stock
    where warehouse = '供电局1#仓库'
)

 

带exists谓词的嵌套查询

select prj_name
from Salvaging
where exists (
    select*
    from Out_stock
    where prj_num = Salvaging.prj_num and mat_num = 'm001'
)

 

sql中没有全称量词,把全称量词转换为存在量词

--查询被所有工程使用过了的物资——没有一个工程没有使用过他
select mat_name,speci
from Stock
where not exists (
    select*
    from Salvaging
    where not exists (
        select*
        from Out_stock
        where mat_num = Stock.mat_num and prj_num = Salvaging.prj_num
    )
)

 

数据更新

插入数据

insert
into Salvaging
values ('20110011','观澜站电缆接地抢修','2011-2-3 0:00:00','2011-2-5 12:00:00',1)

 

插入查询结果

insert
into Prj_cost
select prj_num,sum(out_stock.amount*unit)
from Out_stock,Stock
where Out_stock.mat_num = stock.mat_num
group by prj_num

 

修改数据

update Stock
set unit = 44.5
where mat_num = 'm020'

 

删除数据

delete
from Out_stock
where prj_num = '20110001' and mat_num = 'm001'

 

视图

  • 视图是数据库数据的特定子集。可以禁止所有用户访问数据库表,而要求用户只能通过视图操作数据,这种方法可以保护用户和应用程序不受某些数据库修改的影响。

  • 视图是抽象的,他在使用时,从表里提取出数据,形成虚的表。 不过对他的操作有很多的限制 。

创建视图

create view s1_stock
as
select mat_num,mat_name,speci,amount,unit
from Stock
where warehouse = '供电局1#仓库'

 

查询视图

--像基本表一样查询视图
select *
from s1_stock

 

更新视图

--insert,delete
update s1_stock
set amount = 100
where mat_num = 'm001'

 

 

删除视图

drop view s1_stock

 

posted @ 2017-06-17 12:19  小草的大树梦  阅读(337)  评论(0编辑  收藏  举报