zoukankan      html  css  js  c++  java
  • SQL语句学习(二)

    为一张表添加外键:

    这里我们希望再建一张订单的表为t_order,包含order_id,customer_id和price:

    1 CREATE TABLE t_order(order_id INT(11) NOT NULL auto_increment PRIMARY KEY,
    2 customer_id INT(11) NOT NULL,
    3 price DECIMAL(10,2)
    4 );

    我们按照之前所学的建立了这张表,但是实际上,我们希望这张表和之前的表应该是有某种约束,因此我们就需要为这行表添加一个外键。

    和添加主键的语法类似的,我们添加外键:

    1 ALTER TABLE t_order ADD FOREIGN KEY (customer_id) REFERENCES t_customer(customer_id);

    或者,我们也可以在建立表的时候,直接设置外键:

    CREATE TABLE t_order(order_id INT(11) NOT NULL auto_increment PRIMARY KEY,
    customer_id INT(11) NOT NULL,
    price DECIMAL(10,2),
    FOREIGN KEY (customer_id) REFERENCES t_customer(customer_id)
    );

    注意:外键只是一个约束!

    别名:

    有时候名字太长,我们希望能用简写来代替之前的名字,这时候我们就可以设置别名(ALIAS),

    我们可以为列设置别名:

    1 SELECT First_name AS f_name, Last_name AS Family FROM t_customer;

    我们在输出的结果中可以看到,列的名字已经发生了改变:

    同样,我们可以设置表的别名:

    1 SELECT t_c.customer_id FROM t_customer AS t_c;

    乍一看,使用别名似乎更加费事了。但是,我们看下面的SQL语句:

    1 SELECT t_order.order_id, t_order.price FROM t_order, t_customer WHERE t_customer.First_name = 'MeiMei';

    注意,我们虽然没有直接从t_customer中查相关条件,但是FROM后面也要写上t_customer,这是因为我们将这两个做了笛卡尔积,然后在结果中再筛选。

    我们再来看看更长的查询:

    1 SELECT t_order.order_id, t_order.price, t_customer.customer_id FROM t_order, t_customer WHERE t_customer.First_name = 'MeiMei';

    SQL语句里两张表的名字出现了很多次,我们再看看使用别名后的SQL语句:

    SELECT o.order_id, o.price, c.customer_id FROM t_order AS o, t_customer AS C WHERE c.First_name = 'MeiMei';

    是不是简洁了一些。

    实际上,当我们需要联合查询两张表时,我们应该使用JOIN 将两张表联合起来。

    1 SELECT * FROM t_order INNER JOIN t_customer ON t_customer.customer_id = t_order.customer_id;

    INNER JOIN 就相当于JOIN,是两张表的交集,而OUTER JOIN还分为LEFT JOIN,RIGHT JOIN和FULL JOIN。LEFT JOIN左边的集合,当后边无该记录时,用NULL填充,而RIGHT JOIN是右边的集合,左边没有的记录用NULL填充。FULL JOIN是求并集,没有的记录用NULL填充。

    UNION和UNION ALL可以用来合并两个查询的结果:

    1 SELECT Last_name FROM t_customer UNION SELECT customer_id FROM t_order;

    我们会得到一个以Last_name为列名的一个表,然后将前后两次的筛选记录都合并在内。这样的筛选并没有什么实际意义,只是用来练习语法。

    当然我们可以筛选出多个列,但是前后两次筛选的列数必须相同,并且结果中总以第一次查询的列名表示。

    UNION ALL会显示重复的记录,而UNOIN则不会。

  • 相关阅读:
    Windows Message ID 常量列表大全
    C#中Thread与ThreadPool的比较
    HTML元素隐藏和显示
    Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警
    Windbg DUMP分析(原创汇总)
    计算密集型分布式内存存储和运算平台架构
    从.net到java,从基础架构到解决方案。
    C# 泛型集合
    你该怎么选Offer
    C++ 虚拟桌面
  • 原文地址:https://www.cnblogs.com/insaneXs/p/5220818.html
Copyright © 2011-2022 走看看