SQL 学习笔记<二> INSERT, UPDATE, DELETE, SELECT
INSERT INTO <表名>[(<属性列1>[, <属性列2>…])] VALUES(<常量1>[, <常量2>…]);
INSERT INTO Student(Sno, Sname, Ssex, Sdept, Sage) VALUES('2000232', 'Jeff', 'male', 'computer', 20);
UPDATE <表名> SET <列名>=<表达式>[, <列名>=<表达式>]… [WHERE <条件>];
UPDATE Student SET Sage=18 WHERE Sno='2000232';
DDLETE FROM <表名> [WHERE <条件>];
DELETE FROM Student WHERE Sno='2000232';
DELETE FROM Student; //删除表SC中所有的数据,使之变成一张空表
SELECT [ALL|DISTINCT] <目标列表达式>[, <目标列表达式>] …
FROM <表名或视图名>[, 表名或视图名] …
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]] //GROUP将结果关系按列名1的值进行分组,如果带HAVING短语,则只有满足指定条件的组才予以输出
[ORDER BY <列名2> [ASC|DESC]]; //ORDER将结果按列名2进行升序或者降序排列
SELECT Sno, Sname FROM Student;
SELECT * FROM Student;
SELECT Sname, 2011 – Sage FROM Student;
SELECT Sname, 2011 – Sage AS BirthYear FROM Student;
SELECT Sno, Cno, 'Passed' Flag FROM SC WHERE Grade >=60; //查询出来的数据里面第3列是一个字符串常数,并且常数的值是'Passed'
SELECT ALL Sno FROM SC;// ALL用于查询出所有的数据
SELECT DISTINCT Sno FROM SC; //DISTINCT 用于去掉重复的数据
WHERE:
查询条件 | 谓词 | 例子 |
比较 | =, >, <, >=, <=, <> | SELECT Sname, Sage FROM Student WHERE Sage < 20; |
确定范围 | BETWEEN AND, NOT BETWEEN AND | SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 18 AND 20; |
确定集合 | IN, NOT IN | SELECT Sname, Sage FROM Student WHERE Sdept IN('Computer', 'Management'); |
字符匹配 | LIKE, NOT LIKE | SELECT Sname, Sno, Ssex FROM Student WHERE Cname LIKE '王%'; //%表示匹配任意长度字符 SELECT Sname, Sno, Ssex FROM Student WHERE Cname LIKE '王_'; //_表示匹配单个字符 SELECT Cno, Ccredit FROM Ccourse WHERE Cname LIKE 'DB\_Design' ESCAPE '\'; // ESCAPE '\'表示跟在\后面的为换码字符, 这样\_就表示为_ |
空值 | IS NULL, IS NOT NULL | SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL; |
逻辑运算符 | AND, OR, NOT | SELECT Sname FROM Student WHERE Sdept='Computer' AND Sage < 19; |
ORDER BY:
SELECT Sno, Grade FROM SC WHERE Cno = '1156' ORDER BY Grade DESC; // 查询结果将以Grade排序
聚集函数:
函数名 | 描述 | 例子 |
COUNT ([DISTINCT|ALL] *) | 统计元组个数 | SELECT COUNT(*) FROM Student; |
COUNT ([DISTINCT|ALL] <列名>) | 统计一列中值的个数 | SELECT COUNT(DISTINCT Sno) FROM SC WHERE Cno = ‘1156’ OR Cno = ‘1136’; |
AVG ([DISTINCT|ALL] <列名>) | 计算一列值的总和(此列必须是数值型) | SELECT AVG(Sage) FROM Student; |
SUM ([DISTINCT|ALL] <列名>) | 计算一列值的平均值(此列必须是数值型) | SELECT SUM(Ccredit) FROM SC, Course WHERE Sno = ‘200230’ AND SC.Cno = Course.Cno; |
MAX ([DISTINCT|ALL] <列名>) | 求一列值中的最大值 | SELECT MAX(Sage) FROM Student; |
MIN ([DISTINCT|ALL] <列名>) | 求一列值中的最小值 | SELECT MIN(Sage) FROM Student; |
GROUP BY
SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno; //对查询结果按Cno的值分组,所有具有相同Cno值的元组为一组,然后对每一组用聚集函数COUNT计算,求得该组的学生人数。
如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件:
SELECT Cno, AVG(Grade) FROM SC GROUP BY Cno HAVING COUNT(*) >= 3; //对查询结果按Cno的值分组,并且每组里面元组数量>=3的,求出其平均值。
WHERE子句与HAVING短语的区别在于作用对象不同,WHERE子句作用于表或者视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。