
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) );