SQL组队学习DAY3

SELECT * FROM products;
CREATE TABLE shop_product
(shop_id    CHAR(4)       NOT NULL,
 shop_name  VARCHAR(200)  NOT NULL,
 product_id CHAR(4)       NOT NULL,
 quantity   INTEGER       NOT NULL,
 PRIMARY KEY (shop_id, product_id));

INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000A',	'东京',		'0001',	30);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000A',	'东京',		'0002',	50);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000A',	'东京',		'0003',	15);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000B',	'名古屋',	'0002',	30);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000B',	'名古屋',	'0003',	120);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000B',	'名古屋',	'0004',	20);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000B',	'名古屋',	'0006',	10);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000B',	'名古屋',	'0007',	40);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000C',	'大阪',		'0003',	20);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000C',	'大阪',		'0004',	50);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000C',	'大阪',		'0006',	90);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000C',	'大阪',		'0007',	70);
INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000D',	'福冈',		'0001',	100);

DROP VIEW productsum;
CREATE VIEW productsum(product_type, count_product)
AS
SELECT product_type,count(*)
FROM products
GROUP BY product_type;
SELECT * FROM productsum;

CREATE VIEW view_shop_product(product_type, sale_price, shop_name)
AS
SELECT product_type, sale_price, shop_name
FROM products, shop_product
WHERE products.product_id = shop_product.product_id;

SELECT * FROM view_shop_product;

SELECT product_type, cnt_product
FROM(
SELECT *
FROM (SELECT product_type, count(*) AS cnt_product
FROM products
GROUP BY product_type) AS product_sum
WHERE cnt_product = 4) AS product_sum2;

# 标量子查询,返回一个结果,一行或一列
SELECT product_id, product_name, sale_price, (SELECT avg(sale_price) FROM products) AS avg_sale_price
FROM products;
SELECT product_id, product_name, sale_price
FROM products
WHERE sale_price > (SELECT avg(sale_price) FROM products);

# 关联子查询
SELECT product_type, product_name, sale_price
FROM products AS P1
WHERE sale_price > (SELECT avg(sale_price) 
					FROM products AS P2
                    WHERE P1.product_type = P2.product_type
                    GROUP BY product_type);

# 练习
CREATE VIEW Viewpractice 
AS 
SELECT product_name, sale_price, regist_date
FROM products
WHERE sale_price >= 1000 AND regist_date = "2009-09-20";
SELECT * FROM Viewpractice;

INSERT INTO Viewpractice VALUES ("刀子", 300 ,"2009-11-02");  # 会报错,
SELECT * FROM products;  # product_id, product_name,product_type 设置了非空限制
# 通过视图插入数据也会向原表中插入数据,因此必须将非空字段都补齐;  但是,在试图只定义了三个字段,其他字段无法插入,导致原表中的数据无法被插入。这也是尽量避免通过视图修改数据的原因之一
INSERT INTO Viewpractice VALUES ('0009', "刀子", "办公用品", 300, NULL, "2009-11-02");  # 报错字段数不匹配,因为视图中只有三列

SELECT product_id, product_name, product_type, sale_price, (SELECT AVG(sale_price) FROM products) AS sale_price_avg
FROM products AS p1;

SELECT product_id, product_name, product_type, sale_price, (SELECT AVG(sale_price) FROM products AS p2
															WHERE p1.product_type = p2.product_type
															GROUP BY product_type) AS sale_price_avg_type
FROM products AS p1;

-- WHERE sale_price = (SELECT sale_price FROM products AS p2
-- 					 WHERE p1.product_type = p2.product_type
--                      GROUP BY product_type);

USE shop;
DROP TABLE IF EXISTS samplemath;
CREATE TABLE samplemath
(m NUMERIC(10,3),
 n INT,
 p INT);
 
START TRANSACTION; -- 开始事务
INSERT INTO samplemath(m, n, p) VALUES (500, 0, NULL);
INSERT INTO samplemath(m, n, p) VALUES (-180, 0, NULL);
INSERT INTO samplemath(m, n, p) VALUES (NULL, NULL, NULL);
INSERT INTO samplemath(m, n, p) VALUES (NULL, 7, 3);
INSERT INTO samplemath(m, n, p) VALUES (NULL, 5, 2);
INSERT INTO samplemath(m, n, p) VALUES (NULL, 4, NULL);
INSERT INTO samplemath(m, n, p) VALUES (8, NULL, 3);
INSERT INTO samplemath(m, n, p) VALUES (2.27, 1, NULL);
INSERT INTO samplemath(m, n, p) VALUES (5.555,2, NULL);
INSERT INTO samplemath(m, n, p) VALUES (NULL, 1, NULL);
INSERT INTO samplemath(m, n, p) VALUES (8.76, NULL, NULL);
COMMIT;

