在上一节,我们已经对数据库、表和SQL语句的概念有了基本的了解,本节进一步和大家一起学习如何编写和执行查询语句。
3.1 客户端工具
访问数据库(包括执行查询语句)需要借助工具,就像从井里打水需要绳子和水桶一样,在安装好数据库之后,数据库服务器都自带命令行工具,比如 Oracle 的 Sql*plus ,尽管这些命令行工具功能很强大,基本满足了我们操作数据库的需求,但为了更方便更友好的访问数据库,最好还是使用客户端工具,值得推荐的几款客户端工具有:连接访问 Oracle 的 PL/SQL Developer,连接访问 SQLServer 的SQL Server Management Studio, 而 Navicat Premium 功能比较丰富,可以连接 Oracle、MySQL、SQLServer、PostgreSQL 和 SQLlite 等多种数据库。
Navicat Premium 的官网地址为:https://www.navicat.com.cn,根据自己的计算机环境下载对应的软件版本(32位或64位),下载软件后双击按照提示一步步的安装即可。
3.2 什么是查询语句
查询语句(带 Select 关键字)也叫检索语句,也可以更直观的叫它 Select 语句,当我们想从数据库中获取一个或多个字段的结果集时,就需要使用到查询语句,查询语句是我们平时使用最多的 SQL 语句,简单的查询语句语法为:
Select 字段 From 表名
Select 语句大小写不敏感,就是说使用 SELECT STU_NAME FROM STUDENT
和 select stu_name from student
都能执行成功且结果相同。从以上查询语句可以发现,关键字与字段表名之间需要保留空格,空格可以是一个或多个,如果没有空格会导致执行错误。
值得说明的是,由于存在很多种数据库产品,而且不同数据库管理系统支持不同的 SQL 语法,但为了与 ANSI 标准相兼容,它们都以相似的方式支持一些关键字,比如:Select,Update,Insert,Delete,Drop,Where 等等。
ANSI是美国国家标准化组织的简称,它是一个核准多种行业标准的组织,该组织制定的SQL标准被称为ANSI SQL。1987年,国际标准化组织把ANSI SQL作为国际标准,ANSI SQL标准先后在1992、1999进行了修订,目前的标准为2011年修订的SQL-2011。
3.3 检索多个字段
上面例子中查询语句是用来查询学生表 ( student ) 中的姓名字段 ( stu_name ) ,如果希望同时返回学生表中的两个或多个字段,就需要这样来编写 SQL:
select stu_name,sid,age from student
当然,有时我们希望返回学生表中的所有字段,可以这样来编写 SQL:
select id,sid,stu_name,gender,age from student
当一个表中的字段很多时,比如十多个甚至几十个字段,我们将所有字段都完全拼写正确也不是件容易的事,数据库开发者考虑到我们会遇到这种场景,所以查询表中所有字段也可以这样来编写 SQL:
select * from student
带上 *
号的查询语句虽然给我们提供了很大的方便,但不建议经常使用,就像我们从箱子里取出乒乓球,一次取出所有的球肯定会比取出一只球要费力的多。
尽管数据库系统功能很强大,获取所有字段仍会消耗较多的资源,除非业务需要,尽量一次只取出必要的字段,并将字段名写在 Select 关键字后面。
3.4 执行多条 SQL
当多个 SQL 语句放在一起执行时,SQL 结束时是否加上英文分号;
在不同数据库系统中要求是不同的。在 SQLServer 中是可以不加的,数据库可以自动识别一条 SQL 语句在哪里结束,但在 PostgreSQL,MySQL 和 Oracle 是必须要加分号的。
为了增加 SQL 的可移植性,养成良好的编程习惯,建议每条 SQL 后面都加上分号,做到“有始有终”。
在 Oracle 客户端上执行多条 SQL 的例子:
最后那条 SQL 语句在这四种数据库(SQLServer、PostgreSQL,MySQL 和 Oracle)中都是可以不加分号的。
3.5 SQL 语句的注释
为了增加 SQL 语句的可读性,我们经常在 SQL 语句前面添加注释, ANSI 标准的注释符 --
用于单行注释,格式为:--注释内容
--查询课程名和学分
select cname,credit from course ;
多行注释使用/* */
。\*
用于注释文字的开头,*/
用于注释文字的结尾。
/*第一条SQL查询课程编号,课程名和学分
第二条SQL查选课学生编号和课程编号
*/
select cid,cname,credit from course ;
select cid,sid from elective ;
3.6 别名
与好朋友之间经常起绰号一样,我们也可以给字段或表名起别名,有时我们在检索数据时候,认为返回的字段名不够见文知意,这时,就可以将字段名重新命名,即起一个别名。来看个例子:
select a.cname as ‘Course_Name’ from course a ;
在上面的 SQL 语句中,表 course 的别名是 a ,字段 cname 被重新定义别名为 Course_Name。
字段的别名可以是中文也可以是字符串,来看个例子:
select cname as ‘课程名’ from course ;
也可以对函数处理后的字段进行重新命名:
select count(cid) AS ‘总课程数’ from course ;
尽管别名在 SQL 中可有可无,但为了增加可读性,还是建议为表设置别名,
3.7 SQL 执行顺序
在我们编写 SQL 语句时一般是按照 select、from 、 where 、 group by、having 、order by 等关键字的顺序,但数据库在执行 SQL 的时候,并不是按照这个顺序执行的,以查询年龄大于 29 岁学生为例,让我们进一步了解数据库执行 SQL 语句的顺序。
select sid,stu_name,age,gender from student where age > 29;
数据库首先要知道从哪张表中获取数据,即首先执行 from 关键字,得知从 Student(学生表) 获取信息后,进一步查看我们希望得到哪些数据,这时就要执行 where 关键字,从而过滤掉年龄小于等于 29 岁的记录数据,最后数据库从 select 关键字那里获取我们最终需要哪些字段的信息。
以上就是数据库执行简单 SQL 的大概顺序,是否与我们平时从 Excel 获取数据的操作顺序类似(打开Excel–>找到Sheet->筛选数据–>获取有效列)。然而数据库实际执行过程中,比这要复杂的多,我们在后面章节中会进一步阐述。
3.8 总结
通过本小节,我们了解了简单SQL的编写和执行,对SQL语句中一些专业术语也有了初步的印象。小节最后对SQL的执行顺序进行了说明,可能对于刚开始学习SQL的读者对SQL执行顺序还不能马上理解,但这并不影响下面章节的学习,可以暂时忽略该部分内容,继续下一小节的学习。