010.简单查询、分组统计查询、多表连接查询(sql实例)

-------------------------------------day3------------

--添加多行数据:
--
--
--INSERT [INTO] 表名 [(列的列表)]
--SELECT UNION

--SELECT 'HAHA',1,32
--UNION ALL --全部显示/显示重复数据 即使集合相同
--UNION---------将查询的两个结果集合并。结构必须一致 -->常见面试题
--SELECT 'HEHE',2,33
------将查询结果添加到列表中(子查询)
INSERT INTO LESSON (CCODE,CNAME,CNUM)
SELECT 'C001','C#编程基础',32 UNION
SELECT 'C002','C#OOP',36 UNION
SELECT 'C003','C#PRAME',36
SELECT *FROM lesson


-------------------------------------------------------------------------------------------------------------------------------------------------

--实现表的数据备份(复制到其他表中)

--1 生成表 查询, SELECT INTO

--准备:查询

--select* from info
-- SELECT * ---负责列的显示
-- FROM info --数据的来源
-- WHERE -- 查询的条件 eg: WHERE CNAME='C#OOP'
--TRUE 显示 ,false
--WHERE birthday>'1990-01-01'
SELECT SEX FROM info
WHERE sex IS NOT NULL

SELECT SNAME FROM INFO
WHERE sname LIKE '%月%'

------备份 info 表到info——bak中
-- 1 INFO_BAK
-- 2 插入查询数据
SELECT *INTO INTFO_BAK FROM INFO --两个功能 创建新表 插入查询数据
--注意 约束不备份 标识属性备份(IDENTITY)
SELECT * INTO INFO_BAK1 FROM INFO
WHERE 1=2
--将info 表中的女同学信息备份到info_bak中

--INSERT INTO INTFO_BAK ( SNAME SEX BIRTHDAY [ADDRESS] TEL )
--SELECT SNAME,SEX, BIRTHDAY ,[ADDRESS] TEL FROM INFO WHERE SEX=0
---------DML数据操作语言
----SQL 基本技能

----insert 增加
-- 语法 insert [into] tab_name[(co1name,co2name....列的列表)]
--(表名)
-- values(val1,val2....值的列表与列的列表匹配),(),()---可以添加多行

--eg(添加表格中所有列的数据)
--1
insert into info (sname,sex,birthday,[address],tel)
values('赵明月',0,'1982-3-6','永济','15511122221')
select * from info
insert info
values('房租名', 1,'1980-2-25', '北京','010-13112345')
select *from info
insert info
values('金钱豹',1,'1970-5-9','天津','13412362322')
insert info
values('赵月',0,'1988-4-26','长沙市','03318658888')
insert lesson
values('S1001',' C#语言程序逻辑和实现',52)
insert lesson
values('S2099','.net平台于c#语言',56)
insert lesson
values('S2002','Winform编程',48)
insert lesson
values('S1015','c#面向对象程序设计',68)
insert lesson
values('S3001',null,null)
select *from lesson

--修改
-- 语法:UPDATE TAB_NAME SET COLNAME=VAL,CONLNAME1=VAL..........
--[WHERE] ---筛选行
--SELECT *FROM info
--UPDATE info SET sex=1,[address]='八组'
--WHERE sex IS NULL AND [address] IS NULL

--UPDATE info SET sname ='张清瑞', sex=0,[address]='八组一哥'
--WHERE snumb=1

-- UPDATE info SET [ADDRESS] ='BJHAIDIAN'
--WHERE [address] LIKE '010%'
--删除 DELETE(行)
--语法: DELETE [FROM] TAB_NAME
-- [WHERE 筛选行] -- 如果不写 所有行被删除
-- eg1 DELETE FROM INFO
-- WHERE SEX =0 删除女同学
-- eg2 DELETE INFO 删除表


-- TRUNCATE TABLE 截断表 过程 DROP TABLE ----> CREATE TABLE
-- 语法: TRUNCATE TABLE INFO

--常见面试题
-- Q:delete 删除表中数据是否记录日志,是否能恢复
--A:日志内容是对行数据的删除行为,可以恢复
-- Q:truncate table 是否记录日志,是否能恢复
--A: 在oracle数据库DDL操作不记录日志,不可以恢复;
-- 在sqlserver数据库 DDL操作被记录,记录的是数据页的操作 可以恢复
--Q:清空海量数据 DELETE 和 TRUNCATE TABLE 哪个效率高
--A:TRUNCATE TABLE 效率高,因为他是以数据页为单位删除和记录日志,所有相对于DELETE
-- 来讲它的操作和记录次数少,所以效率会更高


--查询

