您的位置:首页 > 数据库

SQL 必知必会 读书笔记

2016-02-25 19:43 726 查看
SQL必知必会样例表(.sql 执行文件),下载地址
http://pan.baidu.com/s/1pJWVV2F 密码:qa8o

----------------------------------------------------------------------------

所有笔记都以MYSQL可执行语句为例,其它SQL不一定适用

---------------------------------------------------------------

wildcard 通配符
search pattern 搜索条件
%:任何字符出现任意次数,包括0次
_:匹配单个字符
通配符放在开始处,会影响效率
field:字段

拼接字段
SELECT CONCAT(vend_name,'(',vend_country,')') FROM Vendors ORDER BY vend_name;

去除空格:RTRIM(),LTRIM(),TRIM()
SELECT CONCAT(vend_name,'(',TRIM(vend_country),')') FROM Vendors ORDER BY vend_name;

设置别名(alias),也称为导出列(derived column)
SELECT CONCAT(vend_name,'(',TRIM(vend_country),')') as title FROM Vendors ORDER BY vend_name;

执行算数计算
SELECT prod_id,quantity,item_price,quantity*item_price AS sum FROM OrderItems WHERE order_num = 20008 ORDER BY sum DESC;

取当前日期
CURDATE()
SELECT order_num ,CURDATE() FROM orderitems;

UPPER():字母全转为大写
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase FROM Vendors ORDER BY vend_name;

LEFT() 返回串左边的字符
LENGTH() 返回串的长度
LOWER() 小写转化
LTRIM() 去掉串左边的字符
RIGHT() 返回串右边的字符
RTRIM() 去掉串右边的字符
SOUNDEX() 返回串的SOUNDEX值
UPPER() 大写转换

获取年份
SELECT order_num FROM Orders WHERE YEAR(order_date) = 2004;

数值处理函数 ABS() COS() EXP() PI() SIN() SQRT() TAN()

聚集函数 AGGREGATE FUNCTION 在SQL是高效设计的
AVG() 某列(下同)平均值
COUNT() 行数
MAX() 最大值
MIN() 最小值
SUM() 和

SELECT AVG(prod_price) AS avg_price FROM Products;
SELECT AVG(prod_price) AS avg_price FROM Products WHERE vend_id = 'DLL01';

SELECT COUNT(*) AS num_cust FROM Customers;
SELECT COUNT(cust_email) AS num_cust FROM Customers; 只统计 cust_email有值的情况

SELECT MAX(prod_price) AS max_price FROM Products;忽略NULL的情况
SELECT SUM(item_price*quantity) AS total_price FROM OrderItems WHERE order_num = 20005;

只包含不同的值 DISTINCT
SELECT AVG(DISTINCT prod_price) AS avg_price FROM Products WHERE vend_id = 'DLL01';

多个聚集函数
SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min,MAX(prod_price) AS price_max FROM Products;

SELECT vend_id,COUNT(*) AS num_prods FROM Products GROUP BY vend_id;

数据分组
GROUP BY 必须在 WHERE 之后,ORDER BY 之前
SELECT vend_id,COUNT(*) AS num_prods FROM Products GROUP

WHERE 过滤列 HAVING 过滤分组,两者语法相同
SELECT cust_id ,COUNT(*) AS orders FROM Orders GROUP BY cust_id HAVING COUNT(*) >=2;
SELECT vend_id,COUNT(*) AS num_prods FROM Products WHERE prod_price >=4 GROUP BY vend_id HAVING num_prods >=2;

GROUP BY 不一定以分组顺序输出的 ,应该提供明确的ORDER BY
SELECT order_num , COUNT(*) AS items FROM OrderItems GROUP BY order_num HAVING COUNT(*) >=3 ORDER BY items,order_num;

子查询,子查询只能查询单个列。
SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01';
SELECT cust_id FROM Orders WHERE order_num IN (SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01');
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 = 'RGAN01'));

作为计算字段使用子查询
SELECT COUNT(*) AS orders FROM Orders WHERE cust_id = '100000000';
SELECT cust_name,cust_state,(SELECT COUNT(*) AS orders FROM Orders WHERE cust_id = Customers.cust_id) as orders FROM Customers ORDER BY cust_name;

联结查询
SELECT vend_name, prod_name,prod_price FROM Vendors,Products WHERE Vendors.vend_id = Products.vend_id;
内联查询 INNER JOIN
SELECT vend_name, prod_name,prod_price FROM Vendors INNER JOIN Products ON Vendors.vend_id = Products.vend_id;
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 = 'RGAN01';
表别名
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 = 'RGAN01';

自联结
SELECT cust_id , cust_name,cust_contact FROM Customers WHERE cust_name = (SELECT cust_name FROM Customers WHERE cust_contact = 'Jim Jones');
自然联结
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 = 'RGAN01';

外部联结(P87)
SELECT Customers.cust_id,Orders.order_num FROM Customers INNER JOIN Orders ON Customers.cust_id=Orders.cust_id;
左外部联结
SELECT Customers.cust_id,Orders.order_num FROM Customers LEFT OUTER JOIN Orders ON Customers.cust_id=Orders.cust_id;
右外部联结
SELECT Customers.cust_id,Orders.order_num FROM Customers RIGHT OUTER JOIN Orders ON Customers.cust_id=Orders.cust_id;
带举起函数的联结
SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ord FROM Customers INNER JOIN Orders ON Customers.cust_id = Orders.cust_id GROUP BY Customers.cust_id;

UNION 并
SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_state IN ('IL','IN','MI') UNION SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_name = 'Fun4ALL';
UNION 必须两条或以上的SELECT语句组成,之间用UNION分割,每个查询必须包括相投的列,表达式或聚集函数
UNION 自动除去重复的行
UNION ALL 返回所有行
SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_state IN ('IL','IN','MI') UNION ALL SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_name = 'Fun4ALL';
SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_state IN ('IL','IN','MI') UNION ALL SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_name = 'Fun4ALL' ORDER BY cust_name,cust_contact;

INSERT 插入
INSERT INTO Customers VALUES('1000000006','Toy Land',' 123 Any Street','New York','NY’)
INSERT WHERE
INSERT INTO Customers(cust_id,cust_contact,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) SELECT cust_id,cust_contact,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country FROM CustNew;
1、CustNew中有多少行,就插入多少行。2、列名不需要匹配,DBMS不关心SELECT返回的列名,有用的是列的位置。
3、里面可以有WHERE子句过滤插入的数据。

SELECT INTO
CREATE TABLE CustCopy AS SELECT * FROM Customers;
1、人而活SELECT选项和子句都可以使用,包括WHERE和GROUP BY。
2、可利用联结从多个表插入数据。
3、只能插入到单个表中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: