基本的SQL-SELECT语句

讲之前我们先从整个角度看一下,学一门技术的时候,你要一点点的学,又要跳出来,以一个比较高的高度来

看这个东西,所以叫大出着眼,小处着手,那我们SQL的学习,主要包括哪些内容,我们先整体的来看一下这些内容,

SELECT的查询,很多人多少接触过一些数据库,或者没有接触过的,你可能听过这么一个词,增删改查,那增删改查

主要是对数据库的,比如像表,数据对象的操作,可以增加一条记录,删除修改一条记录,或者也可以查询一些记录,

那么当然增删改查里边,最重要的就是查,查 也是我们接触最多的一个操作,相当于都是进行一个查询的操作,涉及到

各种各样的,我们就不去细说,然后就是除了查询之外的增删改的操作,以及commit提交,rollback回滚,这样的一个操作,

叫数据处理,创建和管理表,创建和管理表什么意思呢,除了进行表数据的增删改之外,我们想这个表从哪里来的,或者这个

表我不要了,或者我想清空这个表,等等的一些操作,讲的都是表,约束说的是什么,就是这个表我在创建的时候,创建这个表的

时候,我可以给他加入一些约束,比如说某一列的值,一定是非空的,以及主键,外键,这样的信息我们都在约束中给大家讲,

除了表之外,还有 一个对象,叫视图,什么是视图,用来干什么用,怎么创建视图,除了视图之外,还有其他的数据库对象,

这个是我们整个给大家讲解,SQL语言的一个思路,一个框架,然后之后我们会讲PL/SQL,那么SQL和PL/SQL是我们整个数据库这一块

的一个学习,接着你就可以学JDBC了,可以通过JAVA语言,来操作数据库,当然这里是需要你嵌入SQL语句的,然后通过SQL语句,

JAVA语言和他结合起来,实现对数据库的一些处理,那我们就开始学习,学习之前,我们先看SQL初步,再从一个高观点上看一下SQL,

SQL结构化查询语言,又给他细化成如下的三块,DML,DDL,DCL,这个需要大家你来理解,DML是缩写,叫数据库操纵语言,DDL数据库

定义语言,DCL数据库控制语言,分别都有哪些操作

我们一个个来看,DML语言,就是我们刚才说的增删改查,他们四个操作,叫DML,当然查询是SQL的一个基础,

非常重要,所以我们花了6节的内容给大家讲解,那下一个叫DDL


DDL数据定义语言,包括创建表,修改表,删除表,包括其他的数据库对象,索引,新建索引,删除索引,

等等这样的一些命令,DROP,ALTER,CREATE,还有比如像TRUNCATE,属于DDL的,DDL的语言

什么叫DCL,我可以对数据库的修改,进行一个提交,进行一个回滚,还可以设置一下他的SAVEPOINT,

这都属于叫DCL,这三个是比较常用的,这个内容是什么,就是分别怎么来使用,我们会一点点的给大家来讲解,

相当于我们整个SQL这一块,我们讲完以后,我们再来看这个内容的话,这个说完以后我们就从头开始,先看第一节

SELECT语句

这是学习目标,基本的使用SELECT语句,然后了解SQL和SQL PLUS的区别,那就可以了

那我们就开始学习,你先使用SCOTT用户来登陆ORCL数据库,我们在上一节的学习当中,已经在我们自己创建的对象里,

添加了一些表,我们还进行过一个操作

select * from employees;

能够查询到employees这个表里边的,所有的数据信息,一共是107条,每一条的话有很多的列,比如说员工的ID号,first_name,

last_name,email,phone_number,hire_date雇佣的日期,还有job_id,他的工种,工资,这个叫奖金率,有没有奖金率,然后他的

Manager,老板的ID,以及他所在的部门,每条记录都有这样的一个信息,那么我们通过SQL语句的学习,不光是employees表,

还有locations表,departments表,等等,一共有哪些表,我们这里有一个excle的图,这个我做好的,大家你可以看一下,员工

表结构,我们添加的几个文件

这几个文件,我们用到的表就是这些,employees表,departments表,jobs表,locations表,包括job_grades这个表,