--1简单查询
--语法:SELECT 显示内容
-- FROM 数据来源(表,视图,结果集)
-- [WHERE 条件] --筛选行
-- [GROUP BY 分组]
-- [HAVING 分组条件]
-- [ORDER BY 排序 升序(默认)asc 降序 desc]
-- 基础知识:SELECT(只读操作 从数据文件中读取,临时存储在内存中)
-- 查询效率:(15seconds)
-- SELECT 重点:效率
--1.SELECT *(所有列) 不建议写,只需要部分列,*在底层需要解析(
--知道*涵盖了哪些列)需要时间 影响效率
--2.WHERE 条件(bool 类型) 默认为全表遍历的方式
-- <,>,=,<=,>=,!=
-- and or not
-- is null ,is not null
--like &,_,[],[^]
--BETWEEN AND , NOT BETWEEN AND
-- in() , not in()
-- 3. order by 排序 升序asc 降序 desc
-- 1.排序是发生在内存中,对查询结果集排序,尽量少在
-- 服务器上排序,能不用就不用.最好在客户端进行排
-- 序
-- 按照薪水排序
SELECT * FROM EMP
ORDER BY SAL DESC

--按表达式排序
SELECT * FROM EMP
ORDER BY SAL+ ISNULL(COMM,0) DESC
--按多条件排序 原理:如果第一个条件排序出现相同数据时,可以
--按第二个条件继续排序
SELECT * FROM EMp
ORDER BY SAL DESC, HIREDATA ASC
--4.TOP 结果集中的前n个
select top 3 * from emp
select top 20 percent * from emp
--eg 查询工资最高的5名员工
SELECT TOP 5* FROM EMP
ORDER BY SAL+ ISNULL(COMM,0) DESC
--5. DISTINCT 隐藏重复数据
SELECT DISTINCT JOB FROM EMP
--6. 别名
SELECT ename AS 姓名,job 工作岗位,上级=MGR,HIREDATE 入职时间 FROM EMP
--7. 按格式显示:员工:7369 姓名:smith 工作是:clerk
SELECT '员工:'+cast(empno AS VARCHAR(10)),'姓名:'+ename ,'工作是:'+job from emp
---将数据转成指定类型
--2分组统计查询:

------统计函数:聚合函数
--MAX() , MIN() ,SUM(), AVG(), COUNT()
--平均薪水 SELECT COUNT(*) ,AVG(SAL),MAX(SAL) FROM EMP
----COUNT(*),COUNT(列)
--当列有null的时候 不算数量 而count(*) 不会为null
--max(),min(),count(), 可以 SUM(),AVG() 不可以
--不行 where 语句后跟的是bool变量的条件
--如果SELECT 语句后有聚合函数,那么其他字段不能显示在SELECT后,
--除非该字段写在聚合函数中



-----------分组语句

SELECT * FROM EMP

---------统计每个部门几个员工
SELECT DEPTNO,COUNT(EMPNO) 人数 FROM EMP
GROUP BY DEPTNO
HAVING COUNT(EMPNO)>3 -----筛选组的条件,一定跟在GROUP BY 后面

-----------EG:统计每个部门薪水超过2000的人数,并显示此人数至少两人的部门

SELECT JOB,COUNT(EMPNO) 人数 FROM EMP
WHERE SAL>2000
GROUP BY JOB
HAVING COUNT(EMPNO) >=2

-----筛选顺序 WHERE(不能跟聚合函数) /GROUP BY / HAVING(常跟聚合函数,很少跟字段)

------------------- SELECT 后面可以跟分组字段和聚合函数

-------------------- 可以按多组分列分组 用,隔开


------------------------------------------------多表连接查询
--两个表连接查询 不一定要有主外键关系
-- 需要将多个表的数据综合显示,就需要将多表连接查询
--------1. 笛卡尔积(基础(关系代数)) 也称为:交叉连接结果集

SELECT * FROM EMP,DEPT
SELECT *FROM EMP CROSS JOIN DEPT

---------2.内连接([inner] join)

--两个表中关联字段相等的行

------eg 1.
SELECT * FROM EMP,DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO----------->内连接

SELECT * FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO AND JOB='CLERK'

--INFO LESSON SCORE
--1查询所有参加考试的同学的考试信息(考生姓名,参考科目,考试成绩)
--2将考试成绩及格的进一步查询出来
SELECT sname,cname,score FROM info,lesson,score
WHERE info.snumb=score.snumb AND lesson.ccode=score.ccode

SELECT SNAME,CNAME,score
FROM SCORE JOIN INFO
ON info.snumb=score.snumb
JOIN lesson
ON lesson.ccode=score.ccode

---------3.外连接
-------------左外连接:左表完全显示,右表显示与左表关联字段相等的行
-------------右外连接:右表完全显示,左表显示与右表关联字段相等的行

--eg
SELECT *FROM EMP LEFT JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO
-------------全连接 (原理:左表完全显示,右表完全显示,关联的相同部分只显示一次)
SELECT * FROM EMP FULL JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO
--------4. 自连接(常见笔试题)
--1如何判断自连接什么情况要用自连接
-------当同一列的值相互之间金星比较时
--2 自连接的使用语法(自己连接自己,一定要有别名)
SELECT * FROM EMP AS A,EMP AS B
--------------------

posted @ 2017-01-20 20:28  90后梦想大师  阅读(1067)  评论(0编辑  收藏  举报