SELECT * FROM samplemath;
SELECT m, ABS(m) as abs_col, n, p, mod(n,p) as mod_col, round(m,2) as round_col
FROM samplemath;

# 创建一个新的工作表用于文本函数
USE  shop;
DROP TABLE IF EXISTS samplestr;
CREATE TABLE samplestr
(str1 VARCHAR (40),
str2 VARCHAR (40),
str3 VARCHAR (40)
);
-- DML:插入数据
START TRANSACTION;
INSERT INTO samplestr (str1, str2, str3) VALUES ('opx',	'rt', NULL);
INSERT INTO samplestr (str1, str2, str3) VALUES ('abc', 'def', NULL);
INSERT INTO samplestr (str1, str2, str3) VALUES ('太阳',	'月亮', '火星');
INSERT INTO samplestr (str1, str2, str3) VALUES ('aaa',	NULL, NULL);
INSERT INTO samplestr (str1, str2, str3) VALUES (NULL, 'xyz', NULL);
INSERT INTO samplestr (str1, str2, str3) VALUES ('@!#$%', NULL, NULL);
INSERT INTO samplestr (str1, str2, str3) VALUES ('ABC', NULL, NULL);
INSERT INTO samplestr (str1, str2, str3) VALUES ('aBC', NULL, NULL);
INSERT INTO samplestr (str1, str2, str3) VALUES ('abc哈哈',  'abc', 'ABC');
INSERT INTO samplestr (str1, str2, str3) VALUES ('abcdefabc', 'abc', 'ABC');
INSERT INTO samplestr (str1, str2, str3) VALUES ('micmic', 'i', 'I');
COMMIT;
-- 确认表中的内容
SELECT * FROM samplestr;
-- concat拼接函数,substring 字符串截取,replace(a,b,c):将a中的b字符串替换为c
SELECT str1, str2, str3, CONCAT(str1, str2, str3) AS concat_str,
LENGTH(str1) AS len_str1,
LOWER(str1) AS lower_str,
REPLACE(str1, str2, str3) AS rep_str,
SUBSTRING(str1 FROM 3 FOR 2) AS sub_str  # substring(a from b for c):将a字符串从第b个字符开始截取c个字符
FROM samplestr;
 # 按照索引截取substring_index
SELECT SUBSTRING_INDEX("WWW.SQL.COM", ".", 2);
SELECT SUBSTRING_INDEX("WWW.SQL.COM",".", -2);
# 获取中间字段
SELECT SUBSTRING("WWW.SQL.COM" FROM 5 FOR 3);   # 局限性很大,不适用
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX("WWW.SQL.COM", ".", 2), ".", -1);
# 重复函数 repeat
-- SELECT REPEAT("CAT*", 3);

# 日期函数
SELECT CURRENT_DATE;
SELECT CURRENT_TIME;
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP AS now, 
EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AS year,
EXTRACT(MONTH FROM CURRENT_TIMESTAMP) AS month,
EXTRACT(DAY FROM CURRENT_TIMESTAMP) AS day;

# 转化函数:cast, COALESCE 
SELECT CAST(-1.222 as SIGNED INTEGER) AS int_col, CAST("2001-01-11" AS DATE) AS date_col;
SELECT COALESCE(NULL, 11) as col_1, COALESCE(NULL, "CAT", NULL) AS col_2, COALESCE(NULL, NULL, NULL, "bba", "DDA")as col_3;
-- 该函数会返回可变参数 A 中左侧开始第 1个不是NULL的值

# 谓词,返回值为真值(TRUE, FALSE, UNKNOWN)的函数
-- DDL :创建表
CREATE TABLE samplelike
( strcol VARCHAR(6) NOT NULL,
  PRIMARY KEY (strcol)
);
-- DML :插入数据
START TRANSACTION; -- 开始事务
INSERT INTO samplelike (strcol) VALUES ('abcddd');
INSERT INTO samplelike (strcol) VALUES ('dddabc');
INSERT INTO samplelike (strcol) VALUES ('abdddc');
INSERT INTO samplelike (strcol) VALUES ('abcdd');
INSERT INTO samplelike (strcol) VALUES ('ddabc');
INSERT INTO samplelike (strcol) VALUES ('abddc');
COMMIT; -- 提交事务
SELECT * FROM samplelike;

