zoukankan      html  css  js  c++  java
  • MySQL--基础SQL--DML

    1.插入记录

      INSERT INTO tablename

      (fields1, fields2, ..., fieldsn)

      VALUES

      (value1, value2, ..., valuen)

      例: 

        INSERT INTO emp

        (emp, hiredate, sal, deptno)

        VALUES

        ('zzxl', '2000-01-01', '2000', 1)

        可以不指定字段名称,但是 values 后面的顺序还应该和字段的排列顺序一致

      一次性插入多条记录

        INSERT INTO tablename

        (fields1, fields2, ..., fieldsn)

        VALUES

        (value11, value12, ..., value1n),

        (value21, value22, ..., value2n),

         ...

        (valuen1, valuen2, ..., valuenn)

      例:

        INSERT INTO emp

        (emp, hiredate, sal, deptno)

        VALUES

        ('zs', '2003-01-01', '2000', 2),

        ('ls', '2005-01-01', '2000', 3)

    2.更新记录

      UPDATE tablename

      SET   field1=value1,field2=value2,...,fieldn=valuen

      [WHERE CONDITION]

      例:

        UPDATE emp

        SET   ename='wem'

        WHERE  ename='zzxl'

      同时更新多个表中数据

      UPDATE t1,t2,...,tn

      SET   t1.field1=expr1,...,tn.field2=exprn

      [WHERE CONDITION]

      例:

        UPDATE emp a, dept b

        SET   a.sal=a.sal*b.deptno,b.deptname=a.ename

        WHERE  a.deptno=b.deptno

    3.删除记录

      DELETE FROM tablename

      [WHERE CONDITION]

      例:

        DELECT FROM emp

        WHERE  ename='dony'

      一次删除多个表的数据

      DELETE t1,t2,...,tn

      FROM    t1,t2,...,tn

      [WHERE  CONDITION]

      如果 FROM 后面的表名用别名,则 DELETE 后面也要用相应的别名,否则会提示语法错误。

      例:

        DELETE a, b

        FROM    emp a, dept b

        WHERE  a.deptno=b.deptno

        AND  a.deptno=3

    4.查询记录

      SELECT *

      FROM    tablename

      [WHERE CONDITION]  

      例:

        SELECT * 

        FROM    emp

      查询不重复的记录

      SELECT DINTINCT field1,field2,...,field3

      FROM    tablename

      [WHERE CONDITION]

      例:

        SELECT DISTINCT deptno

        FROM  emp

      条件查询

      WHERE 条件后面可以使用=, >, <, >=, <=, != 等比较运算符;多个条件之间还可以使用 OR, AND等逻辑运算符进行多条件联合查询

      排序和限制

      SELECT *

      FROM  tablename

      [WHERE CONDITION]

      [ORDER  BY field1 [DESC|ASC],

             field2 [DESC|ASC],

             ...

             fieldn [DESC|ASC]]

      DESC表示按照字段进行降序排列,ASC表示升序排列[默认排序].

      例:

        SELECT *

        FROM    emp

        ORDER BY sal

      部分显示

      SELECT ...

      [LIMIT offset_start, row_count]

      offset_start表示起始偏移量,row_count表示行数。

      默认情况下起始偏移量为0,只要写记录数就可以。

      limit经常和order by一起配合使用来进行记录的分页显示。

      聚合

      很多情况下,用户需要进行一些汇总操作,比如统计整个公司的人数或者统计每个部门的人数。这时就要用到SQL的聚合操作。

      SELECT [field1, field2, ..., fieldn] FUN_NAME

      FROM  table_name

      [WHERE CONDITION]

      [GROUP  BY field1, field2, ..., fieldn

       WITH    ROLLUP]]

      [HAVING where_condition]

      FUN_NAME表示要做的聚合操作,也就是聚合函数,常用的有sum, count, max, min等。

      GROUP BY表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在GROUP BY 后面。

      WITH ROLLUP 是可选语法,表明是否对分类聚合后的结果进行再汇总。

      HAVING关键字表示对分类后的结果再进行条件过滤。

      HAVING 和 WHERE 的区别在于,HAVING 是对聚合后的结果进行条件的过滤,而 WHERE 是在聚合前就对结果进行过滤,如果逻辑允许,我们尽可能先用

      WHERE进行过滤,这样因为结果集减小,将对聚合的效率大大提高,最后在根据逻辑看是否用 HAVING 进行再过滤。

      例:(统计各部门人数)

        SELECGT deptno, count(*) total

        FROM      emp

        GROUP BY deptno

      例:(统计各部门人数,及总人数)

        SELECT deptno, count(*) total

        FROM    emp

        GROUP BY deptno

        WITH ROLLUP

      例:(统计人数大于1的部门)

        SELECT deptno, count(*) total

        FROM    emp

        GROUP BY deptno

        HAVING total>1

      例:(统计公司所有员工的薪水总额,最高和最低薪水)

        SELECT SUM(sal), MAX(sal), min(sal)

        FROM    emp

      表连接

      当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。

      从大类上分,表连接分为内连接和外连接,他们之间最主要的区别是,内连接仅选出两张表中互相匹配的记录,

      而外连接会选出其他不匹配的记录。我们常用的是内连接。

      例:

        SELECT ename, deptname

        FROM  emp, dept

        WHERE emp.deptno=dept.deptno

      外连接又分为左连接和右连接。

      左连接:包含所有的左边表中的记录甚至是右边表中没有和他匹配的记录。

      右连接:包含所有的右边表中的记录甚至是左边表中没有和他匹配的记录。

      SELECT ...

      FROM    ...

      [LEFT|RIGHT] JOIN ... ON

      ...

      例:

        SELECT ename, deptname

        FROM  emp

        LEFT JOIN dept ON

        emp.deptno=dept.deptno

        SELECT ename, deptname

        FROM  dept 

        RIGHT JOIN emp ON

        emp.deptno=dept.deptno

      子查询

      某些情况下,当进行查询的时候,需要的条件是另外一个 SELECT 语句的结果,这个时候,就要用到子查询。

      用于子查询的关键字主要包括 IN, NOT IN, =, !=, EXISTS, NOT EXISTS

      例:

        SELECT *

        FROM  emp

        WHERE deptno

          IN (

          SELECT deptno 

          FROM    dept)

        如果子查询记录数唯一,还可以用 = 代替 IN

        对于不唯一的查询记录可使用limit控制查询记录为唯一。(有需求的话)

        某些情况下,子查询可以转化为表连接。

        表连接在很多情况下用于优化子查询。

      记录联合

      我们经常碰到这样的应用,将两个表的数据按照一定的查询条件查询出来以后,将结果合并到一起显示出来。

      这个时候就需要用到 UNION 和 UNION ALL 来实现这样的功能.

      SELECT *

      FROM  t1

      UNION|UNION ALL

      SELECT *

      FROM    t2

      ...

      UNION|UNION ALL

      SELECT *

      FROM    tn

      例:

        SELECT deptno

        FROM  emp

        UNION   ALL

        SELECT deptno

        FROM  dept

        

        SELECT deptno

        FROM  emp

        UNION  

        SELECT deptno

        FROM  dept

        UNION 和 UNION ALL 的主要区别是 UNION ALL是把结果集直接合并在一起,而 UNION 是将 UNION ALL 后的结果进行一次 DISTINCT,去除重复记录后的结果。

        使用的时候需要保持列数相同。

  • 相关阅读:
    bzoj1009
    bzoj1576 3694
    bzoj3143
    bzoj1391
    bzoj2729
    bzoj2653
    bzoj3261
    bzoj2326
    人件
    优秀的产品
  • 原文地址:https://www.cnblogs.com/microcat/p/6588993.html
Copyright © 2011-2022 走看看