########################################
# MySQL Crash Course
# http://www.forta.com/books/0672327120/
# Example table population scripts
########################################
##########################
# Populate customers table
##########################
INSERTINTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10001, 'Coyote Inc.', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'Y Lee', 'ylee@coyote.com');
INSERTINTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
VALUES(10002, 'Mouse House', '333 Fromage Lane', 'Columbus', 'OH', '43333', 'USA', 'Jerry Mouse');
INSERTINTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10003, 'Wascals', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'rabbit@wascally.com');
INSERTINTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10004, 'Yosemite Place', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Y Sam', 'sam@yosemite.com');
INSERTINTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
VALUES(10005, 'E Fudd', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'E Fudd');
########################
# Populate vendors table
########################
INSERTINTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1001,'Anvils R Us','123 Main Street','Southfield','MI','48075', 'USA');
INSERTINTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1002,'LT Supplies','500 Park Street','Anytown','OH','44333', 'USA');
INSERTINTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1003,'ACME','555 High Street','Los Angeles','CA','90046', 'USA');
INSERTINTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1004,'Furball Inc.','1000 5th Avenue','New York','NY','11111', 'USA');
INSERTINTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1005,'Jet Set','42 Galaxy Road','London', NULL,'N16 6PS', 'England');
INSERTINTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1006,'Jouets Et Ours','1 Rue Amusement','Paris', NULL,'45678', 'France');
#########################
# Populate products table
#########################
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV01', 1001, '.5 ton anvil', 5.99, '.5 ton anvil, black, complete with handy hook');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV02', 1001, '1 ton anvil', 9.99, '1 ton anvil, black, complete with handy hook and carrying case');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV03', 1001, '2 ton anvil', 14.99, '2 ton anvil, black, complete with handy hook and carrying case');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('OL1', 1002, 'Oil can', 8.99, 'Oil can, red');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FU1', 1002, 'Fuses', 3.42, '1 dozen, extra long');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('SLING', 1003, 'Sling', 4.49, 'Sling, one size fits all');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('TNT1', 1003, 'TNT (1 stick)', 2.50, 'TNT, red, single stick');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('TNT2', 1003, 'TNT (5 sticks)', 10, 'TNT, red, pack of 10 sticks');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FB', 1003, 'Bird seed', 10, 'Large bag (suitable for road runners)');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FC', 1003, 'Carrots', 2.50, 'Carrots (rabbit hunting season only)');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('SAFE', 1003, 'Safe', 50, 'Safe with combination lock');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('DTNTR', 1003, 'Detonator', 13, 'Detonator (plunger powered), fuses not included');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('JP1000', 1005, 'JetPack 1000', 35, 'JetPack 1000, intended for single use');
INSERTINTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('JP2000', 1005, 'JetPack 2000', 55, 'JetPack 2000, multi-use');
#######################
# Populate orders table
#######################
INSERTINTO orders(order_num, order_date, cust_id)
VALUES(20005, '2005-09-01', 10001);
INSERTINTO orders(order_num, order_date, cust_id)
VALUES(20006, '2005-09-12', 10003);
INSERTINTO orders(order_num, order_date, cust_id)
VALUES(20007, '2005-09-30', 10004);
INSERTINTO orders(order_num, order_date, cust_id)
VALUES(20008, '2005-10-03', 10005);
INSERTINTO orders(order_num, order_date, cust_id)
VALUES(20009, '2005-10-08', 10001);
###########################
# Populate orderitems table
###########################
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 1, 'ANV01', 10, 5.99);
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 2, 'ANV02', 3, 9.99);
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 3, 'TNT2', 5, 10);
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 4, 'FB', 1, 10);
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20006, 1, 'JP2000', 1, 55);
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20007, 1, 'TNT2', 100, 10);
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20008, 1, 'FC', 50, 2.50);
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 1, 'FB', 1, 10);
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 2, 'OL1', 1, 8.99);
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 3, 'SLING', 1, 4.49);
INSERTINTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 4, 'ANV03', 1, 14.99);
#############################
# Populate productnotes table
#############################
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(101, 'TNT2', '2005-08-17',
'Customer complaint:
Sticks not individually wrapped, too easy to mistakenly detonate all at once.
Recommend individual wrapping.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(102, 'OL1', '2005-08-18',
'Can shipped full, refills not available.
Need to order new can if refill needed.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(103, 'SAFE', '2005-08-18',
'Safe is combination locked, combination not provided with safe.
This is rarely a problem as safes are typically blown up or dropped by customers.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(104, 'FC', '2005-08-19',
'Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(105, 'TNT2', '2005-08-20',
'Included fuses are short and have been known to detonate too quickly for some customers.
Longer fuses are available (item FU1) and should be recommended.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(106, 'TNT2', '2005-08-22',
'Matches not included, recommend purchase of matches or detonator (item DTNTR).'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(107, 'SAFE', '2005-08-23',
'Please note that no returns will be accepted if safe opened using explosives.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(108, 'ANV01', '2005-08-25',
'Multiple customer returns, anvils failing to drop fast enough or falling backwards on purchaser. Recommend that customer considers using heavier anvils.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(109, 'ANV03', '2005-09-01',
'Item is extremely heavy. Designed for dropping, not recommended for use with slings, ropes, pulleys, or tightropes.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(110, 'FC', '2005-09-01',
'Customer complaint: rabbit has been able to detect trap, food apparently less effective now.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(111, 'SLING', '2005-09-02',
'Shipped unassembled, requires common tools (including oversized hammer).'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(112, 'SAFE', '2005-09-02',
'Customer complaint:
Circular hole in safe floor can apparently be easily cut with handsaw.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(113, 'ANV01', '2005-09-05',
'Customer complaint:
Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead.'
);
INSERTINTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(114, 'SAFE', '2005-09-07',
'Call from individual trapped in safe plummeting to the ground, suggests an escape hatch be added.
Comment forwarded to vendor.'
);
显示信息
# 显示所有表
SHOW TABLES;
# 显示表的列信息
SHOW COLUMNS FROM customers;
DESCRIBE customers;
DESC customers;
# 显示广泛的服务器状态信息
SHOW STATUS;
# 显示授予用户的安全权限
SHOW GRANTS;
# 显示服务器错误
SHOW ERRORS;
# 显示服务器警告
SHOW WARNINGS;
第4章 检索数据
# 检索单个列
SELECT prod_name
FROM products;
# 检索多个列
SELECT prod_id, prod_name, prod_price
FROM products;
# 检索所有列
SELECT*FROM products;
# 检索不同的行
SELECT vend_id
FROM products;
# 使用 DISTINCT 关键字
SELECTDISTINCT vend_id
FROM products;
# 限制结果
# LIMIT rowCount;
SELECT prod_name
FROM products
LIMIT 5;
# LIMIT startIndex, rowCount;
SELECT prod_name
FROM products
LIMIT 3,4;
# 与上面同义
SELECT prod_name
FROM products
LIMIT 4OFFSET3;
# 使用完全限定的表名和列名
SELECT products.prod_name
FROM crashcourse.products;
# 使用 WHERE 子句
SELECT prod_name, prod_price
FROM products
WHERE prod_price=2.50;
# WHERE子句操作符
# = 等于
# <> 不等于
# != 不等于
# < 小于
# <= 小于等于
# > 大于
# >= 大于等于
# BETWEEN 在指定的两个值之间
# 检查单个值
SELECT prod_name, prod_price
FROM products
WHERE prod_name ='fuses';
SELECT prod_name, prod_price
FROM products
WHERE prod_price <10;
SELECT prod_name, prod_price
FROM products
WHERE prod_price >=10;
# 不匹配检查
SELECT vend_id, prod_name
FROM products
WHERE vend_id <>1003;
SELECT vend_id, prod_name
FROM products
WHERE vend_id !=1003;
# 范围值检查
SELECT prod_name, prod_price
FROM products
WHERE prod_price BETWEEN5AND10;
# 空值检查
SELECT prod_name
FROM products
SELECT cust_id
FROM customers
WHERE cust_email ISNULL;
第7章 数据过滤
# 组合 WHERE 子句
SELECT prod_id, prod_price, prod_name
FROM products
WHERE vend_id =1003AND prod_price <=10;
# OR 操作符
SELECT vend_id, prod_name, prod_price
FROM products
WHERE vend_id =1002OR vend_id =1003;
SELECT vend_id, prod_name, prod_price
FROM products
WHERE vend_id =1002OR vend_id =1003AND prod_price >=10;
SELECT vend_id, prod_name, prod_price
FROM products
WHERE (vend_id =1002OR vend_id =1003) AND prod_price >=10;
# IN 操作符
SELECT vend_id, prod_name, prod_price
FROM products
WHERE vend_id IN (1002, 1003, 1004, 1005)
ORDERBY vend_id DESC;
# NOT 操作符
SELECT vend_id, prod_name, prod_price
FROM products
WHERE vend_id NOTIN (1002, 1003, 1004, 1005)
ORDERBY vend_id DESC;
第8章 用通配符进行过滤
# LIKE 操作符
# % 通配符 匹配任意字符任意次数
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE'jet%';
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE'%anvil%';
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE'%an%l%';
# _ 通配符 匹配一个字符
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE'_ ton anvil';
第9章 用正则表达式进行搜索
# 使用 REGEXP 关键字
# 基本字符匹配
# LIKE 与 REGEXP 的区别
# LIKE 匹配整个列,REGEXP 在列值中进行匹配
SELECT prod_name
FROM products
WHERE prod_name LIKE'1000'ORDERBY prod_name;
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'ORDERBY prod_name;
# . 匹配任意一个字符
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'ORDERBY prod_name;
# 进行 OR 匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'ORDERBY prod_name;
# 匹配几个字符之一,[123]表示匹配1或2或3SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] ton'ORDERBY prod_name;
# 1或2或3 ton
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1|2|3 ton'ORDERBY prod_name;
# 非123SELECT prod_name
FROM products
WHERE prod_name REGEXP '[^123] ton'ORDERBY prod_name;
# 匹配范围
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] ton'ORDERBY prod_name;
# 匹配特殊字符
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.'ORDERBY prod_name;
# 使用 \\ 转义
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\.'ORDERBY prod_name;
# 匹配字符类
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[:upper:]'ORDERBY prod_name;
# 匹配多个实例
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'ORDERBY prod_name;
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[:digit:]{4}'ORDERBY prod_name;
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]'ORDERBY prod_name;
# 定位符
# ^ 文本开头
# $ 文本结尾
# [[:<:]] 词的开头
# [[:>:]] 词的结尾
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'ORDERBY prod_name;
# 简单测试正则表达式
SELECT'hello' REGEXP '[0-9]';
第10章 创建计算字段
# 拼接字段
# concat
SELECT CONCAT(vend_name, '(', vend_country, ')')
FROM vendors
ORDERBY vend_name;
# RTRIM(str) 删除数据右侧多余的空格
SELECT CONCAT(RTRIM(vend_name), '(', RTRIM(vend_country), ')')
FROM vendors
ORDERBY vend_name;
# 使用别名
SELECT CONCAT(RTRIM(vend_name), '(', RTRIM(vend_country), ')') AS vend_title
FROM vendors
ORDERBY vend_name;
# 执行算数计算
SELECT prod_id, quantity, item_price
FROM orderitems
WHERE order_num =20005;
SELECT prod_id, quantity, item_price, quantity * item_price AS expanded_price
FROM orderitems
WHERE order_num =20005;
# 查看时间
SELECT NOW();
第11章 使用数据处理函数
# 文本处理函数
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase
FROM vendors
ORDERBY vend_name;
# SOUNDEX(str) 匹配所有发音类似的
SELECT cust_name, cust_contact
FROM customers
WHERE cust_contact ='Y Lie';
SELECT cust_name, cust_contact
FROM customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Y Lie');
# 日期和时间处理函数
SELECT cust_id, order_num, order_date
FROM orders
WHEREDATE(order_date) BETWEEN'2005-09-01'AND'2005-09-30';
SELECT cust_id, order_num, order_date
FROM orders
WHEREYEAR(order_date) =2005ANDMONTH(order_date) =9;
# 数值处理函数
SELECT PI();
SELECTABS(-3.4);
第12章 汇总数据
# 聚集函数
# avg()
SELECTAVG(prod_price) as avg_price
FROM products;
# count()
SELECTCOUNT(*) AS num_cust
FROM customers;
# max()
SELECTMAX(prod_price) as max_price
FROM products;
# min()
SELECTMIN(prod_price) as min_price
FROM products;
# sum()
SELECTSUM(quantity) AS items_ordered
FROM orderitems
WHERE order_num =20005;
SELECTSUM(item_price*quantity) AS total_price
FROM orderitems
WHERE order_num =20005;
# 聚集不同值
SELECTAVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id =1003;
# 组合聚集函数
SELECTCOUNT(*) as num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM products;
第13章 分组数据
# 数据分组
SELECTCOUNT(*) AS num_prods
FROM products
WHERE vend_id =1003;
# 创建分组
SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUPBY vend_id;
SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUPBY vend_id WITHROLLUP;
# 过滤分组
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUPBY cust_id
HAVINGCOUNT(*) >=2;
SELECT vend_id, COUNT(*) AS num_prods
FROM products
WHERE prod_price >=10GROUPBY vend_id
HAVINGCOUNT(*) >=2;
SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUPBY vend_id
HAVINGCOUNT(*) >=2;
# 分组与排序
SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUPBY order_num
HAVINGSUM(quantity*item_price) >=50;
SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUPBY order_num
HAVINGSUM(quantity*item_price) >=50ORDERBY ordertotal;
第14章 使用子查询
SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id ='TNT2');
# 多重嵌套
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id ='TNT2'));
SELECT cust_name,
cust_state,
(SELECTCOUNT(*)
FROM orders
WHERE orders.cust_id = customers.cust_id) AS order_count
FROM customers
ORDERBY cust_name;
SELECT cust_name,
cust_state,
(SELECTCOUNT(*)
FROM orders
WHERE cust_id = cust_id) AS order_count
FROM customers
ORDERBY cust_name;
第15章 联结表
# 创建联结
SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDERBY vend_name, prod_name;
# 没有联结条件的表关系返回的结果为笛卡尔积
SELECT vend_name, prod_name, prod_price
FROM vendors, products
ORDERBY vend_name, prod_name;
# 内部联结
SELECT vend_name, prod_name, prod_price
FROM vendors INNERJOIN products
ON vendors.vend_id = products.vend_id;
# 联结多个表
SELECT prod_name, vend_name, prod_price, quantity
FROM orderitems, products, vendors
WHERE products.vend_id = vendors.vend_id
AND orderitems.prod_id = products.prod_id
AND order_num =20005;
第16章 创建高级联结
# 使用不同类型的联结
# 自联结
SELECT prod_id, prod_name
FROM products
WHERE vend_id = (
SELECT vend_id
FROM products
WHERE prod_id ='DTNTR');
SELECT p1.prod_id, p1.prod_name
FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id
AND p2.vend_id ='DTNTR';
# 外部联结
# 左外联结
SELECT customers.cust_id, orders.order_num
FROM customers LEFTOUTERJOIN orders
ON customers.cust_id = orders.cust_id;
# 右外联结
SELECT customers.cust_id, orders.order_num
FROM customers RIGHTOUTERJOIN orders
ON customers.cust_id = orders.cust_id;
# 使用带聚集函数的联结
SELECT customers.cust_name,
customers.cust_id,
COUNT(orders.order_num) AS num_ord
FROM customers INNERJOIN orders
ON customers.cust_id = orders.cust_id
GROUPBY customers.cust_id;
SELECT customers.cust_name,
customers.cust_id,
COUNT(orders.order_num) AS num_ord
FROM customers LEFTJOIN orders
ON customers.cust_id = orders.cust_id
GROUPBY customers.cust_id;
第17章 组合查询
# 使用 UNION 自动删除重复行
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <=5;
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <=5UNIONSELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
# UNIONALL 保留重复行
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <=5UNIONALLSELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
# 对组合查询结果排序
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <=5UNIONSELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002)
ORDERBY vend_id, prod_price;
第18章 全文本搜索
# 使用全文本搜索
# MATCH() 指定被搜索的列
# AGAINST() 指定要使用的搜索表达式
SELECT note_text
FROM productnotes
WHEREMATCH(note_text) AGAINST('rabbit');
# 文本中词靠前的行的等级值比词靠后的行的等级值高
SELECT note_text,
MATCH(note_text) AGAINST('rabbit') AS rank_num
FROM productnotes;
# 使用扩展查询
SELECT note_text
FROM productnotes
WHEREMATCH(note_text) AGAINST('anvils');
SELECT note_text
FROM productnotes
WHEREMATCH(note_text) AGAINST('anvils'WITH QUERY EXPANSION);
# 布尔文本搜索
SELECT note_text
FROM productnotes
WHEREMATCH(note_text) AGAINST('heavy'INBOOLEAN MODE); # 包含 heavy
SELECT note_text
FROM productnotes
WHEREMATCH(note_text) AGAINST('heavy -rope*'INBOOLEAN MODE); # 包含 heavy 但不包含以 rope开头的单词
SELECT note_text
FROM productnotes
WHEREMATCH(note_text) AGAINST('+rabbit +bait'INBOOLEAN MODE); # 包含 rabbit 和 bait
SELECT note_text
FROM productnotes
WHEREMATCH(note_text) AGAINST('"rabbit bait"'INBOOLEAN MODE); # 匹配短语 rabbit bait
SELECT note_text
FROM productnotes
WHEREMATCH(note_text) AGAINST('>rabbit <carrot'INBOOLEAN MODE); # 匹配 rabbit 和 carrot,增加前者等级,降低后者等级
SELECT note_text
FROM productnotes
WHEREMATCH(note_text) AGAINST('>safe +(<conbination)'INBOOLEAN MODE); # 匹配 safe 和 conbination,降低后者等级
# 创建视图 CREATEVIEW view_name
# 删除视图 DROPVIEW view_name
# 查看创建视图 SHOWCREATEVIEW view_name
# 更新视图 先 DROP 再 CREATE 或者 CREATEOR REPLACE VIEW view_name
# 创建视图
CREATEVIEW customerrmaillist ASSELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email ISNOTNULL;
SELECT*FROM customerrmaillist;
# 使用视图计算字段
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num =20005;
CREATEVIEW orderitemsexpanded ASSELECT order_num,
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems;
SELECT*FROM orderitemsexpanded
WHERE order_num =20005;
第23章 使用存储过程
# 创建存储过程
CREATEPROCEDURE productpricing()
BEGINSELECTAVG(prod_price) AS priceaverage
FROM products;
END;
# 调用存储过程
CALL productpricing();
# 删除存储过程
DROPPROCEDURE productpricing;
# 使用参数
CREATEPROCEDURE productpricing(
OUT pl DECIMAL(8,2),
OUT ph DECIMAL(8,2),
out pa decimal(8,2)
)
BEGINSELECTMin(prod_price)
INTO pl
FROM products;
SELECTMAX(prod_price)
INTO ph
FROM products;
SELECTAVG(prod_price)
INTO pa
FROM products;
END;
CALL productpricing(@pricelow, @pricehigh, @priceaverage);
SELECT@pricelow, @pricehigh, @priceaverage;
CREATEPROCEDURE ordertotal(
IN inumber INT,
OUT ototal DECIMAL(8,2)
)
BEGINSELECTSUM(item_price*quantity)
FROM orderitems
WHERE order_num = inumber
INTO ototal;
END;
CALL ordertotal(20005, @total);
SELECT@total;
# 建立智能存储过程
CREATEPROCEDURE ordertotal(
IN onumber INT,
IN taxable boolean,
OUT ototal DECIMAL(8,2)
) COMMENT 'Obtain order total, optionally adding tax'BEGIN-- Declare variable for totalDECLARE total DECIMAL(8,2);
-- Devlare tax percentageDECLARE taxrate INTDEFAULT6;
-- Get the order totalSELECTSUM(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO total;
-- Is this taxable?
IF taxable THEN-- Yes, so add taxrate to the totalSELECT total+(total/100*taxrate) INTO total;
END IF;
-- And finally, save to out variableSELECT total INTO ototal;
END;
CALL ordertotal(20005, 0, @total);
SELECT@total;
CALL ordertotal(20005, 1, @total);
SELECT@total;
# 显示存储过程信息
SHOWCREATEPROCEDURE ordertotal;
SHOWPROCEDURE STATUS like'ordertotal';
第24章 使用游标
CREATEPROCEDURE processorders()
BEGIN-- Declare local variablesDECLARE done booleanDEFAULT0;
DECLARE o INT;
DECLARE t DECIMAL(8,2);
-- Declare the cursorDECLARE ordernumbers CURSORFORSELECT order_num FROM orders;
-- Declare continue handlerDECLARE CONTINUE HANDLER FORSQLSTATE'02000'SET done=1;
-- Create a table to store the resultsCREATETABLE IF NOTEXISTS ordertotals
(order_num INT, total DECIMAL(8,2));
-- Open the cursorOPEN ordernumbers;
-- Loop through all rows
REPEAT
-- Get order numberFETCH ordernumbers INTO o;
-- Get the total for this orderCALL ordertotal(o, 1, t);
-- Insert order and total into ordertotalsINSERTinto ordertotals(order_num, total)
VALUES(o, t);
-- End of loop
UNTIL done END REPEAT;
-- Close the cursorCLOSE ordernumbers;
END;
CALL processorders();
SELECT*FROM ordertotals;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通