zoukankan      html  css  js  c++  java
  • 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
    --------------------

    关注90後梦想大师,梦想从未止步.
  • 相关阅读:
    JAVA中线程同步的方法(4种)汇总
    java
    指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。(解决问题总结)
    无法将类型为“System.Windows.Controls.SelectedItemCollection”的对象强制转换为类型“System.Collections.Generic.IList`1
    foreach---集合已修改;可能无法执行枚举操作。
    WPF_View中控件使用单例ViewModel
    判断s2是否能够被通过s1做循环移位(rotate)得到的字符串是否包含
    多列转1列 SqlServer 实现oracle10g的 wmsys.wm_concat()--for xml path('')
    异步对象(XMLHttpRequest)的帮助脚本
    在vs2010使用EF出现CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义
  • 原文地址:https://www.cnblogs.com/harveylv/p/6326613.html
Copyright © 2011-2022 走看看