数据库的执行顺序:
1.表,2.行,3.分组,4.分组的筛选条件,5.列,6.排序
(5 确定要查询的列) select 列 别名,统计函数(列),算数运算(+-*/列) |
(1确定数据来源的表) from 表名 |
(2筛选出要进行操作的数据,即哪些行) where |
(3分组) group by #注意分组子句,一般和统计函数还有having联合使用。 |
(3-1 分组后的数据过滤)WHERE 搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。) having max(salary)>5000; |
(6排序) order by (asc、desc降序) 排序永远是最后执行 |
表的连接 |
书写方法:都可以使用where 或者join on的写法来进行 范例: SELECT name,id,deptno,deptaddress FROM emp,dept WHERE emp,deptno=dept.deptno; SELECT name,id,deptno,deptaddress FROM emp JOIN dept ON ( emp,deptno=dept.deptno); 范例;注意这个例子,很经典 SELECT name,id,deptno,deptaddress FROM emp,dept WHERE emp,deptno=dept.deptno AND emp,salary between dept.lowsalary and dept.upsalary; SELECT name,id,deptno,deptaddress FROM emp JOIN dept ON ( emp,deptno=dept.deptno AND emp,salary between dept.lowsalary and dept.upsalary); |
分类 内连接:特点是只有满足条件的数据才会显示 ,不满足不显示。 比如:emp,deptno=dept.deptno 外连接:左外连接和右外连接 左外连接写法 WHERE emp,deptno=dept.deptno(+) FROM emp LEFT OUTER JOIN dept ON 使用 join on形式时 利用on子句指定关联条件。 |
数据的集合操作 |
每一次查询实际上返回的就是数据集合,所以返回的结果上可以使用。 交集:INTERSECT 并集:union(消除重复元素) ALL UNION(保留所有元素,不会删除重复元素) 差集:MINUS 补集: 注意事项:进行集合操作的,需要是具有相同数据结构,就是字段相同 |
范例: SELECT name,id,deptno,deptaddress FROM emp,dept WHERE emp,deptno=dept.deptno AND emp,salary between dept.lowsalary and dept.upsalary; UNION SELECT name,id,deptno,deptaddress FROM emp JOIN dept ON ( emp,deptno=dept.deptno AND emp,salary between dept.lowsalary and dept.upsalary); UNION SELECT name,id,deptno,deptaddress FROM emp,dept WHERE emp,deptno=dept.deptno AND emp,salary between dept.lowsalary and dept.upsalary; UNION SELECT name,id,deptno,deptaddress FROM emp JOIN dept ON ( emp,deptno=dept.deptno AND emp,salary between dept.lowsalary and dept.upsalary); |
分组统计 | |||||||
1.统计函数使用 (又名分组函数或者多行函数) 常用的有5个: count() 行数计数 count(* / 字段 / distinct 字段) 分别表示(返回全部记录、返回字段中部位null的记录数,返回不重复的记录数) sum()、avg() 只操作数字的统计 min()、max() 各种类型的数据都支持(数字,字符,日期) 范例:select count(salary), sum(salary),avg(salary),min(salary),max(salary) from table; 2.分组统计查询的实现 关键字:GROUP BY 注意:在有group by分组的查询中,select子句中只能放分组字段和聚合函数
2、having子句中:子查询返回单行单列,而且要是统计函数(having自带的分组统计属性)。 3、from子句中:都可以,反正都是一个表(单行单列的表,单行多列的表,多行多列的表) |
3.对分组数据的过滤
group by id having avg(字段)>=10 AND sum(字段)<6
数据库的复杂查询
有四种 : 1、限制查询(where)
2、分组统计+限定条件的查询 统计函数+group by+having
3 、多表查询 分为两种,一种是oracle独有的写法,另一种是SQL的正规写法
4、子查询 说白了子查询就是把一个查询当成一个条件放入另一个查询语句中,进一步解析就是把查询结果当成(数字或者表)放入另一个查询语句中
1.限制查询中的关键字
字段 between 。。and。。 数字,日期,字符都可以
字段 IN (number1,number2,。。。)
字段 IS NULL
NOT 字段 其他的关键字(IN,between and ,IS NULL)
字段 like 通配符 _ 代表一个字符 % 代表0个,1个或者多个字符 【a,b,c】代表括号中任一的一个字符 【^q,w,e】代表不能是括号中的字符,而是其他字符 )
【注意:关于select的关键字
①.使用DISTINCT
1 | SELECT DISTINCE name,age FROM users |
如果age不同,即使name相同,那么这一行就不会被删除重复。
②.聚合函数: COUNT\SUM\AVG\MIN\MAX 他们提供了对分组数据进行计数、求和、取平均值、取最小值和最大值等方法。
】
关键字 select top
--1、子查询 按照id排序之后先搜出前40条数据 --2、not in 关键字 ,搜出id不在前40之内的其它数据 --3、最后再取出前10条数据,这就是数据库中第41-50条数据(注意,id不是41-50,因为我删除了id为44、45的记录) | |
SELECT TOP 10 * FROM dbo.a WHERE id NOT IN ( SELECT TOP 40 id FROM dbo.a ORDER BY id )ORDER BY id; | |
2.分组统计+having限定
注意:在有group by分组的查询中,select子句中只能放分组字段和聚合函数
SELECT ProductID, AVG(OrderQty), SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > 1000000.00 #翻译过来就是:查询 表中,按 ProductID分组时,(LineTotal)总行数大于100000的组的 ProductID(id号), 均值AVG(OrderQty),和总行数 SUM(LineTotal)
AND AVG(OrderQty) < 3 ;
3、多表查询(学会思路,如下)
我们经常举例的 员工表 emp(id,name,manager,salary,common,deptno) 部门表 dept(deptno,name,address)
范例:查询出每个部门的名称、部门人数、平均工资
确定要是用的数据表 dept和emp
确定已知的关联字段
①第一步,换个思路查询出 每个部门的名称dept(deptname),雇员编号(count(id)),基本公司(avg(salary))
select d.dname,e.id,d.salary; | |
from emp e,dept d; | |
where d.deptno=e.deptno; |
②第二步,此时的查询结果需要分组(select的字段必须是分组字段,反过来我确定了select查询的字段,也就确定了分组字段)
select d.name,count(e.id),avg()d.salary; | |
from emp e,dept d; | |
where d.deptno=e.deptno; group by d.name; |
③此时要想到,哪个表是重要的表,是需要全部显示的,我们使用外连接上另外的表
| ||
from emp e,dept d; | ||
where d.deptno=e.deptno(+); group by d.name; |
外连接的有一种写法(
外连接分为左连接(LEFT OUTER JOIN)、右连接(RIGHT OUTER JOIN)、全连接(FULL OUTER JOIN)。
OUTER是可以省略的。
)外连接分为左连接(LEFT OUTER JOIN)、右连接(RIGHT OUTER JOIN)、全连接(FULL OUTER JOIN)。
OUTER是可以省略的。
)
s |
select d.name,count(e.id),avg(d.salary); | |
from dept d LEFT OUTER JOIN emp e ON d.deptno=e.deptno; ON后面也可以使用d.deptno between a and b | |
group by d.name; |
4.子查询(可以放在任意的子句中,充当条件)
自我思考:就把子查询(结果)当成一个数据或则一个多行多列的表就可以了。
应用的场景:子查询需要放到“()”里边,一般多放在
where子句中:子查询的结果是单行单列(就相当于一个数据),单行多列(一行数据),多行单列(一个字段的数据范围)多和关键字IN一起用。
having子句中:子查询返回单行单列,而且要是统计函数(having自带的分组统计属性)。
from子句中:都可以,反正都是一个表(单行单列的表,单行多列的表,多行多列的表)
我们经常举例的 员工表 emp(id,name,manager,salary,common,deptno) 部门表 dept(deptno,name,address)
范例:查询出公司工资最低的雇员的信息
确定要是用的数据表 emp
确定已知的关联字段 无
①第一步,分析得出,我们要查雇员信息(*)
select * | |
from emp | |
②第二步,明显一看我们就知道最低工资就是一个查询结果,同时是一个条件(where),先子查询了。
select min(salary) | |
from emp | |
③此时要想到,将子句查询的最低工资作为条件,放入另一语句
| ||
from emp e | ||
where salary= ( select min(salary) from emp ) |
5.SQL DDL 表的 插入/删除/修改语句
SQL语法使用最多的就是查询,除了查找语句之外,其他的语句内容都很少。
类型 | 含义 |
---|---|
create table | 创建一张表 |
insert into…values | 向表中插入一条信息 |
delete from | 从表中删除一条信息 |
update…set…where | 在where的位置,更新内容为set的值 |
drop table | 删除表 |
alter table…add | 向表中添加某个属性 |
alter table…drop | 将表中的某个属性删除 |
create table
create table Student(
ID varchar(20) not null,
name varchar(10) not null,
age int,
class varchar(50),
primary key (ID));
创建一张叫做Student的表,表中有四个属性,ID,姓名,年龄和班级,么个属性都有各自的类型。在这张表中主键是ID。
insert into…values
insert into Student(ID,name,class)
values(10152510302,"Tom","class 1");
向表中添加一行信息,一个名叫Tom的学生的信息,因为age值不是not null,也就不是必须的,所以我们不添加age属性也没有问题。
delete from
delete form Student
where name="Tom";
从表中删除所有名字叫做Tom的信息。如果delete from不写where查询条件表示清空这张表。
update…set…where
update Student
set age=18
where name="Tom";
将所有名字叫做Tom的信息的年龄设置为18。
drop table
drop table Student;
删除Student这张表。
alter table…add
alter table Student
add sex varchar(5);
向表中添加性别属性,并且将表中以存放的信息的sex值设为null。所有通过这种方式添加的属性都不能被设置为not null类型。
alter table…drop
alter table Student
drop class;
从表中将class这一列属性删除。