讲之前我们先从整个角度看一下,学一门技术的时候,你要一点点的学,又要跳出来,以一个比较高的高度来
看这个东西,所以叫大出着眼,小处着手,那我们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,这个是太太基础了