-- 检索单个列SELECT prod_name
FROM products;-- 检索多个列SELECT prod_id, prod_name, prod_price
FROM products;-- 检索所有列SELECT*FROM products;-- 检索不同的行SELECT vend_id
FROM products;SELECTDISTINCT vend_id
FROM products;-- 限制结果SELECT prod_name
FROM products
LIMIT5;SELECT prod_name
FROM products
LIMIT5,5;-- 使用完全限定的表名SELECT products.prod_name
FROM products;
第5章 排序检索数据
-- 排序数据SELECT prod_name
FROM products
ORDERBY prod_name;-- 按多个列排序SELECT prod_id, prod_price, prod_name
FROM products
ORDERBY prod price, prod name;-- 指定排序方向SELECT prod_id, prod_price, prod_name
FROM products
ORDERBY prod_price DESC;SELECT prod_id, prod_price, prod_name
FROM products
ORDERBY prod price DESC, prod_name;SELECT prod_price
FROM products
ORDERBY prod_price DESCLIMIT1;
第6章 过滤数据
-- 检查单个值SELECT prod_name, prod_price
FROM products
WHERE prod_price =2.50;SELECT prod_name, prod_price
FROM products
WHERE prod_name ='fuses';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
WHERE prod_price ISNULL;SELECT cust_id
FROM customers
WHERE cust_email ISNULL;
第7章 数据过滤
-- AND操作符SELECT prod_id, prod_price, prod_name
FROM products
WHERE vend_id =1003AND prod_price <=10;-- OR操作符SELECT prod_name, prod_price
FROM products
WHERE vend_id =1002OR vend_id =1003;-- 计算次序SELECT prod_name, prod_price
FROM products
WHERE vend_id =1002OR vend_id =1003AND prod_price >=10;SELECT prod_name, prod_price
FROM products
WHERE(vend_id =1002OR vend_id =1003)AND prod_price >=10;-- IN操作符SELECT prod_name, prod_price
FROM products
WHERE vend_id IN(1002,1003)ORDERBY prod name;SELECT prod_name, prod_price
WHERE vend_id =1002OR vend_id =1003FROM products
ORDERBY prod_name;-- NOT操作符SELECT prod_name, prod_price
FROM products
WHERE vend_id NOTIN(1002,1003)ORDERBY prod_name;
第8章 用通配符进行过滤
-- %通配符SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE'jet%';SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE'%anvi 1%';-- _通配符SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE'_ton anvil';
第9章 用正则表达式进行搜索
-- 基本字符匹配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;-- 匹配几个字符之一SELECT prod_name
FROM products
WHERE prod_name REGEXP'[123] Ton ORDER BY prod_name';SELECT prod_name
FROM products
WHERE prod_name REGEXP'1 | 2 | 3 Ton'ORDERBY prod_name;-- 匹配范围SELECT prod_name
FROM products
WHERE prod_name REGEXP'[1-5] Ton'ORDERBY prod_name;-- 匹配特殊字符SELECT vend_name
FROM vendors
WHERE vend_name REGEXP'.'ORDERBY vend_name;SELECT vend_name
FROM vendors
WHERE vend_name REGEXP'\\.'ORDERBY vend_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;
第10章 创建计算字段
-- 拼接字段SELECT Concat (vend_name,' (',vend_country,')')FROM vendors
ORDERBY vend_name;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, quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num =20005;
第11章 使用数据处理函数
-- 文本处理函数SELECT vend_name, Upper (vend_name)AS vend_name_upcase
FROM vendors
ORDERBY vend_name;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
FROM orders
WHERE order_date ='2005-09-01';SELECT cust_id, order_num
FROM orders
WHEREDate(order_date)BETWEEN'2005-09-01'AND'2005-09-30';SELECT cust_id, order_num
FROM orders
WHEREYear(order_date)=2005ANDMonth(order_date)=9;
第12章 汇总数据
-- AVG()函数SELECTAVG(prod_price)AS avg_price
FROM products;SELECTAVG(prod_price)AS avg price
FROM products
WHERE vend_id =1003;-- COUNT()函数SELECTCOUNT(*)AS num_cust
FROM customers;SELECTCOUNT(cust_email)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 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* i tem_price)AS ordertotal
FROM orderitems
GROUPBY order_num
HAVINGSUM(quantity*item_price)>=50ORDERBY ordertotal;
第14章 使用子查询
-- 利用子查询进行过滤SELECT order_num
FROM orderitems
WHERE prod_id ='TNT2';SELECT cust_id
FROM orders
WHERE order_num IN(20005,20007);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(10001,10004);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'));-- 作为计算字段使用子查询SELECTCOUNT(*)AS orders
FROM orders
WHERE cust_id =10001;SELECT cust_name, cust_state,(SELECTCOUNT(*)FROM orders
WHERE orders.cust_id = customers.cust_id)AS orders
FROM customers
ORDERBY cust_name;SELECT cust_name, cust_state,(SELECTCOUNT(*)FROM orders
WHERE cust_id = cust_id)AS orders
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;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_contact
FROM customers, orders, orderitems
WHERE customers.cust_id=orders.cust_id
AND orderitems.order_num = orders.order_num
AND prod_id ='TNT2';
第16章 创建高级联结
-- 使用表别名SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id ='TNT2';SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id ='TNT2';-- 自联结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 p2WHERE p1.vend_id = p2.vend_id AND p2.prod_id ='DTNTR';-- 自然联结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
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id ='FB';-- 外部联结SELECT customers.cust_id, orders.order_num
FROM customers INNERJOIN orders ON customers.cust_id=orders.cust_id;SELECT customers.cust_id,orders.order_num
FROM customers RIGHTOUTERJOIN orders ON orders.cust_id=customers.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 LEFTOUTERJOIN orders ON customers.cust_id=orders.cust_id
GROUPBY customers.cust_id;
第17章 组合查询
-- 使用UNIONSELECT 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);SELECT vend_id, prod_id, prod_price FROM products
WHERE prod_price <=5OR vend_id IN(1001,1002);-- 包含或取消重复的行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章 全文本搜索
-- 启用全文本搜索支持CREATETABLE
productnotes NOTNULLAUTO_INCREMENT,int
note_id NOTNULL,char(10)
prod_id NOTNULL,
note_date datetimeNULL,
note_text textPRIMARYKEY(note_id),
FULLTEXT(note_text))ENGINE=MyISAM;-- 进行全文本搜索SELECT note_text
FROM productnotes
WHEREMatch(note_text) Against ('rabbit');SELECT note_text
FROM productnotes
WHERE note_text LIKE'%rabbit%';SELECT note_text,Match(note_text) Against('rabbit')AS rank
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'INBOOLEANMODE);SELECT note_text
FROM productnotes
WHEREMatch(note_text) Against ('heavy- rope" IN BOOLEAN MODE');SELECT note_text
FROM productnotes
WHEREMatch(note text) Against ('+rabbit +bait'INBOOLEANMODE);SELECT note_text
FROM productnotes
WHEREMatch(note text) Against ('rabbit bait'INBOOLEANMODE);SELECT note_text
FROM productnotes
WHEREMatch(note text) Against ("rabbit bait"'IN BOOLEAN MODE');SELECT note_text
FROM productnotes
WHEREMatch(note text) Against ('> rabbit < carrot'INBOOLEANMODE);SELECT note_text
FROM productnotes
WHEREMatch(note text) Against ('+safe+ (< combination)'INBOOLEANMODE);
第19章 插入数据
-- 插入完整的行INSERTINTO customers VALUES(NULL,'Pep E.LaPew','100 Main Street','Los Angeles','CA',' 90046','USA',NULL,NULL);INSERTINTO customers (cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country, cust_contact,cust_email)VALUES('Pep E.LaPew',' 100 Main Street','Los Angeles',' CA','90046','USA',NULL,NULL);INSERTINTO customers (cust_name,cust_contact,cust_email,cust_address,cust_city,cust_state,cust_zip,cust_country)VALUES('Pep E.LaPew',NULL,NULL,'100 Main Street','Los Angeles',' CA','90046','USA');-- 插入多个行INSERTINTO customers(cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country)VALUES('Pep E.LaPew','100 Main Street','Los Angeles','CA','90046','USA');INSERTINTO customers (cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country)VALUES('M.Martian',' 42 Galaxy Way','New York','NY','11213','USA');INSERTINTO customers (cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country)VALUES('Pep E.LaPew',' 100 Main Street','Los Angeles','CA',' 90046','USA','M.Martian','42 Galaxy Way',' New York','NY','11213',' USA ');-- 插入检索出的数据INSERTINTO customers (cust_id,cust_contact,cust_email,cust_name,cust_address,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;
第20章 更新和删除数据
-- 更新数据UPDATE customers
SET cust_email ='elmer@fudd.com'WHERE cust_id =10005;UPDATE customers
SET cust_name ='The Fudds',cust_email ='elmer@fudd.com'WHERE cust_id =10005;UPDATE customers
SET cust_email =NULLWHERE cust_id =10005;-- 删除数据DELETEFROM customers WHERE cust_id =10006;
-- 视图SELECT cust_name, cust_contact
FROM customers, orders, orderitems
WHERE customers.cust id = orders.cust id
AND orderitems.order_num = orders.order_num
AND prod_id ='TNT2';SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id ='TNT2';-- 利用视图简化复杂的联结CREATEVIEW productcustomers ASSELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num;SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id ='TNT2';-- 用视图重新格式化检索出的数据SELECT Concat (RTrim (vend name),' (',RTrim (vend_country),')')AS vend_title
FROM vendors
ORDERBY vend_name;CREATEVIEW vendorlocations ASSELECT Concat (RTrim (vend_name),' (',RTrim (vend_country),')')AS vend_title
FROM vendors
ORDERBY vend_name;SELECT*FROM vendorlocations;-- 用视图过滤不想要的数据CREATEVIEW customeremaillist ASSELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email ISNOTNULL;SELECT*FROM customeremaillist;-- 使用视图与计算字段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章 使用储存过程
-- 执行储存过程CALL productpricing (@apricelow,@pricehigh,@priceaverage);-- 创建储存过程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,@apricehigh,@priceaverage);SELECT@priceaverage;SELECT@pricehigh,@apricelow,@apriceaverage;CREATEPROCEDURE ordertotal (IN onumber INT,OUT ototal DECIMAL(8,2)BEGINSELECTSum(i tem price* quantity)FROM orderitems
WHERE order_num = onumber INTO ototal;END;CALL ordertotal (20005, atotal);SELECT@total;CALL ordertotal (20009,@total);SELECT@total;-- 建立智能存储过程-- Name: ordertotal-- Parameters: onumber = order number-- taxable = 0 if not taxable, 1 if taxable-- ototal = order total variableCREATEPROCEDURE 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);-- Declare 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;ENDIF;-- And finally, save to out variable SELECT total INTO ototal;END;CALL ordertotal (20005,0,@total);SELECT@total;CALL ordertotal (20005,1, atotal);SELECT@total;-- 检查存储过程SHOWCREATEPROCEDURE ordertotal;
第24章 使用游标
-- 创建游标CREATEPROCEDURE processorders ()BEGIN
DECLAREordernumbers CURSORFORSELECT order_num FROM orders;END;-- 打开和关闭游标OPEN ordernumbers;CLOSE ordernumbers;CREATEPROCEDURE processorders ()BEGIN-- Declarethe cursorDECLARE ordernumbers CURSORFORSELECT order_num FROM orders;-- Open the cursorOPEN ordernumbers;-- Close the cursorCLOSE ordernumbers;END;-- 使用游标数据CREATEPROCEDURE processorders ()BEGIN-- Declare local variablesDECLARE O INT;-- Declare the cursorDECLARE ordernumbers CURSORFORSELECT order_num FROM orders;-- Open the cursorOPEN ordernumbers;-- Get order numberFETCH ordernumbers INTO o;-- Close the cursorCLOSE ordernumbers;END;CREATEPROCEDURE processorders ()BEGIN-- Declare local variablesDECLARE done BOOLEANDEFAULT0;DECLARE O INT;-- Declare the cursorDECLARE ordernumbers CURSORFORSELECT order_num FROM orders;-- Declare continue handlerDECLARECONTINUEHANDLERFOR SQLSTATE '02000'SET done=1;-- Open the cursorOPEN ordernumbers;-- Loop through all rowsREPEAT-- Get order numberFETCH ordernumbers INTO o;-- End of loop
UNTIL done ENDREPEAT;-- Close the cursorCLOSE ordernumbers;END;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 handlerDECLARECONTINUEHANDLERFOR SQLSTATE '02000'SET done=1;-- Create a table to store the resultsCREATETABLEIFNOTEXISTS ordertotals
(order_num INT, total DECIMAL(8,2));-- Open the cursorOPEN ordernumbers;-- Loop through all rowsREPEAT-- 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 ENDREPEAT;-- Close the cursorCLOSE ordernumbers;END;SELECT*FROM ordertotals;
第25章 使用触发器
-- 创建触发器CREATETRIGGER newproduct AFTERINSERTON products
FOR EACH ROWSELECT'Product added';-- 删除触发器DROPTRIGGER newproduct;-- INSERT触发器CREATETRIGGER neworder AFTERINSERTON orders
FOR EACH ROWSELECT NEW.order_num;INSERTINTO orders (order_date, cust_id)VALUES(Now(),10001);-- DELETE触发器CREATETRIGGER deleteorder BEFORE DELETEON orders
FOR EACH ROWBEGININSERTINTO archive_orders (order_num, order_date, cust_id)VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);END;-- UPDATE触发器CREATETRIGGER updatevendor BEFORE UPDATEON vendors
FOR EACH ROWSET NEW.vend_state = Upper (NEW.vend_state);
第26章 管理事务处理
-- 控制事务处理STARTTRANSACTION-- 使用ROLLBACKSELECT*FROM ordertotals;STARTTRANSACTION;DELETEFROM ordertotals;ROLLBACK;SELECT*FROM ordertotals;-- 使用COMMITSTARTTRANSACTION;DELETEFROM orderitems WHERE order_num =20010;DELETEFROM orders WHERE order_num =20010;COMMIT;-- 使用保留点SAVEPOINT deletel;ROLLBACKTO deletel;-- 更改默认的提交行为SET autocommit=0;