select
-
2023年4月15日发(作者:android 4 1 2)SQL中select⽤法
select语句是是最常⽤的数据查询语句,我们通过例⼦来逐步了解它的使⽤。SELECT*FROMdepartments;
这条语句中有2个关键字(keywords)SELECT和FROM
其中*代表通配符号,表⽰departments表中的所有信息。
假设departments表中有如下四个字段:
department_id,department_name,department_age,department_job
那么我们可以认为SELECT*FROMdepartments;这个语句也就等同于SELECTdepartment_id,department_name,department_age,department_jobFROMdepartments;
所以,据此我们可以以此推断,如果我们只想检索department_name,department_age这两个字段,我们只需要将上述语句修改为:
SELECTdepartment_name,depatment_ageFROMdepartments;
注意:我们在书写SQL语句时需要知道如下基本常识。
1我们可以通过多⾏的书写来完成⼀条SQL语句,⽽不必要写成⼀⾏。
2SQL语句是不区分⼤⼩写的。
3关键字是不能分离或者简写的
4⼦句往往是另起⼀⾏书写的,这样做是为了增加可读性。
例如:SELECT
department_name,department_ageFROMdepartments;
5关键字通常是⼤写的,其他的如表名,字段通常⼩写
附加:table(表)的显⽰规则
通常情况下查询结束后,在iSQL-PLUS环境下,显⽰出来的查询结果具有如下特点。
1字段名通常是⼤写并且居中的。
2字符型和⽇期型数据通常是“左对齐”显⽰的
3数字型数据通常是“右对齐”显⽰的
4默认显⽰通常全部是⼤写
ArithmeticExpressions--计算扩展
在使⽤SELECT语句进⾏查询的过程中我们可以充分的利⽤⼀些简单的计算来丰富我们的查询⽅式与结果。例如:
SELECTlast_name,salary,salary+300FROMemployees;
在这⾥我们看到了salary+300这个emlpoyees表中本来不存在的字段。那么会出现什么样的查询结果呢?
我们很容易想到查询结果中会出现3列,他们分别是last_namesalarysalary+300
king100400
neil1000010300
......
在这⾥我们我们只需要注意⼀个问题,那就是字段名。很显然last_name,salary是我们在之前就已纪存在的字段,⽽
salary+300则是系统默认⽣成的。所以我们可以推断,如果我们不额外指定字段名,那么系统将⽤查询公式来充当默认的字段名。
如何指定⼀个新的字段名,或将原有的字段定义⼀个别名呢?我们在下⾯就会讲到。关于运算查询我们只需注意运算法则,相信这对中国学⽣来说并不是⼀个难事。
现在我们来讨论⼀下关于null的概念。我们对如下数据进⾏⽐较,null,0,spacenull代表什么都没有,它没有具体的值与之对应
0代表了⼀个实实在在的数字
space代表了⼀个空格,我们完全可以说它是⼀个字符型数据,使存在的。
任何⼀个数值和null进⾏and运算他的结果都是null,当然也包括*,/下⾯我们来看另外⼀条重要的语句:给字段(列)定义别名。
这个语句⾮常有⽤,可以有效地帮助我们检索并显⽰我们需要的信息。例⼦:
SELECTdepartment_nameASname,department_idIDFROMdepartments;SELECTdepartment_name"name",salary*12"Newsalary"FROMdepartments;
这两句话,甚⾄⼀句话中都有不同的写法,但表述的却是同⼀个意思。定义别名,关键字AS
,给列定义别名我们可以⽤as,当然也可以不⽤例如第⼀句中后半句,department_idID。。。这⾥我们就没有⽤as,但同样
是给department_id定义⼀个别名“ID”。
同样,我们也可以⽤双引号来定义别名,就像第⼆句⼀样。通过这样的语句,我们在看到的查询结果,列名就由原来的
department_name变成了name.....
这⾥还有⼀种SELECT的选择⽅式,连接选择。顾名思义,这个选择的意思就是将查询结果连接起来,⽽所⽤的符号是我们⾮
常常见的“||”,“或”运算。我们可以这么理解,全假则假,“或”是⼀个⼆元运算符,在这⾥只有当两个字段都为null时才会出现
null的查询结果,否则进⾏连接显⽰。
例⼦:SELECTdepartment_name||department_idAS"Information"FROMdepartments;
显⽰结果则会出现:king2003333
neil9998888等等。。。。。
如果出现department_name为空,⽽id不为空,则只显⽰id,反之只显⽰name.都为空则显⽰null.
所以,利⽤这个查询原理我们可以把查询变得更⼈性化。例如:
SELECTdepartment_name||'IDisa'||department_idAS"Information"FROMdepartments;
显⽰结果:kingIDisa2003333
这⾥我们只需要注意''中,空格是要按照⼀个字符来计算的。也就是说⼀个空格显⽰出来就是⼀个空格。
到这⾥。SELECT语句的⽤法基本差不多了。实践才是硬道理
我们先来讨论⼀下where语句。例如:
SELECTemployee_id,last_name,job_id,department_idFROMemployeesWHEREdepartment_id=90;
很明显,这是⼀条结构⾮常清晰的含有where⼦句的查询语句。我们在这⾥只需要注意⼀点,where⼦句中“=”号后⾯如果是数
字,我们可以直接写在=号后⾯,如果是字符串那么我们必须加上单引号''。另外在oracle中,默认的⽇期输出格式是DD-MON-RR
例如:wherehire_date='01-JAN-95'
wheresalary>=5000wherename='neil'
我们再来看⼀下BETWEEN....AND语句
这同样是⼀个条件控制语句,⽤于输出⼀定数值(也可以是字符串)范围内的查询结果例如:
SELECTlast_name,salary
FROMemployees
WHEREsalaryBETWEEN2000AND3000;
我们在这⾥需要注意的是,between..and仍然是where条件控制语句的⼀员,⼤家⽤得时候千万不要把where给忘了。哈哈
那么我们能⽤这样的语句来查询字符串类型数据呢?答案是肯定的
看这个例⼦:
SELECTlast_name
FROMemployees
WHERElast_nameBETWEEN'king'AND'neil';
这个例⼦就查询了⾸字母k和n之间的所有last_name的值。
现在我们遇到这样⼀种情况,现在我们需要查询manage_id=201,205,222的所有员⼯信息。现在我们知道的是,id为
201,205,222的员⼯远不⽌三个⼈,因为⼀个manage可以管理多个员⼯,所以就意味着多个员⼯可以拥有相同的manage_id......
在这⾥我们就可以使⽤条件语句where....in...来完成类似的查询了。例如:
SELECTemployee_id,last_name,salary
FROMemployees
WHEREmanage_idIN(201,205,222);
有⼈可以这样问,现在我们可以根据manage_id来限制这个查询,但如果我们只知道⽼板的名字呢?我们还能不能⽤这个语句
呢?
当然可以了例如:
SELECTemployee_id,last_name,salary
FROMemployees
WHEREmanage_idIN('neil','king','merry');
说到这⾥我们可以⽤⼀句话来概括这些类似的查询,其实就是他们的共同点:精确查询。⽆论是wherebetweenand,where
in这些都是给定了明确的查询条件的。那么下⾯我就来讲讲模糊查询。例如:
SELECTlast_name
FROMemployees
WHERElast_nameLIKE'S%';看到这⾥⼤家⼀定恍然⼤悟。。。
这⾥我们⽤到了2个新知识点,模糊查询的关键词LIKE和⼀个通配符%
like就不⽤多解释了,跟它的字⾯意思其实是⼀样的。
我们来看看通配符%
%代表了所有字符串的集合,但要分场合的,⽐如s%这⾥就代表s字母后⾯所有的字母,
⽽%s就代表s字母前⾯所有的字母了。
那么有没有什么符号能只代表任意⼀个字母呢?
肯定有的,那就是下划线_
例如:wherelast_namelike'_s%'
这就表⽰第⼆个字母是s的所有数据。
我们通过_,%,以及字母的组合会得到很多有趣的检索⽅式,⼤家就⾃⼰慢慢尝试吧!
下⾯我们再来看看null值查询。在数据表⾥通常存在很多null值,利⽤他们来进⾏检索通常是⼀个不错的办法例如:
SELECTlast_name,manage_id
FROMemployees
WHEREmanage_idISNULL;
当我们将查询进⾏下去的时候,我们会慢慢发现有时候单条件查询已经不能满⾜我们的需要,通常我们进⾏多个条件的叠加查
询,这时候我们就要引⼊oracle中的逻辑条件查询规则了。这⾥⼀共有三个逻辑限定条件,他们分别是:AND,OR,NOT
我们还是通过实例来分析这些查询条件,例如:
SELECTemployee_id,last_name,job_id,salary
FROMemployees
WHEREsalary>=1000ANDjob_idlike'%man%';
这⾥定义了⼀个需要同时满⾜salary>=1000和jobid中含有man2个条件的查询语句。相信⼤家不难理解。
AND就代表两个同时为真才为真,否则都为假!
再看这个例⼦:
SELECTemployee_id,last_name,job_id,salary
FROMemployees
WHEREsalary>=1000ORjob_idlike'%man%';
这个例⼦查询了满⾜salary>=1000或者jobid中有man两个条件中任意⼀个时的数据集合。
OR表⽰两个全为假时则为假,否则都为真!
再看not,这是⼀个⽐较特殊的逻辑表达,你可把他与between..and,in,like这些条件控制语句连⽤。例如:
SELECTlast_name,job_id
FROMemployees
WHEREjob_idNOTIN('IT_PROG','ST_CLERK','SA_REP');
下⾯我们来讨论⼀下or,and的运算优先级,我们来看下⾯的例⼦。
SELECTlast_name,job_id,salary
FROMemployees
WHEREjob_id='neil'
ORjob_id='lily'ANDsalary>=15000;
在这⾥,我们需要进⾏and运算,然后再进⾏or运算。换句话说我们查询的结果是包含有neil的数据,或者包含有lily,并且
⼯资〉15000的数据。现在我们变换⼀下
SELECTlast_name,job_id,salary
FROMemployees
WHERE(job_id='neil'
ORjob_id='lily')ANDsalary>=15000;
在这⾥我们加⼊了括号,这⾥就需要先进性or运算,然后进⾏and运算。
可见,and的优先级是⾼于or的。
现在我们来看另⼀个⽤于格式化数据输出的条件控制语句。ORDERBY
⾸先我们要注意的⼀点是,ORDERBY必须⽤在句⼦的最后。例⼦:
SELECTlast_name,job_id,department_id,hire_dateFROM
employees
ORDERBYhire_date;
这个句⼦的意思我们按照hire_date的次序来排列我们的查询结果(默认为升序)再看,如果我们想按降序排列呢?
SELECTlast_name,job_id,department_id,hire_date
FROMemployees
ORDERBYhire_dateDESC;
SELECTlast_name,job_id,department_id,hire_date"DATE"
FROMemployees
ORDERBYDATE;这个是按照别名排序(⾸字母从A--Z)
好了,⾄此,基本的知识点已经说完了。下⾯我主要来看oracle环境中,
iSQL*Plus下关于“替换变量”的问题。
想象⼀下,⾃⼰的⽼板不希望使⽤SQL来查询他所需要的数据,他只想⽤最简单的⽅法来快速的得到查询结果,⽽不是掌握繁
琐的SQL语句。
例如,他想只在界⾯中输⼊1200,就能得到所有⼯资>1200的员⼯信息。⽽这正是我们下⾯要讨论的问题。例⼦:
SELECTemployee_id,last_name,salary,department_idFROMemployees
WHEREemployee_id=&employee_num;
⼤家注意,这⾥&emplyee_num就代表⼀个变量,这个变量⽤于限制employee_id说的简单点。
如果你执⾏这个语句,iSQLPLUS会⾃动⽣成⼀个对话框,⾥⾯要求你输⼊employee_num
如果你输⼊100,那么这条语句就变成了:
SELECTemployee_id,last_name,salary,department_idFROMemployees
WHEREemployee_id=100;
哈哈,明⽩了吧。其实⾮常简单!这也是oracle⽐较独特的地⽅吧!
刚才的例⼦只允许我们输⼊数字,如果我们输⼊字符就会出现错误,因为id是被定义为数值类型的。那么我们能不能输⼊字符
来进⾏查询呢?当然可以啦!例如:
SELECTlast_name,department_id,salary*12
FROMemployees
WHERElast_name='&name';
这个时候我们就能输⼊字符进⾏查询了。因为last_name被定义为字符类型。再看看这个例⼦:
SELECTemployee_id,last_name,job_id,&column_name
FROM
employeesWHERE$condition
ORDERBY&order_column;
这个例⼦如需我们⾃⼰输⼊查询的列名,查询的条件,以及数据排列的格式!哈哈不错吧
下⾯我们看看如何让orcale强制显⽰变量被复值前后的变化SETVERIFYON
SELECTlast_name,department_id,salary*12
FROMemployees
WHERElast_name='&name';这⾥在执⾏后会出现如下语句
old3:wherelast_name='&name'new3:wherelast_name=neil
-
select