zoukankan      html  css  js  c++  java
  • 详解MySQL第二篇—DML语句

    DML 语句:

    DML 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查(select),是开发人员日常使用最频繁的操作。下面将依次对它们进行介绍。

    1.插入记录

    表创建好后,就可以往里插入记录了,插入记录的基本语法如下:

    INSERT INTO tablename (field1,field2,……fieldn) VALUES(value1,value2,……valuesn);

    例如,向表 emp 中插入以下记录:ename 为 zzx1,hiredate 为 2000-01-01,sal 为 2000,deptno为 1,命令执行如下:mysql> insert into emp (ename,hiredate,sal,deptno) values(‘zzx1′,’2000-01-01′,’2000’,1);

    也可以不用指定字段名称,但是 values 后面的顺序应该和字段的排列顺序一致(不推荐使用):

    mysql> insert into emp values(‘lisa’,’2003-02-01′,’3000′,2);

    技巧:对于含可空字段、非空但是含有默认值的字段、自增字段,可以不用在 insert 后的字段列表里面出现,values 后面只写对应字段名称的 value,这些没写的字段可以自动设置为 NULL、默认值、自增的下一个数字,这样在某些情况下可以大大缩短 SQL 语句的复杂性。

    例如,只对表中的 ename 和 sal 字段显式插入值:mysql> insert into emp (ename,sal) values(‘dony’,1000);

    在 MySQL 中,insert 语句还有一个很好的特性,可以一次性插入多条记录,语法如下:

    可以看出,每条记录之间都用逗号进行了分隔。

    下面的例子中,对表 dept 一次插入两条记录:mysql> insert into dept values(5,’dept5′),(6,’dept6′);

    这个特性可以使得 MySQL 在插入大量记录时,节省很多的网络开销,大大提高插入效率。

    2.更新记录

    对于表里的记录值,可以通过 update 命令进行更改,语法如下:

    UPDATE tablename SET field1=value1,field2.=value2,……fieldn=valuen [WHERE CONDITION]

    例如,将表 emp 中 ename 为“lisa”的薪水(sal)从 3000 更改为 4000:

    mysql> update emp set sal=4000 where ename=’lisa’;

    在 MySQL 中,update 命令可以同时更新多个表中数据,语法如下:

    UPDATE t1,t2…tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]

    在下例中,同时更新表 emp 中的字段 sal 和表 dept 中的字段 deptname:

    mysql> update emp a,dept b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;

    自此,两个表的数据同时进行了更新。

    注意:多表更新的语法更多地用在了根据一个表的字段,来动态的更新另外一个表的字段

    3.删除记录

    如果记录不再需要,可以用 delete 命令进行删除,语法如下:DELETE FROM tablename [WHERE CONDITION]

    例如,在 emp 中将 ename 为‘dony’的记录全部删除,命令如下:mysql> delete from emp where ename=’dony’;

    在 MySQL 中可以一次删除多个表的数据,语法如下:DELETE t1,t2…tn FROM t1,t2…tn [WHERE CONDITION]

    注意:如果 from 后面的表名用别名,则 delete 后面的也要用相应的别名,否则会提示语法错误。

    在下例中,将表 emp 和 dept 中 deptno 为 3 的记录同时都删除:

    mysql> delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;

    注意:不管是单表还是多表,不加 where 条件将会把表的所有记录删除,所以操作时一定要小心。

    4.查询记录(重点)

    数据插入到数据库中后,就可以用 SELECT 命令进行各种各样的查询,使得输出的结果符合我们的要求。由于 SELECT 的语法很复杂,所有这里只介绍最基本的语法:SELECT * FROM tablename [WHERE CONDITION]

    查询最简单的方式是将记录全部选出,在下面的例子中,将表 emp 中的记录全部查询出来:mysql> select * from emp;

    其中“*”表示要将所有的记录都选出来,也可以用逗号分割的所有字段来代替。“*”的好处是当需要查询所有字段信息时候,查询语句很简单,但是要只查询部分字段的时候,必须要将字段一个一个列出来。

    上例中已经介绍了查询全部记录的语法,但是在实际应用中,用户还会遇到各种各样的查询要求,下面将分别介绍。

    (1)查询不重复的记录。

    有时需要将表中的记录去掉重复后显示出来,可以用 distinct 关键字来实现:

    mysql> select ename,hiredate,sal,deptno from emp;

    (2)条件查询。

    在很多情况下,用户并不需要查询所有的记录,而只是需要根据限定条件来查询一部分数据,用 where 关键字可以来实现这样的操作。

    例如,需要查询所有 deptno 为 1 的记录:mysql> select * from emp where deptno=1;

    结果集中将符合条件的记录列出来。上面的例子中,where 后面的条件是一个字段的‘=’比较,除了‘=’外,还可以使用>、<、>=、<=、!=等比较运算符;多个条件之间还可以使用 or、and 等逻辑运算符进行多条件联合查询,运算符会在以后章节中详细讲解。

    以下是一个使用多字段条件查询的例子:mysql> select * from emp where deptno=1 and sal<3000;

    (3)排序和限制。

    我们经常会有这样的需求,取出按照某个字段进行排序后的记录结果集,这就用到了数据库的排序操作,用关键字 ORDER BY 来实现,语法如下:SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC] , field2

    [DESC|ASC],……fieldn [DESC|ASC]]

    其中,DESC 和 ASC 是排序顺序关键字,DESC 表示按照字段进行降序排列,ASC 则表示升序排列,如果不写此关键字默认是升序排列。ORDER BY 后面可以跟多个不同的排序字段,并且每个排序字段可以有不同的排序顺序。

    例如,把 emp 表中的记录按照工资高低进行显示:mysql> select * from emp order by sal;

    如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,以此类推。如果只有一个排序字段,则这些字段相同的记录将会无序排列。对于排序后的记录,如果希望只显示一部分,而不是全部,这时,就可以使用 LIMIT 关键字来实现,LIMIT 的语法如下:SELECT ……[LIMIT offset_start,row_count]

    其中 offset_start 表示记录的起始偏移量,row_count 表示显示的行数。

    在默认情况下,起始偏移量为 0,只需要写记录行数就可以,这时候,显示的实际就是前 n条记录,看下面例子:

    例如,显示 emp 表中按照 sal 排序后的前 3 条记录:mysql> select * from emp order by sal limit 3;

    如果要显示 emp 表中按照 sal 排序后从第二条记录开始,显示 3 条记录:mysql> select * from emp order by sal limit 1,3;

    注意:如果limit后面只有一个数字的时候指的是显示的行数。limit 经常和 order by 一起配合使用来进行记录的分页显示。

    注意:limit 属于 MySQL 扩展 SQL92 后的语法,在其他数据库上并不能通用,与SQL中TOP关键字类似。

    (4)聚合。

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

    对其参数进行以下说明。

    fun_name 表示要做的聚合操作,也就是聚合函数,常用的有 sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。

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

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

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

    注意:having 和 where 的区别在于 having 是对聚合后的结果进行条件的过滤,而 where 是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用 where 先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用 having 进行再过滤。

    emp表中的记录:

    例如,要 emp 表中统计公司的总人数:mysql> select count(1) from emp;

    在此基础上,要统计各个部门的人数:mysql> select deptno,count(1) from emp group by deptno;

    更细一些,既要统计各部门人数,又要统计总人数:mysql> select deptno,count(1) from emp group by deptno with rollup;

    统计人数大于 1 人的部门:mysql> select deptno,count(1) from emp group by deptno having count(1)>1;

    最后统计公司所有员工的薪水总额、最高和最低薪水:mysql> select * from emp;

    (5)表连接。

    当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。我们最常用的是内连接。

    例如,查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表 emp 和dept 中,因此,需要使用表连接来进行查询:mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;

    外连接有分为左连接和右连接,具体定义如下。

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

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

    例如,查询 emp 中所有用户名和所在部门名称:

    mysql> select ename,deptname from emp left join dept on emp.deptno=dept.deptno;

    比较这个查询和上例中的查询,都是查询用户名和部门名,两者的区别在于本例中列出了所有的用户名,即使有的用户名(dony)并不存在合法的部门名称(部门号为 4,在 dept 中没有这个部门);而上例中仅仅列出了存在合法部门的用户名和部门名称。右连接和左连接类似,两者之间可以互相转化,例如,上面的例子可以改写为如下的右连接:

    mysql> select ename,deptname from dept right join emp on dept.deptno=emp.deptno;

    (6)子查询。

    某些情况下,当我们查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就要用到子查询。用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists 等。

    例如,从 emp 表中查询出所有部门在 dept 表中的所有记录:

    mysql> select * from emp where deptno in(select deptno from dept);

    如果子查询记录数唯一,还可以用=代替 in:mysql> select * from emp where deptno = (select deptno from dept);

    ERROR 1242 (21000): Subquery returns more than 1 row

    mysql> select * from emp where deptno = (select deptno from dept limit 1);

    某些情况下,子查询可以转化为表连接,例如:mysql> select * from emp where deptno in(select deptno from dept);

    转换为表连接后:mysql> select emp.* from emp ,dept where emp.deptno=dept.deptno;

    注意:子查询和表连接之间的转换主要应用在两个方面:MySQL 4.1 以前的版本不支持子查询,需要用表连接来实现子查询的功能 表连接在很多情况下用于优化子查询

    (7)记录联合。

    我们经常会碰到这样的应用,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用 union 和 union all 关键字来实现这样的功能,具体语法如下:

    UNION 和 UNION ALL 的主要区别是 UNION ALL 是把结果集直接合并在一起,而 UNION 是将UNION ALL 后的结果进行一次 DISTINCT,去除重复记录后的结果。来看下面例子,将 emp 和 dept 表中的部门编号的集合显示出来:

  • 相关阅读:
    实现一个电话号码生成器
    SQL查询--关于查询的练习题
    SQL查询--内连接、外连接、自连接查询
    SQL查询--约束
    SQL查询--索引
    SQL查询--简单了解SQL(结构化查询语言)
    使用python做一个爬虫GUI程序
    postman(十二):发送携带md5签名、随机数等参数的请求
    对比3种接口测试的工具:jmeter+ant;postman;python的requests+unittest或requests+excel
    (四十八)c#Winform自定义控件-下拉按钮-HZHControls
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/6650489.html
Copyright © 2011-2022 走看看