黄沙百战穿金甲,不破楼兰终不还。 —王昌龄的《从军行七首·其四》
1 查询
SELECT [ALL|DISTINCT] <目标列表表达式>[,<目标列表表达式>]...
FORM <表名或视图名>[,<表名或视图名>]
[WHERE <条件表达式>]
[GROUP BY<列名> [HAVING <条件表达式>]]
[ORDER BY <列名2>[ASC| DESC]]
嵌入算术表达式
SELECT name,2016-age FROM Student
去掉重复行(默认为 ALL)
SELECT DISTINCT age FROM Student
选择
SELECT name,age FROM Student WHERE age<20
确定范围
SELECT name,age FROM Student WHERE age BETWEEN 20 AND 23
SELECT name,age FROM Student WHERE age NOT BETWEEN 20 AND 23
确定集合
SELECT name,age FROM Student WHERE age NOT IN(19,20,23)
字符匹配 "%"任意长度 "_"任意当个字符
SELECT * FROM Student WHERE name LIKE '刘%'
SELECT * FROM Student WHERE name LIKE '刘_'
SELECT * FROM Student WHERE name LIKE '_刘%'
SELECT * FROM Student WHERE name MOT LIKE '刘%'
去除通配符的影响"\" 匹配DB_Design字符
SELECT * FROM Student WHERE name 'DB\_Design' ESCAPE'\'
涉及空值的查询
SELECT * FROM Student WHERE score IS NOT NULL
多重查询
SELECT * FROM Student WHERE Sdept="信工系" AND age<20
排序ORDER BY ASC升序 DESC降序
SELECT * FROM Student ORDER BY mumber,age DESC 按mumber降序排列,相同按年龄降序排列
聚集函数(只能用于SELECT子句和 group by 中的 having 子句)
COUNT(*) 统计元组个数
COUNT([DISTINCT|ALL] <列名>) 统计一列中值的个数
SUM([DISTINCT|ALL]<列名>) 计算一列值的总和(必须此列为数组型)
AVG([DISTINCT|ALL]<列名>) 计算一列值的平均值(必须此列为数组型)
MAX([DISTINCT|ALL]<列名>) 求一列值的最大值
MIN([DISTINCT|ALL]<列名>)
SELECT SUM(Score) FROM Student WHERE id=2010
SELECT AVG(Sage) FROM Student GROUP BY Sdept;//求同一个系学生的平均年龄
SELECT * FROM Student ORDER BY Sno DESC limit arg1,arg2
arg1 用于指定查询记录的起始位置,arg2 用于指定查询数据所返回的记录数。
“Orders” 表
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
查找订单总金额少于 2000 的客户。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
查找客户 “Bush” 或 “Adams” 拥有超过 1500 的订单总金额。
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
示例-jion
由内连接和外连接之分。
内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现
外连接: 包括
(1)左外连接(左边的表不加限制)
(2)右外连接(右边的表不加限制)
(3)全外连接(左右两表都不加限制)
3、自连接(连接发生在一张基表内)
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
表:tb_purview
表:tb_manager
select m.*,p.sysset,p.readerset,p.bookset,p.borrowback,p.sysquery
from tb_manager m left join tb_purview p on m.id=p.id
where m.name= 'mr'
结果:
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
(inner)JOIN: 如果表中有至少一个匹配,则返回行
LEFT(outer) JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
mysql 不支持 FULL JOIN 查询,可以使用 UNION 合并结果集
SELECT * FROM Student right JOIN SC ON Student.Sno=SC.Sno
UNION
SELECT * FROM Student left JOIN SC ON Student.Sno=SC.Sno
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
2 更新
UPDATE table_name
SET <column_name>=<expression>
[...,<last column_name>=<last expression>]
[WHERE <search_condition>]
UPDATE Student
SET Sage=22
WHERE Sno='291939'
所有学生年龄加一
UPDATE Student
SET Sage=Sage+1
带子查询的修改语句,涉及 两个表
UPDATE SC
SET Grade=0
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept='CS')
3 删除
DELETE FROM <table_name>[WHERE <search condition>]
DELETE FROM Student WHERE Sno='2910039'
DELETE FROM Student
带子查询的删除语句,涉及两个表
DELETE
FROM SC
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE age=23)
4 插入
INSERT
INTO<表名> [(<属性列1>[,(<属性列2>]...)]
VALUES(<常量1>[,<常量2>]....)
INSERT
INTO Student(Sno,Sname,Sage)
VALUES('2012132','成小春',23)
插入子查询结果
INSERT
INTO<表名> [(<属性列1>[,(<属性列2>]...)]
子查询
INSERT
INTO Student(Sno,Avg_age)
SELECT Sno,AVG(Sage)
FROM Student