• SQL必知会(一)-学习前的准备


    整理笔记的目的

    我曾尝试同时读过几本理论性比较强的书,如《深入浅出 SQL》、《SQL 经典入门》、《SQL Server从入门到精通》、《数据库系统概念》等。然而,在啃这些书时,我倍感压力,事倍功半的结果导致我有了放弃研读下去的想法。因为对那些晦涩难懂的理论知识,我一时还消化不了。毕竟以前在工作中没怎么使用到数据库开发,所以我已经有相当长时间都没有接触过这个技术了。

    对于一些只为了做数据库编程开发的普通程序员,对数据库的掌握程度暂时还不能要求达到数据库管理员的水平,只要懂得其基本语法就可以了。所以上面提到的学习方向是有问题的,在大学期间可以这么做,毕竟时间充足。但是现在按照这样的步骤去学,不知要学到猴年马月。同时我也不能要求自己一口吃成胖子,连基本语法都没捡回来,就开始研究它的细节来了。于是我找了一本书《SQL 必知会》。这本书的优势在于它的实操性很强,学习方向明确,同时还去掉了那些晦涩难懂的理论知识。这本书对像我们这样的程序员,会有很大的帮助。

    虽然说,要想实现数据库的增删查改只要“借鉴”别人的代码就能学会了大概。但是我认为要想快速对SQL进一步加深理解,并能在开发中运用好,还是得从它的基本语法开始学起。

    学习者如果完全地按照这本书的内容去敲一遍代码,就会获益匪浅。但是我认为,只敲代码还是不够的。因为不总结,不多练习,所学的东西随着时间的流逝终究会被遗忘,或者只记得零零散散的知识,在编程时会感到很吃力。

    因此,以学而不忘为目标,我专门整理了一份笔记。该笔记完全是按照书上的源码来练习的,并补充了个人理解的部分内容,以及在实操过程中遇到的问题。接下来的学习过程中,我会尽量使得内容排版简洁,知识总结到位,以便往后我们需要时再快速复习一遍。

    本文概述

    本文作为首篇文章,主要内容是为学习《SQL 必知会》之前做些准备的。下文是本书中每个章节提到的例子《玩具经销商订单系统》,学习者在学习之前需要创建相关的数据库信息。

    比如我在计算机里安装了 Miscrosoft SQL Server 2014。我需要在数据库管理系统里执行以下的代码内容,用以:

    • 创建数据库(不创建数据库也行,直接创建的表会默认放在系统数据库 master 里 )
    • 创建数据库中的表
    • 设置表与表之间的关系(外键主键等)
    • 在每张表中添加数据

    本书主要基于 SQL Server 中 SQL 语法规则来传授知识,所以建议使用 Miscrosoft SQL Server 数据库系统。虽然其他数据库的语法规则相差不大,但是难免可能会在学习过程中遇到相关语法的问题,增加了学习成本。

    学习者可以通过下文的步骤,或者通过下文提到百度网盘分享里的文件,复制粘贴代码来实现一个简单的玩具经销商订单系统。该系统在此后一系列文章中会被使用到。

    由于后面文章会大大减掉了书中的部分解释以及笔者认为不太重要的部分内容,遇到疑问时,学习者可以借助翻阅本书来进行加强理解。

    《SQK 必知会》PDF版(包含相关创建数据库的代码文件)链接:
    链接:https://pan.baidu.com/s/1AE4xQAvDCtfO-ML9XQxdaw?pwd=u4uj
    提取码:u4uj

    一、例子:玩具经销商订单系统

    假设该系统的数据库有5张表组成,这些表用来完成以下几项任务:

    • 管理供应商、管理产品目录、管理顾客列表。
    • 录入顾客订单。

    二、数据库中的表

    1、Vendors 表:供应商表

    Vendors 表存储销售产品的供应商,每行一个供应商。

    字段名称字段类型及长度是否为空值含义
    vend_idchar(10)NOT NULL主键,唯一的供应商 ID
    vend_namechar(50)NOT NULL供应商名
    vend_addresschar(50)NULL供应商的地址
    vend_citychar(50)NULL供应商所在城市
    vend_statechar(5)NULL供应商所在州
    vend_zipchar(10)NULL供应商地址邮政编码
    vend_countrychar(50)NULL供应商所在国家

    创建 Vendors 表:

    CREATE TABLE Vendors
    (
      vend_id      char(10) NOT NULL ,
      vend_name    char(50) NOT NULL ,
      vend_address char(50) NULL ,
      vend_city    char(50) NULL ,
      vend_state   char(5)  NULL ,
      vend_zip     char(10) NULL ,
      vend_country char(50) NULL 
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2、Products 表:产品表

    Products 表包含产品目录,每行一个产品。

    字段名称字段类型及长度是否为空值含义
    prod_idchar(10)NOT NULL主键,唯一的产品 ID
    vend_idchar(10)NOT NULL跟Vendors 表关联的外键,产品供应商 ID
    prod_namechar(255)NOT NULL产品名
    prod_pricedecimal(8,2)NOT NULL产品价格
    prod_descvarchar(1000)NULL产品描述

    创建Products 表:

    CREATE TABLE Products
    (
      prod_id    char(10)      NOT NULL ,
      vend_id    char(10)      NOT NULL ,
      prod_name  char(255)     NOT NULL ,
      prod_price decimal(8,2)  NOT NULL ,
      prod_desc  varchar(1000) NULL 
    );
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3、Customers 表:顾客表

    Customers 表存储所有顾客信息,每行一个顾客。

    字段名称字段类型及长度是否为空值含义
    cust_idchar(10)NOT NULL主键,唯一的顾客 ID
    cust_namechar(50)NOT NULL顾客名
    cust_addresschar(50)NULL顾客的地址
    cust_citychar(50)NULL顾客所在城市
    cust_statechar(5)NULL顾客所在州
    cust_zipchar(10)NULL顾客地址邮政编码
    cust_countrychar(50)NULL顾客所在国家
    cust_contractchar(50)NULL顾客的联系名
    cust_emailchar(255)NULL顾客的电子邮件地址

    创建 Customers 表:

    CREATE TABLE Customers
    (
      cust_id      char(10)  NOT NULL ,
      cust_name    char(50)  NOT NULL ,
      cust_address char(50)  NULL ,
      cust_city    char(50)  NULL ,
      cust_state   char(5)   NULL ,
      cust_zip     char(10)  NULL ,
      cust_country char(50)  NULL ,
      cust_contact char(50)  NULL ,
      cust_email   char(255) NULL 
    );
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4、Orders 表:订单表

    Orders 表存储顾客订单(不是订单细节),每行一个顾客订单。

    字段名称字段类型及长度是否为空值含义
    order_numintNOT NULL主键,唯一的订单号
    order_datedatetimeNOT NULL订单日期
    cust_idchar(10)NOT NULL订单顾客 ID(关联到 Customers 表的 cust_id,外键)

    创建 Orders 表:

    CREATE TABLE Orders
    (
      order_num  int      NOT NULL ,
      order_date datetime NOT NULL ,
      cust_id    char(10) NOT NULL 
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5、OrderItems 表:订单物品表

    OrderItems 表存储每个订单中的实际物品,每行有一个订单中的物品信息。

    order_num + order_item 组合一起设置为主键。

    字段名称字段类型及长度是否为空值含义
    order_numintNOT NULL订单号(关联到 Orders 表的 order_num,外键)
    order_itemintNOT NULL主键,订单物品号(订单内的顺序)
    prod_idchar(10)NOT NULL产品 ID(关联到 Products 表的 prod_id,外键)
    quantityintNOT NULL物品数量
    item_pricedecimal(8,2)NOT NULL物品价格

    创建 OrderItems 表:

    CREATE TABLE OrderItems
    (
      order_num  int          NOT NULL ,
      order_item int          NOT NULL ,
      prod_id    char(10)     NOT NULL ,
      quantity   int          NOT NULL ,
      item_price decimal(8,2) NOT NULL 
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    6、设置主键

    设置数据库中某字段的主键:

    ALTER TABLE Customers WITH NOCHECK ADD C ONSTRAINT PK_Customers PRIMARY KEY CLUSTERED (cust_id);
    ALTER TABLE OrderItems WITH NOCHECK ADD CONSTRAINT PK_OrderItems PRIMARY KEY CLUSTERED (order_num, order_item);
    ALTER TABLE Orders WITH NOCHECK ADD CONSTRAINT PK_Orders PRIMARY KEY CLUSTERED (order_num);
    ALTER TABLE Products WITH NOCHECK ADD CONSTRAINT PK_Products PRIMARY KEY CLUSTERED (prod_id);
    ALTER TABLE Vendors WITH NOCHECK ADD CONSTRAINT PK_Vendors PRIMARY KEY CLUSTERED (vend_id);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    7、设置外键

    设置数据库中某字段的外键:

    ALTER TABLE OrderItems ADD
    CONSTRAINT FK_OrderItems_Orders FOREIGN KEY (order_num) REFERENCES Orders (order_num),
    CONSTRAINT FK_OrderItems_Products FOREIGN KEY (prod_id) REFERENCES Products (prod_id);
    ALTER TABLE Orders ADD 
    CONSTRAINT FK_Orders_Customers FOREIGN KEY (cust_id) REFERENCES Customers (cust_id);
    ALTER TABLE Products ADD
    CONSTRAINT FK_Products_Vendors FOREIGN KEY (vend_id) REFERENCES Vendors (vend_id);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    8、表的关系图

    请添加图片描述

    三、在表中添加数据

    (1)Customers 表:

    INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
    VALUES('1000000001', 'Village Toys', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'John Smith', 'sales@villagetoys.com');
    INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
    VALUES('1000000002', 'Kids Place', '333 South Lake Drive', 'Columbus', 'OH', '43333', 'USA', 'Michelle Green');
    INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
    VALUES('1000000003', 'Fun4All', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'jjones@fun4all.com');
    INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
    VALUES('1000000004', 'Fun4All', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Denise L. Stephens', 'dstephens@fun4all.com');
    INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
    VALUES('1000000005', 'The Toy Store', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'Kim Howard');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Customers表数据:

    请添加图片描述

    (2)Vendors 表:

    INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES('BRS01','Bears R Us','123 Main Street','Bear Town','MI','44444', 'USA');
    INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES('BRE02','Bear Emporium','500 Park Street','Anytown','OH','44333', 'USA');
    INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES('DLL01','Doll House Inc.','555 High Street','Dollsville','CA','99999', 'USA');
    INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES('FRB01','Furball Inc.','1000 5th Avenue','New York','NY','11111', 'USA');
    INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES('FNG01','Fun and Games','42 Galaxy Road','London', NULL,'N16 6PS', 'England');
    INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES('JTS01','Jouets et ours','1 Rue Amusement','Paris', NULL,'45678', 'France');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Vendors表数据:

    请添加图片描述

    (3)Products 表:

    INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('BR01', 'BRS01', '8 inch teddy bear', 5.99, '8 inch teddy bear, comes with cap and jacket');
    INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('BR02', 'BRS01', '12 inch teddy bear', 8.99, '12 inch teddy bear, comes with cap and jacket');
    INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('BR03', 'BRS01', '18 inch teddy bear', 11.99, '18 inch teddy bear, comes with cap and jacket');
    INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('BNBG01', 'DLL01', 'Fish bean bag toy', 3.49, 'Fish bean bag toy, complete with bean bag worms with which to feed it');
    INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('BNBG02', 'DLL01', 'Bird bean bag toy', 3.49, 'Bird bean bag toy, eggs are not included');
    INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('BNBG03', 'DLL01', 'Rabbit bean bag toy', 3.49, 'Rabbit bean bag toy, comes with bean bag carrots');
    INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('RGAN01', 'DLL01', 'Raggedy Ann', 4.99, '18 inch Raggedy Ann doll');
    INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('RYL01', 'FNG01', 'King doll', 9.49, '12 inch king doll with royal garments and crown');
    INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('RYL02', 'FNG01', 'Queen doll', 9.49, '12 inch queen doll with royal garments and crown');
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    Products 表的数据:

    请添加图片描述

    (4)Orders 表:

    INSERT INTO Orders(order_num, order_date, cust_id)
    VALUES(20005, '2020-05-01', '1000000001');
    INSERT INTO Orders(order_num, order_date, cust_id)
    VALUES(20006, '2020-01-12', '1000000003');
    INSERT INTO Orders(order_num, order_date, cust_id)
    VALUES(20007, '2020-01-30', '1000000004');
    INSERT INTO Orders(order_num, order_date, cust_id)
    VALUES(20008, '2020-02-03', '1000000005');
    INSERT INTO Orders(order_num, order_date, cust_id)
    VALUES(20009, '2020-02-08', '1000000001');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Orders表数据:

    请添加图片描述

    (5)OrderItems 表:

    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20005, 1, 'BR01', 100, 5.49);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20005, 2, 'BR03', 100, 10.99);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20006, 1, 'BR01', 20, 5.99);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20006, 2, 'BR02', 10, 8.99);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20006, 3, 'BR03', 10, 11.99);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20007, 1, 'BR03', 50, 11.49);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20007, 2, 'BNBG01', 100, 2.99);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20007, 3, 'BNBG02', 100, 2.99);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20007, 4, 'BNBG03', 100, 2.99);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20007, 5, 'RGAN01', 50, 4.49);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20008, 1, 'RGAN01', 5, 4.99);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20008, 2, 'BR03', 5, 11.99);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20008, 3, 'BNBG01', 10, 3.49);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20008, 4, 'BNBG02', 10, 3.49);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20008, 5, 'BNBG03', 10, 3.49);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20009, 1, 'BNBG01', 250, 2.49);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20009, 2, 'BNBG02', 250, 2.49);
    INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20009, 3, 'BNBG03', 250, 2.49);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    OrderItems表数据:

    请添加图片描述

  • 相关阅读:
    PHP留言反馈管理系统源码
    STM32F103的FSMC模块驱动LCD屏幕
    下一代工具链「GitHub 热点速览 v.22.43」
    Go包介绍与初始化:搞清Go程序的执行次序
    Leetcode.712 两个字符串的最小ASCII删除和
    Jenkins之Maven的配置
    每天五分钟深度学习pytorch:训练神经网络模型的基本步骤
    四、卷积、转置卷积(上卷积)大小计算公式
    2023年中国磷酸二铵市场发展概况分析:市场集中度较高[图]
    impdp导出出现ORA-39155、ORA-48128、ORA-19505、ORA-27037错误
  • 原文地址:https://blog.csdn.net/chen1083376511/article/details/134267697