那每一个表里面有哪些列,这里都标识出来了,相应他们之间的关系,这个关系我们后面会说到,现在先不着急,然后

回来,那我想在这个表这里看一下,比如employees表都有哪些列的话,desc这个命令,

desc employees;

点回车

这里列出来了employees里面相应的列,就是我们看到刚才上面的,id,name,email,phoneNumber等等,

这些信息,相应的数据类型,以及存储数值范围的大小,都指定了,这个往后会一点点来讲解,那我们就开始讲select,

你需要先熟悉一下这个表的结构,熟悉一下表结构,这个你可以做一个参考,你也可以通过desc,这个命令来看一下

employees这个表的,都有哪些列,那么最基本的一个操作呢,就是我们刚才演示的,我想查询一个表中所有的列,

select * from employees;

有这个表他就给你列出来了,你要是说如果你写错的话

select * from employee;

少了一个s

他就会提示说表或视图不存在,这很好理解,那现在我来进行这样一个操作,查询这个表中所有的列,那如果仅需要查询

里面的某列或者某几列,我们可以这样写,假设我就想查询employee_id,每个员工的一个编号,以及last_name,再查一个

email,这三列

select employee_id,last_name,email from employees;

这样写就可以,我这里打了一个换行,select和from算是我们SQL里面的关键字,最好我们出现关键字的时候,就给他换行,

让那个可读性更强一点,实际上你写成一行也没有问题,这里就把我需要的查询的信息给展示出来了,这是我们今天讲的最

基本的,最基础的,也是比较重要的操作,select from 一个表当中,就是这个意思,select from这是一个基本的结构,这个结构

大家务必要掌握

这是查询特定的列,要查询的列是用列名,那这个列名一定是这个表里的,没有的话当然就会出问题

这里有个主意,说SQL语言大小写不敏感,可以写成一行也可以写成多行,这什么意思,就是我们刚才写的SELECT,

我们可以这样写,比如说department_id,还有说department_name,from有一个表叫departments这个表,

select department_id,depatment_name from departments;

这样我就查询到departments表的数据,select和from我们看成是关键字,他们的大小写是不敏感的,SQL语言是完全有别于

JAVA语言的,JAVA语言是严格区分大小写的,SQL是不区分的,是敏感的,可以写一行,也可以写多行,也就是说你刚才这个命令,

你可以给他加到后边,这样写,写一行,一行或两行都行,建议你写成两行,这样他的可读性会强一点,方便你看,现在代码短你

看不出来,一旦代码长的时候,你就给他换换行,跟JAVA是一样的,这个不需要多说,关键字不能缩写,也不能分行,关键字是谁,

SELECT和FROM,不能够缩写,换行就成了多个单词了,各字句一般要分行写,然后使用缩进提高可读性,这我们刚才说到了

这里有一个算术运算符,数字和日期可以使用的算术运算符,加减乘除,这个大家从一年级就开始学习了,

然后我们在JAVA当中讲数据类型的时候,也说到了有各种运算符,算术运算符,我们在SQL里面带着大家一起看一下,

算术运算符,比如说,一个简单的select,8乘以4,你任何的运算一定是有from的,那这儿你from哪儿,没有具体的表了,

那我就用一个伪表来代替,叫dual

select 8*4 from dual;

你也可以怎么着,desc我看一下employees的表结构

这里凡是标识为number的,都是数字,凡是标识为number的都是数字,凡是标识为date的,就表示日期,他说这两个

都是可以进行算术运算的,我们比如说写一个,select last_name,工资是不是number类型的,我看一下这个人的工资,

我想看一下这个人一年的工资,12*salary,然后年终给他发了一个奖金,每个人发1000,就这样写,然后from employees,

select last_name,salary,salary*12 + 1000 from employees;

这就出来了每一个人他的salary,他正常一个月的工资,以及12个月再加上奖金的,这里我们也可以看出运算级的优先,

先后顺序,先乘除,后加减,相应的有小括号的我先算小括号里面的,ed的全称其实叫edit,一点回车,我在这里面也可以进行编辑,

select last_name,salary,salary*12 + 1000,12*(salary+1000) from employees;