# LIKE:用于查找部分相同的字符串
SELECT * 
FROM samplelike
WHERE strcol LIKE "ddd%";  -- %表示0个或多个任意字符串,_代表一个字符
SELECT * FROM samplelike
WHERE strcol LIKE "%ddd%";
# 范围查询:between
SELECT product_name, sale_price
FROM products 
WHERE sale_price BETWEEN 500 AND 5000; # 闭区间
# is null, is not null 
SELECT product_name, purchase_price
FROM products
WHERE purchase_price is null;
# in: 多个or的结合体, not in:in的反面
SELECT product_name, purchase_price
FROM products
WHERE purchase_price IN (500,1000,5000);

-- DDL :创建表
DROP TABLE IF EXISTS shopproduct;
CREATE TABLE shopproduct
(  shop_id CHAR(4)      NOT NULL,
 shop_name VARCHAR(200) NOT NULL,
product_id CHAR(4)      NOT NULL,
  quantity INTEGER      NOT NULL,
PRIMARY KEY (shop_id, product_id) -- 指定主键
);
-- DML :插入数据
START TRANSACTION; -- 开始事务
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '0001', 30);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '0002', 50);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '0003', 15);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0002', 30);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0003', 120);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0004', 20);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0006', 10);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0007', 40);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0003', 20);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0004', 50);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0006', 90);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0007', 70);
INSERT INTO shopproduct (shop_id, shop_name, product_id, quantity) VALUES ('000D', '福冈', '0001', 100);
COMMIT; -- 提交事务
SELECT * FROM shopproduct;
# 谓词in和子查询
SELECT product_name, sale_price 
FROM products
WHERE product_id IN (SELECT product_id 
					 FROM shopproduct
					 WHERE shop_id = "000C");
# 查找不在东京销售过的商品的售价
SELECT product_name, sale_price
FROM products
WHERE product_id NOT IN (SELECT product_id FROM shopproduct WHERE shop_id = "000A");
#谓词exists
-- 选取出大阪门店在售商品的销售单价
SELECT product_name, sale_price
FROM products AS p
WHERE EXISTS (SELECT *
			  FROM shopproduct AS s
			  WHERE s.shop_id = "000C" and s.product_id = p.product_id);
-- EXIST 通常会使用关联子查询作为参数。
SELECT product_name, sale_price
FROM products AS p
WHERE NOT EXISTS (SELECT * FROM shopproduct AS s
				  WHERE s.product_id = p.product_id AND s.shop_id = "000A");
                  
# case表达式:条件分支
SELECT product_name, 
	   CASE WHEN product_type = "衣服" then concat("A:",product_type)
			when product_type = "办公用品" then concat("B:",product_type)
			when product_type = "厨房用具" then concat("C:",product_type)
			ELSE NULL
	   END AS abc_product_type
FROM products;
-- 行方向的聚合  
SELECT product_type, sum(sale_price) AS sum_sale_price
FROM products
GROUP BY product_type;
-- 列方向的聚合
SELECT 
	   sum(CASE WHEN product_type = "衣服" then sale_price else 0 end) AS sum_clothes_price,
	   sum(case when product_type = "办公用品" then sale_price else 0 end) AS sum_price_office,
	   sum(case when product_type = "厨房用具" then sale_prie else 0 end) AS sum_price_kitchen
FROM products;


# 练习
-- 不一定
SELECT purchase_price FROM products;
SELECT sum(purchase_price) FROM products; # 含有空值可以进行求和运算
SELECT mod(purchase_price, 100) FROM products;

SELECT product_name, purchase_price
FROM products
WHERE purchase_price NOT IN (500, 2800, 5000);

SELECT product_name, purchase_price
FROM products
WHERE purchase_price NOT IN (500, 2800, 5000, NULL);
-- 没有任何结果返回,全空
-- 原因:null不能参与比较运算符,即与任何数据比较结果都为null;
-- NOT IN (500, 2800, 5000, NULL)相当于purchase_prise<>500 and <>2800 and <>5000 and <>null 
-- <>null 返回null, 任何表达式 and null,结果都为null,判定条件不成立,查询不出来数据。
-- not in后面不要跟null

SELECT 
COUNT(CASE WHEN sale_price <=1000 THEN product_id ELSE NULL END) AS low_price,
COUNT(CASE WHEN sale_price BETWEEN 1001 AND 3000 THEN product_id ELSE NULL END) AS mid_price,
COUNT(CASE WHEN sale_price > 3000 THEN product_id ELSE NULL END) AS high_price
FROM products;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值