SQL之增删改查

数据库的执行顺序:

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子句中只能放分组字段和聚合函数

三个注意事项
      (1.)不使用group by 分组时,select中出现了统计函数,则不能再同时查询字段了。因为不使用分组情况下,使用统计函数min等,就相当于所有数据是一个组
     (2、)在使用group by分组的查询中,select子句中只能放分组字段和聚合函数。
     (3、)统计函数可以嵌套,但是嵌套之后的select子句中只run许出现嵌套函数,而不允许出现任何字段,分组字段也不行。

正确写法: select MAX( AVG(sal) )   FROM emp GROUP BY deptno;
错误写法:select deptno,MAX( AVG(sal) )   FROM emp GROUP BY deptno;

因为select MAX( AVG(sal) )   FROM emp GROUP BY deptno;  
相当于select max(avvv) from (SELECT AVG(sal) avvv  FROM emp) GROUP BY deptno

我们都已经知道了max查询中是没使用group by的统计函数,所以不能在使用其他字段了  

子查询 

一、概念和书写方式

子查询(可以放在任意的子句中,充当条件)


自我思考:就把子查询(结果)当成一个数据或则一个多行多列的表就可以了。


书写规则:子查询一定是放到“()”里边,一般多放在

二、应用场景:最长出现在 where having 和 from子句中


1、where子句中:子查询的结果是单行单列(就相当于一个数据),

                              单行多列(一行数据),

                              多行单列(就是一个字段的数据范围)多和关键字IN / NOT IN,ANY,ALL,EXIST一起用。  

                                          ①  in操作指的是内容可以在定的范围之中存在。            

                                          ② ANY / ALL 的用法 是:where  字段 > ANY(1,2,3,4)。         

                                          ③ EXIST (子查询语句),它只关心是否有行数据返回,里边是什么数据不重要。NOT EXIST。

 

范例(单行多列):查询出与SCOTT工资相同,职位相同的所有雇员信息

SELECT *  FROM emp

WHERE (job,salary)=( select job,salary from emp where name='SCOTT' );

范例(多行单列)

SELECT * FROM emp

WHERE  salary IN ( select salary from emp where job='sale' );

范例(多行单列)

SELECT * FROM emp

WHERE  salary >  ANY ( select salary from emp where job='sale' );

范例(EXIST):EXIST子句查到行数据,则select * from emp.可以执行,否则返回null

SELECT * FROM emp

WHERE  EXIST ( select * from emp where name='ssss' );






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
2
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为4445的记录)  
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;

③此时要想到,哪个表是重要的表,是需要全部显示的,我们使用外连接上另外的表

select d.name,count(e.id),avg(d.salary);
 
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 


③此时要想到,将子句查询的最低工资作为条件,放入另一语句

select *
 
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这一列属性删除。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值