这两个是不是一个意思,显然不是,这里表示12个月的工资,然后整个基础上加1000,这里是每个月1000,

说明有小括号的先算小括号里面的,运算的优先顺序,这两个结果肯定不一样,后面的肯定多,这是我们说的salary,

number类型的,我们再来看一下日期型的,比如我们select,系统的sysdate,sysdate显示的是我们当天的时间,你也可以

sysdate+1,sysdate-2,然后from还是一个伪表

select sysdate,sysdate+1,sysdate-2 from dual;

这是今天,这是明天,这是前天,前两天,大家要注意,日期做加减,没有问题,日期不能做乘做除,

select sysdate*2 from dual;

他提示数据类型不一致,这个你先别管他


我们后边都会说,你想想,一个date型的函数,做个乘法,什么意思,根本没有任何意义,你要sysdate加个1天是明天,

减个1是昨天,减个2表示前天,你乘以个2表示什么,没有任何意义,所以说日期函数,乘是没有意义的,相应的你做除,

也是不能够做运算的,这个是需要大家来注意的一点,那我们接着往下,这是我们说的优先级的一个顺序,有括号的要

先算小括号里的

定义空值,空值是无效的,未指定的,未知的,不可预知的值,空值不是空格或0,

我们回来看一下这个概念叫空值

select * from employees;

这是这个表的所有的数据,COMMISSION_PCT有的是空的,有些是有值的,有空的也有值的,他表示的这个是什么概念呢,

就是每个月的奖金率,这里表示按每个月的百分之十来加,没有的就是相当于没有,但没有大家要注意,不意味着是0,

这个有点意思,你看我这样给大家操作一下

select employee_id,last_name,commission_pct from employees;

这里我们单纯拿出这几列来看一下,有的有,有的没有,那我想计算这个,name我不要了,我写成salary,我们来看一下员工的工资,

这是月工资,我看加上奖金以后的月工资

select employee_id,salary,salary*(1+commission_pct) from employees;

这是每个人每个月的工资,这里是算上奖金以后的工资,大家你看这个结果,或者我再加一个

select employee_id,salary,commission_pct,salary*(1+commission_pct) from employees;

应该能够注意到,凡是commission_pct有值的,后边一定有值,如果commission_pct是空的,这个结果竟然也是空,没错吧,

这就说明commission_pct,确实不是0,因为它如果是0的话,你想想你salary乘以1+0,这里应该写上你的salary,但是他没有写,

说明他不是0,这个概念需要自己理解一下,commission_pct不一定意味着是0,同时我们看到一个知识点,凡是commssion_pct

参与运算的,如果你要是为空,整个这个结果都为空,我们加一个注释,有别于JAVA中的,SQL中的两个短横线--,这个怎么写,

空值不同于0,凡是空值参与的运算,结果都为空,这个空你就可以用这个来表示,我们JAVA中是不是也有这个概念,null,

就是空呗,凡是null参与的,结果都是null,这个需要你记住

列的别名,我可以给这个列起个别名,我们直接来操作,我查询这样几个列,employee_id,last_name,

这都是我们employee里面有的这样的列的,我再查询员工一年的工资是多少,先忽略奖金率,12*salary,

然后from employees,这儿写的话分号就不用加了

select employee_id,last_name,12* salary from employees

运行,这儿我们看到了,当你这个查询的时候,他都给你标识了,这个叫employee_id,这个叫last_name,

这个叫12*salary,这个我觉得体验不太好,我想给这个起个别名

或者像前面的employee_id,感觉有点太长了,我就可以给你取个别名,这个别名在你相应列的后面,

不要加逗号,来一个空格,写上你想起的别名,我可以直接加到这儿,比如说就叫id,last_name就叫name,

salary我就起annual_salary

select employee_id id,last_name name 12*salary annual_sal from employees

就是年的工资

annual表示每年的,我再OK一下,大家注意到,此时这个名字就是用别名来标识的

 

id,name,annual_sal是我刚刚命名的,他这里默认的使用的大写,默认使用的是大写,第一种就是我们刚才说的这一种,

直接你在相应列的后面,来起上这个别名,列的别名,你也可以怎么着,在后面加上关键字,as,查询这列,使用id这个名查询

