• 结构化查询语句


    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
  • 相关阅读:
    asp.net页面常见问题
    售后系统用户需求
    asp.net缓存
    xml
    写日志
    事务问题
    Hive之数据类型Array的使用
    mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    Hive之数据类型struct的使用
    从数据仓库系统对比看Hive发展前景
  • 原文地址:https://www.cnblogs.com/TreeDream/p/7039887.html
Copyright © 2020-2023  润新知