Single Table Query
PPT 例:
1.between and 语句
SELECT productCode,buyPrice,MSRP
from products
where MSRP between "100.17" and "104.72";
运行结果:
解析:
- between所取的区间是闭区间。如图,100.17与104.72都可以被查询到。
- 这里的MSRP的数据类型是 short text 所以我们将数字加上引号表示str型数据
2.select语句中可运算
SELECT productCode,buyPrice,MSRP,MSRP-buyprice as Gross_profit
from products ;
运行结果:
3.like 模糊查询
SELECT customerNumber , customerName
from customers
where customerName like '%collectables%';
运行结果:
解析:
- 这里的like代表模糊查询,前后两个%代表前后可以有任意字符(可以是多个字符,也可以是0个字符)
- 其实如果你在Access 中输入此语句是什么都查不到的。因为Access与MySQL的SQL查询语句是有差别的。在Access中代表此意义的符号应该是*(星号)但考试的时候还写%就行了
SELECT customerNumber , customerName
from customers
where customerName like '%collectables';
SELECT customerNumber , customerName
from customers
where customerName like 'collectables%';
解析:
- 这两段只有一个%,分别代表前和后任意字符
SELECT customerNumber ,city
from customers
where customerName like 'n_c';
运行结果:
解析:
- like模糊查询中的_(下划线)可以代表任意一个字符
- MySQL中用_(下划线),Access中用?(问号)。挺坑的,考试还用_(下划线)吧
4.in的用法
SELECT customerNumber ,city
from customers
where city in ('Nantes','Melbourne');
运行结果:
解析:
- 这个是用来查询city 名等于in后括号里的城市,相当于把多个or语句简写成一行了。其等价于如下代码:
SELECT customerNumber ,city
from customers
where city ='Nantes' or city = 'Melbourne';
5.distinct去重
SELECT distinct country
from customers ;
运行结果:
解析:
- 这个很好理解,就是将重复的去掉再按正序排序。
6.聚合函数
聚合函数(比如avg平均、sum合计、max最大、min最小、count计算行)
SELECT count (*) as num_customer
from customers
where country = 'Australia';
解析:
- 这是个简单的例子不多解释了
- group by 语句必须与聚合函数一起使用
- where语句中不可用聚合函数,这也就引出了where与having的区别和子查询的问题。这个我们之后再说。
7.group by 与 order by的辨析
order by 从英文里理解就是行的排序方式,默认的为升序(若想降序则在列名后加desc)。order by 后面必须列出排序的字段名,可以是多个字段名。
例:
SELECT employeeNumber , lastname ,firstname
from employees
order by lastname desc,firstname;
运行结果:
解析:
- 先将lastname按降序排列,之后若将排列顺序相同的在按firstname的升序排列。
group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
SELECT country , sum(creditLimit) as sum_creditlimit
from customers
group by country;
运行结果:
解析:
- 可以想像为把种类相同的country作为一个小整体,然后在这些小整体中进行聚合函数的运算,并以小整体为单位输出结果。
练:
输出不同国家的顾客人数
SELECT country , count (*) as num_customers
from customers
group by country;
运行结果:
解析:
- 这里因为每个顾客都占一行,所以以一行为计数依据或以一行中某一个元素为计数依据得出来的结果一样。即:count (*) = count (country)
8.where 与 having 的辨析:
1.where 不能放在GROUP BY 后面
2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE
3.WHERE 后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING 可以
4.where条件用于group by之前,having用于group by 之后对结果进行筛选。
where子句:
where自居仅仅用于从from子句中返回的值,from子句返回的每一行数据都会用where子句中的条件进行判断筛选。where子句中允许使用比较运算符(>,<,>=,<=,<>,!=|等)和逻辑运算符(and,or,not)。
having子句:
having子句通常是与group by 子句一起使用的。因为having的作用是对使用group by进行分组统计后的结果进行进一步的筛选。
例:
选出以u开头的并且顾客个数大于4的国家
SELECT country , count (country) as num_customers
from customers
where country like 'u*'
group by country
having count (country) > 4;
运行结果:
注:在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行,简单的理解为只有有了统计结果后我才能执行筛选。where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count),因为它是一句一句筛选的。HAVING子句可以让我们筛选成组后的对各组数据筛选。,而WHERE子句在聚合前先筛选记录。
9.null(空值)
SELECT customerNumber ,state
from customers
where state is null;
运行结果:
空字符串(我们也可以称之为0长度字符串)与Null值(空值)的区别:
- 空字符串(0长度字符串)其数据类型是明确的,即为字符型。存储“空字符串”是要占据物理磁盘空间的
- Null值(空值)在代码中用关键字 “Null” 表示,代表没东西,其数据类型未知,它不占用物理磁盘空间。
10.子查询
例 1:
列出Pamela Castillo的顾客编号与姓名
SELECT customerNumber ,customerName
from customers
where salesRepEmployeeNumber =
(select employeeNumber
from employees
where lastname = 'Castillo'
or firstname = 'Pamela')
运行结果:
解析:
- 此处可以用子查询代替多表查询,多表查询我们之后再说。
例 2 :
列出办公室号码为6的雇员的顾客的姓名和编号。
SELECT customerNumber ,customerName ,salesRepEmployeeNumber
from customers
where salesRepEmployeeNumber in
(select employeeNumber
from employees
where officeCode = '6 ')
运行结果:
注意:
因为这里子查询的返回值不止一个所以应该用 in。