SQL入门笔记(中)

主要内容:查询、联结、表与行列的增删

  • 子查询
#类似于SELECT语句在IN中的嵌套,功能是查询某表某列和另表某列的关联
#在WHERE語句中的嵌套,可以被联结代替
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
                    FROM OrderItems
                    WHERE prod_id = 'RGAN01'); 
/*先从OrderItems表查询RGAN01产品相关的订单编号,再从Order表中查询这些订单编号对应的顾客编号*/
/*注意事项:子查询的SELECT语句只能查询单列*/
#在SELECT首句中的嵌套
SELECT cust_name,
       cust_state,
       (SELECT COUNT(*)
        FROM Orders
        WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;
/*COUNT()对Orders表的orders列进行计数,并通过AS代替了orders列。子查询中,COUNT()表示的是Orders表中的某个cust_id对应Customers中多少个相同项。*/
  • 内联结
#己见:所有信息汇总到一张表会造成信息赘余,可分主体造子表,每个子表都包含了各主体下各项的详情
#创建联结,一次性查询两张表的多列数据
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id -- 将供应商表中的供应商id和产品表中的联结起来
#另一种表达方式
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products -- 供应商表“内联结”产品表
 ON Vendors.vend_id = Products.vend_id; -- 用ON不用HWERE
#多表联结
SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
  AND OrderItems.prod_id = Vendors.vend_id
  AND order_num = 20007; -- 供应商表联结产品表,产品表联结订单项目表,然后加一个限制条件
  • 其他联结方式
#自联结
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM Customers AS c1, Customers AS c2 -- 给表格起别名
WHERE c2.cust_contact = 'Jim Jones' -- 设置c2表只有contact为Jim Jone的记录
  AND c2.cust_name = c1.cust_name; -- c1和c2(相同的表)相联结,因为联结凭据是cust_name,所以调出的c1记录全是Jim Jone所在顾客公司的记录。
#自然联结(结果不会有重复项)
SELECT C.*, O.order_num, O.order_date, OI.prod_id, OI.quantity, OI.item_price
FROM Customers AS C, Orders AS O, OrderItems AS OI
 AND OI.order_num = O.order_num
 AND prod_id = 'RGAN01';
/*对于其中一个表采用SELECT *即可,其他表的列依旧使用明确的子集来完成。一般内联结都是自然联结*/
#外联结
SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders -- 外联结。LEFT表示从左表选择cust_id所有项,此外联结表示顾客表中所有顾客及其订单情况。换成RIGHT,从右表选择cust_id所有项;换成FULL,从两表的cust_id列中找合集的所有项。
 ON Customers.cust_id = Orders.cust_id;
---
FROM Customers INNER JOIN Orders -- 内联结。从两表的cust_id列中找交集的所有项。
 ON Customers.cust_id = Orders.cust_id;
#联结两表,顺便数据透视
SELECT Customers.cust_id,
       COUNT(Orders.order_num) AS num_ord
FROM Customers INNER Orders
 ON Customers.cust_id = Orders.cust_id -- 内联结。也可换成其他形式。
GROUP BY Customers.cust_id;
  • 复合查询
#多条SELECT语句合并在一起,查询结果会纵向合并成一个结果输出
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION -- 使用UNION时,所有重复行都会被删去;若要保留,则用UNION ALL。
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All'
ORDER BY cust_name, cust_contact;
/*以上可表达为一个SELECT语句,用OR把两个WHERE条件组合*/
  • 插入(行)数据
#注:需要有特定安全权限
#插入完整行
INSERT INTO Customers(cust_id,
                      cust_name,
                      cust_address,
                      cust_city,
                      cust_state,
                      cust_zip,
                      cust_country,
                      cust_contact,
                      cust_email) -- 往Customers表中插入一行,括号内为列标题,这个括号可以删,内部顺序可调序
VALUES('100000000006',
       'Toy Land',
       'New York',
       'NY',
       '1111',
       'USA',
       NULL,
       NULL); -- 依据列标题的顺序匹配新添的值

#插入部分行
/*省略第一个括号中的cust_contact和cust_email和第二个括号中的两个NULL,即是插入部分*/
#已有表一,将表二的被筛选结果搬至表一
INSERT INTO Customers(cust_id,
                      cust_contact,
                      cust_email,
                      cust_name,
                      cust_addresss,
                      cust_city,
                      cust_state,
                      cust_zip,
                      cust_country)
SELECT cust_id,
       cust_contact,
       cust_email,
       cust_name,
       cust_address,
       cust_city,
       cust_state,
       cust_zip,
       cust_country
FROM CustNew
WHERE cust_city = 'NY'; -- 从CustNew表SELECT并筛选出来的数据,插入到Customers表中

#创建一个新表,把老表数据全部搬至新表
SELECT * -- 也可以明确列
INTO CustCpoy
FROM Customers;

#联结多张老表,筛选数据创建新表
SELECT cust_id, prod_price, prod_id
INTO CustCopy
FROM Customers AS C, Products AS P
WHERE C.cust_id = P.cust_id;
  • 篡改和删除(行)数据
#篡改数据
UPDATE Customers
SET cust_email = 'lianpeiwei19970317@gmail.com' -- feel free to contact me if you have any question
    cust_contact = 'Peiwei Lian'
    cust_country = NULL
WHERE cust_id = '100000000005'; -- 更新该编号的顾客公司的邮箱地址和联系人,并删去该公司所在国家信息,设为NULL

#删除行
DELETE FROM Customers
WHERE cust_id = '100000000006';
  • 创建和删除表+增删列数据
#创建表
CREATE TABLE Products
(
  prod_id     CHAR(10)       NOT NULL, 
#CHAR(10)表示强制10位的字符数据格式
  vend_id     CHAR(10)       NOT NULL     DEFAULT '0000001',
#默认值设置为‘0000001’,如果缺值就显示该值
  order_time  DATETIME       NOT NULL     DEFAULT GETDATE(),
#DATETIME表示日期格式,默认值设置为系统日期
  prod_name   CHAR(254)      NOT NULL,
  prod_price  DECIMAL(8,2)   NOT NULL, 
#DECIMAL(8,2)表示8位整数+2位小数的数值数据格式
  prod_desc   VARCHAR(1000)  NULL 
#VARCHAR(1000)表示非强制但需小于等于1000位的字符数据格式;NULL表示允许该列没有值或缺值,NULL可以不写,因为是默认设置
);
/*其他常见数据格式:INTEGER整数 DATETIME日期格式;注:允许NULL值的列不能作为主键*/
#删除表
DROP TABLE Products
#重命名表
SQL Server用sp_rename命令[也可以直接在软件上修改]


#更新表
#增加列
ALTER TABLE Vendors -- 更新的表叫做Vendors
ADD vend_phone CHAR(20); -- 所有的DBMS都支持的操作,增加格式为CHAR(20)的vend_phone列
#删除列
ALTER TABLE Vendors
DROP COLUMN vend_phone;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容