搞定J2EE核心技术与企业应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 SQL语法介绍

前面讲解了如何安装和使用MySQL数据库,在此基础上,读者更需要了解的是SQL的基本语法,因为不管使用MySQL数据库,还是使用Oracle、DB2等数据库,都必须掌握SQL的语法。

3.3.1 SQL简介

SQL是结构化查询语言,英文全称是Structured Query Language。SQL包含以下4个部分。

● 数据查询语言:SELECT。

● 数据操纵语言:INSERT、UPDATE、DELETE。

● 数据定义语言:CREATE、ALTER、DROP。

● 数据控制语言:COMMIT WORK、ROLLBACK WORK。

SQL的前身是SQUARE语言,它是由IBM的圣约瑟研究实验室为其关系数据库管理系统开发的一种查询语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司于1981年推出以来,SQL得到了广泛的应用。1979年Oracle公司首先在商用的数据库中实现了SQL,紧接着IBM公司在DB2数据库系统中也实现了SQL。1986年10月,美国ANSI采用SQL作为关系数据库管理系统的标准语言(ANSI X3.135-1986),后被国际标准化组织(ISO)采纳作为国际标准。

SQL是一个非过程化的语言,SQL不要求用户指定对数据的存放方法。这种特性使用户更易将精力集中于要得到的结果。所有SQL语句使用查询优化器,它是RDBMS的一部分,由它决定对指定数据存取的最快速度的手段。查询优化器知道存在什么索引,在哪里使用合适,而用户从不需要知道表是否有索引,表有什么类型的索引。由于主要的关系数据库管理系统都支持SQL,用户可以将使用SQL的技能从一个RDBMS转到另一个,所有用SQL编写的程序都是可以移植的。

3.3.2 SQL基本语法

SQL的基本语法非常简单,网上相关语法的详细介绍有很多,因此本书只介绍一些简单的语法,主要是从查询、新增、修改、删除和创建这几个方面进行介绍。SQL查询的最基本形式如下:

      select – from – where–order by

代码说明如下。

● select,指定哪些栏位要列出来。

● from,要搜寻的表名称。

● where,指定要搜寻的条件。

● order by,指定哪些栏位要排序(ASC、DESC)。

示例代码如下:

      select  empno,name,phone
      from   DB.TBTEST01
      where sex ='M'
      order by empno

上述代码是针对一个数据库表进行操作的,SQL还允许对多个数据库表进行关联操作,查询语句中FROM后面接的是许多表名,查询语句中WHERE子句指定表间的关系,示例代码如下:

      select   db.tbtest01.empno,db.tbtest01.name,db.tbtest02.salary
      from      db.tbtest01,db.tbtest02
      where    db.tbtest01.empno=db.tbtest02.empno
      and       db.tbtest02.workdept='知识信息部'

注意:如果字段名称唯一,则可不加表名称,虽然不是必要,但可增加此查询语句的可读性。

对数据库表名进行重新命名的示例代码如下:

      select    x.empno,x.name,y.salary
      from     db.tbtest01 x,db.tbtest02 y
      where    x.empno=y.empno
      and      y.workdept='知识信息部'

对多个表进行查询时,除了在FROM后面直接列出表名外,还可以建立表之间的关系,比如:INNER JOIN,就表示只要两个被连接的表内有相同的值,即可根据该值内部连接两个表。INNER JOIN的示例代码如下:

      select    x.empno,x.name,y.salary
      from     db.tbtest01 x inner join db.tbtest02 y
      on       x.empno=y.empno
      and      y.workdept='知识信息部'

对表进行关联查询还有以下3种表示方法。

● Left Outer Join:含有在左表但无法在右表中找到对应的数据列。

● Right Outer Join:含有在右表但无法在左表中找到对应的数据列。

● Full Outer Join:含有以上两种情况的数据列。

SQL还提供了一些函数,比如求平均值、统计总数、最大值、最小值函数等,还可以在参数前加DISTINCT以删除重复数据。

示例代码如下:

      select workdept,count(*)as人数from db.tbtest02 group by workdept    各部门人数统计

使用group by字段将表中的数据按照一个或多个表达式的值分组,除group by字段及汇总字段外,其余字段不可选择(select),利用having子句过滤掉不需要的组,示例代码如下:

      select workdept,sum(salary)as salary
      from db.tbtest02 group by workdept
      having count(*)>=2

代码说明:

找出至少存在两条记录的部门工资总和。

当SQL语句同时含有where子句与having子句时,处理步骤是:用where子句先过滤掉不符合条件的数据列,然后用group by做数据分组,最后用having子句过滤掉不合格的组,示例代码如下:

      select workdept,sum(salary)as salary
      from db.tbtest02 where salaryym='200408' group by workdept having count(*)>=2

代码说明:

找出至少存在两条记录的部门2004年8月的工资总和。

SQL除了提供上述命令,还提供了其他一些命令,比如between、in等。在查询中,如果某列的数值在某个区间,则可使用between,示例代码如下:

      select * from db.tbtest02
      where salary between 60000 and 70000

它等价于:

      select * from db.tbtest02
      where salary >= 60000 and salary <= 70000

代码说明:

找出工资为60000~70000的员工。

在查询中,还经常会遇到要求表中列值是某几个值中的一个的情况,示例代码如下:

      select * from db.tbtest02
      Where workdept  in('知识信息部','财务部')

代码说明:

找出知识信息部、财务部的员工。

在查询条件中,还可以进行字符串匹配,下画线字符(_)表示任何单个字符;百分号(%)表示零个或多个字符的字符串,示例代码如下:

      select * from db.tbtest01
      where name like '刘%'

代码说明:

找出姓刘的所有员工。

在查询中还可以使用EXISTS,该查询不返回值,只是检验子查询的结果是否为空,并且返回“true”或“false”,示例代码如下:

      select name from db.tbtest01 as x
      where exists(select*from db.tbtest02 as y where  x.empno=y.empno and y.workdept='知识信
      息部')

代码说明:

找出知识信息部的所有员工。

前面讲解了如何从数据库中查询数据的语法,除了查询之外,SQL还可以添加、修改和删除数据。把一个或多个数据列写入表中的示例代码如下:

      insert into db.tbtest01 (compId,empno,name,sex,birthday,phone,
      address,modifyDate,modifyEmpNo)
      values  ('ejianlong','010203','张军','M','19790816','13645623856','浙江宁波北仑','20040910','010248')

所写入的数据列可以用一个实值表来表示,也可以是从数据库中查询的数据,示例代码如下:

      Insert  into  db.test1(no)select  no  from  test2;

代码说明:

子查询先被执行,执行结果再写入表中。

利用set子句对表中每个符合where条件的数据列进行更改;若无where,则表中数据列全部更改,示例代码如下:

      update   db.tbtest02
      set   salary=99999
      where empno='010123' and salaryym = '200408';

利用delete命令可以实现删除功能,符合where子句条件的数据都会被删除;若无where子句,则所有数据全部被删除,示例代码如下:

      delete  form DB.TBTEST01   where   empno='010203';

代码说明:

删除工号为010203的员工记录。

使用create命令可以建立一个新的基本表,指明表名与结构,包括组成该表的每一个字段名、数据类型,示例代码如下:

      create TABLE DB.TBTEST03 (
              compId VARCHAR (10) NOT NULL WITH DEFAULT '',
              empno VARCHAR (10) NOT NULL WITH DEFAULT '',
              name VARCHAR (40) WITH DEFAULT '',
              PRIMARY KEY(compId,empno)
          );