出来,这个as加不加意义不大,还是这个意思,就是可以省略,就是这个意思

 

你看id都是大写的,我们已经说了两种方式了,加不加as,有的人id默认就用大写的,我就想你用一个小写的来表示,

这个怎么办,这个就是我们要说的第三种方式,别名的第三种方式,加上双引号

select employee_id as "id",last_name name,12*salary annual_sal from employees;

此时加上的双引号,如果你是小写的,出来的就是小写,如果是大写的,出来的一定是大写

 

 

last_name我也可以给你命名一下,用双引号给他括起来,我就让你n首字母是大写的,我们看一下这个效果,

select employee_id  as "id",last_name "Name",12*salary annual_sal from employees

这里就让你小写,这里就让你首字母大写,这里因为你没有使用双引号引起来,所以默认全是大写

给列区别名的三种方式,不加as的时候一种,第二种加一个as,第三种你可以加上一个双引号,什么时候双引号一定得加,

一个你是想要以大写或者小写呈现的,你就用双引号,大小写不能改变,还有一种情况,像annual_sal,这是一个单词,没错,

如果我先做使用salary*12取个别名,这个别名是由两个单词构成的,那你现在这种写法肯定是错的

select employee_id id,last_name name,salary*12 annual sal from employees;

中间有空格,是分隔开的,那你如果想要整个作为一个别名的话,那你就需要给他加上双引号

select employee_id id,last_name name,salary*12 "annual sal" from employees

这样说明他的别名是annul sal,就是这种情况下,双引号是必须的,别名是多个单词构成的,这中间用空格隔开,

这个没问题

这就是我们讲的别名,第一种直接这样写,第二种加as,第三种加双引号,双引号又说了,这里按照你指定的格式,

如果有多个单词一定要加双引号

连接符,我们这里讲的东西稍微有点散,特别小细节点,我们刚开始学JAVA也是,学学基本的数据类型,

然后每种数据类型大小是多少,学学二进制十进制,再讲讲基本的运算符,都是稍微有点散的,越往后这个

集成率越高,知识点越明晰,我们看这个叫连接符的概念,连接符,他用于把列与列,列与字符连接在一起,

把列与字符连接在一起,用双竖线表示,其实这个,这个双竖线,我们之前没有讲过,但是,我说了一个但是,

你学JAVA的时候,你们是不是经常做这么一个事,或者这样说吧,我打印一个语句,

System.out.println(123+"hello"+123);打印一个什么,打印一个hello,加上123,我再写个123加上,我问这个

打印的结果在JAVA里面,应该是什么,是不是应该是这个,123hello123,这个是输出语句打印的结果,此时只要有

字符串参与运算的,就是用双引号括起来的,他和其他的数据类型,做运算的时候,这个符号就不是表示加了,而是表示

的连接符,就是将这两个连接起来,连接以后的结果,也是作为一个字符串出现的,他作为一个字符串又和123连接,

所以结果是他,那放在我们这儿,相当于在SQL当中不是用的加号了,用双竖线,表示的连接功能,也是以字符的,没错,

那我们写一个例子吧,比如我们想实现这个,你可以这样来查

last_name,以及每个人的job_id,from employees

select last_name,job_id from employees;

这儿查询的是两列,你可以分别给这两列取个别名,但是我现在想啊,我就想说,谁谁的工作是什么,

以一条的方式呈现,我们中间需要加一个连接符

select last_name || '`s job_id is || job_id from employees

键盘1左边的`,这样写,那么此时他能够默认

我们看看效果,这是我们想要的,这个人的工作是他

这儿只有一列,这个别名就没有什么别名,就是一个大厂串,你可以给他取个别名,as detail

select last_name ||'`s job_id is '||job_id as detail from employees

那么此时就有一个别名了

这个叫连接符,你也可以写成

select last_name || '`s email is '|| email as details from employees

后边有相应的练习,last_name||job_id as "Employees",就是一列的形式给他展示出来

每当返回一行的时候,字符串输出一次,就是刚才你操作的这个信息,当你每打印一行的时候,

每一条都有这样的信息,字符串可以是select列表中的一个字符,数字,日期,这个啥意思,

