本章主要介绍SQL中简单编写——参考W3school
一、查询Select
1. distinst--截然不同的,查询结果中中不存在相同的列
Company | OrderNumber |
---|---|
IBM | 3532 |
W3School | 2356 |
Apple | 4698 |
W3School | 6953 |
select distinct Company from Orders;
Company |
---|
IBM |
W3School |
Apple |
W3School |
2. order by *** desc / asc--分类排序,默认升序asc
select Company, OrderNumber from orders order by Company desc, OrderNumber asc;
Company | OrderNumber |
---|---|
W3School | 2356 |
W3School | 6953 |
IBM | 3532 |
Apple | 4698 |
二、插入 Insert
insert into table_name values (值1, 值2 ...); insert into table_name(列1,列2...) values (值1,值2...);
三、更新 Update
update table_name set 列名称 = 新值 where 列名称 = 某值; update Person set FirstName = 'Fred', Address = 'Nanjing' where LastName = 'Wilson' ;
四、删除 Delete
delete from table_name where 列名称 = 值;
五、进阶
1. top:用于规定返回记录的数目
select top 2 * from table_name;//取前两条记录 select top 50 percent * from table_name;//取前百分之五十记录
2.通配符
通配符 | 描述 |
---|---|
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist]或者[!charlist] |
不在字符列中的任何单一字符 |
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'; SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'; SELECT * FROM Persons WHERE City LIKE '[ALN]%';//选取居住的城市以 "A" 或 "L" 或 "N" 开头的人 SELECT * FROM Persons WHERE City LIKE '[!ALN]%'//选取居住的城市不是以 "A" 或 "L" 或 "N" 开头的人
3. in:允许我们在WHERE子句中规定多个值
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
4. between:在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
NOT BETWEEN:获取范围之外的数据
5. as:别名
SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'
6. join
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
① INNER JOIN:两表共同部分
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
② LEFT JOIN:关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George | |
③RIGHT JOIN:关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
34764 |
④ FULLJOIN: 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George | |
34764 |
六、SQL函数
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
1. AVG():平均数
找到 OrderPrice 值高于 OrderPrice 平均值的客户
SELECT Customer FROM Orders WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
Customer |
---|
Bush |
Carter |
Adams |
2. COUNT():返回匹配指定条件的行数
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers
FROM Orders
NumberOfCustomers |
---|
3 |
3. FIRST():返回指定的字段中第一个记录的值
SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders
FirstOrderPrice |
---|
1000 |
4. LAST():返回指定的字段中最后一个记录的值。
5. MAX()/MIN():返回一列中的最大/小值。NULL 值不包括在计算中。
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
LargestOrderPrice |
---|
2000 |
6. SUM():返回数值列的总数(总额)。
7. GROUP BY():分组
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
Customer | SUM(OrderPrice) |
---|---|
Bush | 2000 |
Carter | 1700 |
Adams | 2000 |
8. HAVING():在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000
Customer | SUM(OrderPrice) |
---|---|
Carter | 1700 |
9. UCASE() / LCASE():字段的值转换为大/小写。
10. MID():从文本字段中提取字符。
SELECT MID(column_name,start[,length]) FROM table_name //column_name 必需。要提取字符的字段。 //start 必需。规定开始位置(起始值是 1)。 //length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
//例如MID(name, 1, 3)就是返回满足条件的name的前三个字符
11. LEN():返回文本字段的长度。
12. ROUND():把数值字段舍入为指定的小数位数。
SELECT ROUND(column_name,decimals) FROM table_name; //column_name 必需。要舍入的字段。 //decimals 必需。规定要返回的小数位数。
13. NOW():返回当前日期和时间。
14. FORMAT():用于对字段的显示进行格式化。
SELECT FORMAT(column_name,format) FROM table_name; //column_name 必需。要格式化的字段。 //format 必需。规定格式。
例如 FORMAT(Now(),'YYYY-MM-DD')
输出 12/29/2008
15. wherehere & having
- where后不能加聚合函数.
-
where的搜索条件是在执行语句进行分组之前应用, having的搜索条件是在分组条件后执行的,即如果where和having一起用时,where会先执行,having后执行.
- where子句用来筛选 FROM 子句中指定的操作所产生的行。having子句用来从分组的结果中筛选行。GROUP BY 子句用来分组 WHERE 子句的输出。
- where可以用于select、update、delete和insert into values(select * from table where ..)语句中。having只能用于select语句中.