目录
本人会用几天时间把在学校学到的整个数据库知识全盘托出,如果能看懂并且明白我接下来所写的博文,相信对你数据库提升、对行业软件理解、以后工作有很大帮助。
由于SQL部分内容实在太多,我会把整个第二章分成四个小部分来细讲
第二讲其二:SQL
•如果在结果中重复的数据不想显示出来,可以使用DISTINCT关键字
•【例2.28】查询“机械工业出版社”或者“清华大学出版社”出版的图书
•【例2.31】查找“机械工业出版社”,“清华大学出版社”,“高等教育出版社”出版的全部图书
•【例2.32】查找不是“机械工业出版社”,“清华大学出版社”,“高等教育出版社”出版的全部图书
SELECT [ALL|DISTINCT] <目标列名序列>
[ ORDER BY <排序依据列> [ ASC|DESC ] ]
•【例2.44】查询图书的信息,查询结果按照出版社的名称升序排序,同一出版社的按照价格的降序排序。
•在<列名>上值相同的元组被分在一组,该列称为分组依据列。然后可以使用聚集函数统计每一组的数据。
•【例2.43】统计每个出版社出版图书的平均价格,并显示每个出版社的名称
•【例】查询出版图书平均价格高于30元的出版社名称,并显示其图书平均价格。
•【例2.45】查询出版图书多于2本的出版社名称和出版图书数目
SQL的组成部分
数据查询语言——单表查询
2.3.1查询语句格式
• SELECT [ALL|DISTINCT] < 目标列名序列 >FROM <数据源>
[ WHERE <检索条件表达式> ]
[ GROUP BY <分组依据列>
[ HAVING <组提取条件表达式> ] ]
[ ORDER BY <排序依据列> [ ASC|DESC ] ]
– 聚集函数:统计正式讲解SQL之前先准备好软件环境,了解library数据库的结构和表的含义
SELECT后面直接跟列名
【例2.18】
查询Book表中的书名(name),作者(author),价格(price)
语句:
SELECT name, author, price FROM Book
【例2.19】查询Book表中的全部数据
语句:
select * from book
DISTINCT关键字
•如果在结果中重复的数据不想显示出来,可以使用DISTINCT关键字
•对比结果:
【例2.20】
SELECT pubilsh FROM Book
【例2.21】
SELECT DISTINCT pubilsh FROM Book
•【例2.22】查询每一本书九折后的价格
SELECT book_ID,name,price*0.9 FROM Book
列更名
• SQL 提供了为关系表和属性重新命名的机制。 • 首先来学习一下如何为列重命名。经过计算的列、函数的列和常量列的显示结果都没有列名,也可以通过这样的方式指定列名。 • 语法格式为: • 旧列名 | 表达式 [ AS ] 新列名 • 或:新列名 =旧列名 | 表达式WHERE子句
• SELECT 列名列表 FROM 表名
WHERE 条件表达式
•【例2.25】查询价格大于30元的图书的全部信息
SELECT * FROM Book WHERE price >30
范围比较:BETWEEN … AND …
•【例2.29】查询图书价格在25到50元之间的图书
SELECT * FROM Book
WHERE price BETWEEN 25 AND 50
等价于
SELECT * FROM Book
WHERE price>=25 AND price <=50
•【例2.30】图书价格不在20到30元之间的图书
SELECT * FROM Book
WHERE price NOT BETWEEN 20 AND 30
等价于
SELECT * FROM Book
WHERE price<20 OR price >30
比较运算
•【例2.26】查询所有的女读者的信息
Select * from reader where sex=‘女’
•【例2.27】查询图书价格在30到50元之间的图书
SELECT * FROM Book WHERE price BETWEEN 25 AND 50
•【例2.28】查询“机械工业出版社”或者“清华大学出版社”出版的图书
SELECT * FROM Book WHERE publish =‘机械工业出版社’ or publish = ’ 清华大学出版社’,’ 高等教育出版社’
集合查询:IN
•【例2.31】查找“机械工业出版社”,“清华大学出版社”,“高等教育出版社”出版的全部图书
SELECT * FROM Book
WHERE publish IN(‘机械工业出版社’,
’ 清华大学出版社’,’ 高等教育出版社’)
•【例2.32】查找不是“机械工业出版社”,“清华大学出版社”,“高等教育出版社”出版的全部图书
SELECT * FROM Book
WHERE publish NOT IN (‘机械工业出版社’,
’ 清华大学出版社’,’ 高等教育出版社’)
WHERE子句中可以使用的查询条件
空值比较:IS NULL
•【例2.38】查询性别为空的读者的信息
SELECT * FROM Reader
WHERE sex IS NULL
•【例2.39】查询出生日期不为空的读者的姓名
SELECT name FROM Reader
WHERE birthdate IS not NULL
字符串模糊查询:LIKE
•【例2.33】查询姓全部“王”的读者的信息。
SELECT * FROM Reader
WHERE name LIKE ‘王%’
LIKE的用法
•列名 LIKE <字符串> •在字符串中我们可以使用通配符 –_代表任意一个字符 –%代表任意多个字符多重条件查询
•【例】查询1992年以后出生的女读者的姓名
SELECT name FROM Reader
WHERE birthdate >= ’1992-1-1’ AND sex=‘女’
查询语句格式
SELECT [ALL|DISTINCT] <目标列名序列>
FROM <数据源>
[ WHERE <检索条件表达式> ]
[ GROUP BY <分组依据列>
[ HAVING <组提取条件表达式> ] ]
[ ORDER BY <排序依据列> [ ASC|DESC ] ]
ORDER BY子句:排序
•【例2.42】查询读者的信息按出生日期的升序显示
SELECT * FROM Reader
ORDER BY birthdate ASC
•【例2.43】查询读者的信息按出生日期的
SELECT MAX(price) FROM Book
“降序”显示
SELECT * FROM Reader
ORDER BY birthdate DESC
•【例2.44】查询图书的信息,查询结果按照出版社的名称升序排序,同一出版社的按照价格的降序排序。
SELECT * FROM Book
ORDER BY publish ASC,price DESC
聚集函数
• 聚集函数(也叫集合函数),方便统计一些数据。 • COUNT ( * ) : 统计表中元组个数; • COUNT (列名 ) : 统计本列列值个数; • SUM (列名 ) : 计算列值总和(必须是数值型列); • AVG (列名 ) : 计算列值平均值(必须是数值型列); • MAX (列名 ) : 求列值最大值; • MIN (列名 ) : 求列值最小值。•【例2.45】统计全部图书的平均价格
SELECT AVG(price) FROM Book
•【例2.46】查询最高的图书价格
SELECT MAX(price) FROM Book
•【例2.47】统计读者的总人数
SELECT COUNT(*) FROM Reader
分组查询(GROUP BY 子句)
•【例2.49】统计每个出版社的出版图书的数目
分析:如果能够将所有的图书,按照出版社的名称进行分组,然后我们在统计每一组的元组的个数,我们就能能到得到期望的数据。如图:•可以使用GROUP BY <列名>进行分组
•在<列名>上值相同的元组被分在一组,该列称为分组依据列。然后可以使用聚集函数统计每一组的数据。
SELECT COUNT(*) , publish FROM Book
GROUP BY publish
•【例2.42】统计每个人所借图书的数目。
SELECT COUNT(book_ID), Reader_id
FROM Borrow
GROUP BY Reader_id
Having COUNT(book_ID)>2
•【例2.43】统计每个出版社出版图书的平均价格,并显示每个出版社的名称
SELECT publish, AVG(price) AS 平均价格
FROM Book
GROUP BY publish
•【例】查询出版图书平均价格高于30元的出版社名称,并显示其图书平均价格。
• HAVING 子句用于对分组统计后的结果进行筛选。满足HAVING 子句条件将会保留在结果中。SELECT publish,AVG(price) FROM Book
GROUP BY publish
HAVING AVG(price)>30
•【例2.45】查询出版图书多于2本的出版社名称和出版图书数目
SELECT publish, COUNT(*) FROM Book
GROUP BY publish
HAVING COUNT(*)>2