select last_name||'`s hire_date is '|| hire_date as details

如果你使用日期字符串的话,'`s hire_date is '这里是一个字符串,这个字符串在JAVA当中,是用双引号来包起来的,

表明是一个字符串,而在SQL这一块,我们用的是单引号,用单引号来表明这是一个字符串,同样hire_date也是用单引号,

来连接的,我们往后会说这个hire_date,用单引号来连接,这个是需要大家注意的,在SQL唯独哪里使用双引号呢,就是这,

我们刚才起别名,在别名的时候我们使用双引号

select last_name ||'`s hire_date is '|| hire_date as "details";

除此之外,你就记住,讲字符串,还是讲date,都是用单引号来连接的

然后重复行,第一节的概念比较散,需要你们来记忆一下,默认情况下,查询会返回全部的行,包括重复的行,

是这个意思,大家如果你要是打印这个信息

select last_name,department_id from employees;

这都是我们employees表里面的两个列,需要大家把这个表结构熟悉一下,我刚才打印的是这个,还有employee_id,

我们发现有些员工的部门是相同的,还是出来107条记录,这个如果还是说不明显,怎么就明显了,那这里给你删了

select department_id from employees;

是不是还是107条记录,这个记录里面确确实实有很多重复的,我想看一下这个员工工作的部门到底有几个,那你这样写肯定

不行吧,里边有太多重复了,我就想看有几个的话,得把我重复的给去掉吧,那么去重,使用的是这样一个命令

select distinct department_id from employees

把这个表里面重复的给他滤掉

刚才107个,现在12个,把所有重复的给滤掉了,最后一个有空的,说明啥,有个员工没有部门,

但是你跟重复的每个还不一样,所以算上他就是12个,那空的啥意思,可能这个人是个老板,

他自己就没有部门了,接着往后,有一个这样的一个概念,最后需要了解SQL和SQL PLUS的区别,

SQL PLUS是一个工具,我可以通过这个工具传送SQL语句给ORACLE服务器,根据你传入的SQL语句的

信息,比如说查询的,我可以将这个查询结果传给你,最后反馈给客户端

那这两个的区别我们说一下,这个SQL不用多说了,它是一种语言了,刚才我们说的基本的SELECT语句,

都是属于SQL的,关键字不能够缩写,使用语句控制数据库中的表的定义信息和表的结构,增删改查,创建,

清空表,全称在这,结构化查询语言,SQL PLUS是一种什么,是一种环境,我们刚才使用这个环境调用了SQL

命令,第一节的时候,这就是SQL PLUS,这是一个工具,它是一个环境,ORACLE的特性之一,关键字可以缩写,

这里也相当于我们也用这个环境,desc employees,我这前面是不是有一个desc,他这个desc,不是SQL的关键字,

它是SQL PLUS的关键字,SQL PLUS的


什么意思,就是SQL PLUS这个环境里面有一个关键字叫desc,他其实全称叫做describe,

describe employees;

翻译过来是描述,描述一下这个表的结构,他就将这个表里面的有哪些列,列的数据类型,大小,

desc这个命令可以缩写,那么缩写我们就缩写到desc了,你能des吗,

des employees

不能

这个就太短了,还有哪个,ed我们打开这个编辑框

这个ed也是SQL PLUS的关键字,他的全称叫edit

ed就是对他的一个缩写,e行不行,是不是不行,e太过分了,太多分不行,太短了,你至少得给个ed,有一个

环境叫做SQL PLUS,这个你不懂你别乱讲,你学过C,C是一门编程语言,c++是在C的基础上给他的一个扩展,

所以我们把c++叫做C plus plus,你别看到SQL,然后说SQL PLUS,SQL PLUS是SQL的一种升级,那就完蛋了,

工作的时候千万别这样说,显得你太业余了,c#,实际上是4个加,Mysql是数据库

显示表结构,全称叫做describe,我们整个这一节的内容就讲完了,通过这一节你要会什么,

就是select from,里面多了一个就是起别名,然后如何来删除里面重复的列,指定的列就是你要那一列就写哪一列,

select from这是最核心的结构,from哪个表,只要你学SQL,这个是太太基础了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值