关于sqlsql基本语句大全or的一个最最基础问题,突然脑子短路~

& & & 时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻思着找些实习,充实下生活,也是为了将来而备战,目标定位在杭州,然而,杭州的Java实习并不多,大大小小投了十来个企业单位,面来面去,回答的基本上也算差强人意,今日得一闲暇,就最近被问到的一些问题一一罗列,继续努力吧!:
1、说出Object类的常用方法?&
答:这个问题,对于Java开发有经验的人来说,应该不难,至少也得说出5/6个方法的样子,然而,很显然,大部分在校生,并不知情,这个问题是上个学期年底面试百度的时候被问到的,当时有点懵逼,只说出了equals()方法、toString()方法,后来被面试官果真狠狠的指教了一番,于是很自然的印象深刻,估计着,以后的面试里是肯定不会忘记咯,其实要回答这个问题,只要我们能想到线程通信的方法,那就基本上没问题了,要知道线程之间进行通信那里可是有着三个方法呢,加上这里两个不就5个了嘛,完完全全的可以搞定面试官了,这三个方法就是:wait()、notify()、notifyAll()!哈哈,好了,废话不多说,总结答案如下:
protected Object clone()//创建并返回此对象的一个副本。
boolean equals(Object obj)//指示其他某个对象是否与此对象“相等”。
String toString()//返回该对象的字符串表示。
void wait()//在其他线程调用此对象的 notify() 方法或 notifyAll() //方法前,导致当前线程等待。
void notify()//唤醒在此对象监视器上等待的单个线程。
void notifyAll()//唤醒在此对象监视器上等待的所有线程。
int hashCode()//返回该对象的哈希码值。
Class&& getClass()//返回此 Object 的运行时类。
protected void finalize()//当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
这里每个方法用来做什么的,务必要搞清楚,比如说如果面试官让你对一个非基本数据类型的对象进行复制,但不能影响到原对象,这里我们要学会使用clone()方法,如此等等。。。
2、说出一些常用的类,包,接口,常见的runtime exception,请各举5个。&
答:此问题依旧是被百度面试官所提出,当时觉着就是小菜一碟,然而回答的时候,脑子确实突然短路了,平时写代码导入了那么多包,用过那么多类,妈蛋,一要说出口的时候才发现,真正是胸有沟壑万千,却不知道从何说起!于是稀里糊涂的道出常用的类有String类、StringBuffer类、Integer类,嗯当时是就说了这几个脑子就短路了,甚至还傻傻的怯怯的反问了面试官一句,这些算常用的类吗?记得,当时面试官没说啥,很自然的一笑了之,现在想想觉得也是逗了!接下来,我接着发挥,常用的包的话,java.lang、java.util、java.io、java.awt、java.sql,正待我说的兴致正浓时,面试官打断,说说常用的接口,瞬间懵逼,接口,幸亏瞬间想到集合框架,于是立马答道Map,List,本来想说Set的,后来想想打住了,但无奈想不起别的了,于是如实说,暂时就想起这些了,常见的异常,我直接说,数组越界、除0异常,数据库异常,面试官打断,用java,于是老老实实的冥思苦想,却发现啥都想不起来了,憋了半天总算憋出了一个NullPointException异常,紧张啊!回来后,立马总结语句:
常用的类:BufferedReader、BufferedWriter、FileReader、FileWirter、String、Integer 、StringBuffer、Stack常用的包:java.lang、java.awt、java.io、java.util、java.sql、javax.xml、java.NET常用的接口: List、Map、Document、NodeList、Remote&常见的异常:ArithmeticException&(a=5/0即数学运算中除0异常)ClassCastException (强制转换异常)NullPointerException(空指针异常,使用Null时)ArrayIndexOutofBoundsException(数组越界)StringIndexOutBoundsException(指示索引或者为负或者超出字符串大小)IndexOutOfBoundsException(下标越界)NegativeArraySizeException(创建大小为负的数组)IllegalArgumentException(传递非法参数)SecurityException(安全异常)NumberFormatException(数据格式异常,字符串-&数字)FileNotFoundException(文件未找到异常)SQLException(操作数据库异常)IOException(I/O输入输出异常)
3、说说你常用的数据结构?
答:何为数据结构?是说算法嘛,心里在想,在想,想说又不敢说(第一次面试,没有准备的面试,面的还是百度,别提有多紧张了),面试官见我是半天没坑出一句话,于是提醒了下,你平时用过集合框架没,额,瞬间醒悟,原来问的这个,于是滔滔不绝,将自己从某宝典中的记忆全部吸纳而出,总体上回答的还算不差(自我感觉,面试官也没刁难在这里),第二次在EMC再次被问到这个问题的时候,还算照着某宝典行云流水,然而,想象总是那么美好,期间,面试官,巧问了一句,你说HashMap和Hashtable之间一个是安全一个是不安全也就是线程同步和不同步,那么这个线程安全问题指的是什么?你能不能举个例子出来,其实这个问题并不难,难就难在我当时正沉浸在某宝典之中,根本想不到会有这么一问,所以稀里糊涂的回答了些,很显然,虽然回答的八九不离十,但面试官能从我脸上读出我说话的没底气!接下来总结下集合框架面试的大体如下:
首先我们要说的应该是对集合框架的理解,也可以当着面试官写下自己认为的集合框架结构图或者简图之类的,这里的具体的话,自己发挥!1、其次说说Collection和Collections,Collection是集合类的上级接口,即是java.util下所有集合类的父接口,继承于他的接口主要有List和Set;Collections是针对集合类的一个工具类,提供了一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。&2、List和Set是继承自Collection接口,而Map并不是继承自Collection接口;Set里的元素是不能重复的,可以用iterator()方法来区分重复与否!equals()是判读两个set是否相等, equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。&3、Collection框架中实现比较要实现comparable/comparator接口。&4、ArrayList和Vector的区别:&共同点:这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的,这是与HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素。&接着说ArrayList与Vector的区别,这主要包括两个方面:.&同步性:Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。&注意:这里谈到线程安全,同步问题,面试官少不了会多嘴说一句,让你讲讲线程安全是咋回事,如果不考虑,你听到这个问题估计会是一脸懵逼,我当初就是这样子的!所以这里我补充下线程安全的问题:&java中的线程安全就是线程同步的意思,就是当一个程序对一个线程安全的方法或者变量进行访问的时候,其他的程序不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问,否则将会造成错误发生;线程安全就是说,如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 线程安全问题都是由全局变量及静态变量引起的,定义在方法内部的局部私有变量是没有线程安全与否一说的。&备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。所以,我们讲课时先讲老的。&数据增长:ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。&总结:即Vector增长原来的一倍,ArrayList增加原来的0.5倍。&5、ArrayList,Vector, LinkedList的存储性能和特性:&ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。&6、List和Map的区别:&一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键(key)是不能重复的,它的值(value)是可以有重复的,存值采用 put(key,value)。Map中取值:value=m.get(key)(这个面试官常问,虽然不难,但也得注意)&7、HashMap和Hashtable的区别:&HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。&一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是1.2引进的Map接口的一个实现&二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的&三.值:只有HashMap可以让你将空值作为一个表的条目的key或value,即HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
4、String 和StringBuffer的区别?&
答:这个问题相对来说很容易,某宝典上有详细的解说,问到的时候,只要按照某宝典上来发挥就行了!这个问题是杭州某家网络公司问到的。。
String和StringBuffer类,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串,而这个StringBuffer类提供的字符串可以进行修改,所以当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。
另外,String类实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。(String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。)
5、关于线程的一些问题?
答:面试官一开始问我熟悉线程吗?我能怎么回答,总不能说不熟悉啊,多线程这玩意几乎都是各大企业面试官屡问不爽的问题啊,好吧,一接通电话,面试官进行了简单的自我介绍之后,无一例外的会问到关于线程的问题,所以多少准备些吧。
很典型的一个问题,你一般如何实现多线程,这个问题不用多说,很简单,java提供了两种方式,一个是继承Thread类,另一个是实现Runnable接口,由于java不支持多继承,所以在多继承的时候,我们得优先选用 实现 Runnable接口,因为我们可以通过实现接口的办法,间接的实现多继承!
另外还有公司问到,线程之间是通过哪些方法进行通信,这个其实在上面说到Object类的常用方法的时候已经提到过了,主要是三个方法,wait()、notify()、notifyAll()方法,解释的话就自己组织下就行咯,在这之前,有些HR会问你你通常如何启动线程,显而易见,start()方法!好吧,问到这里,其实线程问题也差不多了,不过有些面试官往往不知从何找话题,于是简单的问道,线程的生命周期,嗯这个只要我们想到OS中的进程就行了,差不多的,创建、就绪、运行、阻塞、消亡!
OK,不,好像还有个问题被问到了,线程池,这个问题我完全不知道,查了百科,也就大致了解了下,所以大家自己看看,我就不组织语言了,最后自己觉得线程中还有一个比较重要的东西,一个就是 interrupt()方法,一个是currentThread()方法,具体情况大家自己查看java API文档就好,我就不多解释了!
6、说说你常用的数据库?
答:每每问到这个问题,我总会一口气说完,mysql、sql server、oracle,当然是按照使用熟练程度,所以面试官就往往会往这方面提问,之前由于一直没接触到数据库存储引擎的问题,所以在被问到你用MySQL时,一般用的是哪种存储引擎(Engine)的时候,直接是一脸懵逼!我默默的问了句,什么是存储引擎?好吧,面试官也算是无解,就说现在一般都是用的InnoDB存储引擎吧。我只好在面完后,给自己做了下补充:MySQL常用存储引擎:InnoDB和MyISAM,其中InnoDB适用频繁维护的。修改 插入等的数据表,MyISAM适合少改写 少插入的读取频繁的表,那么显而易见,我们做开发的,肯定是InnoDB存储引擎用的多了!
嗯,大家肯定在想,难道没有面试官问你事务相关的嘛,No,几乎每个面试官都会问,事务是什么东西,那么我们首先要了解到的是,事务是并发控制的单位,是用户定义的一个操作序列,要么全做,要么不做,是一个不可分割的(通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令),主要是为了保证数据的完整性!好了,那么事务的特点呢,原子性、一致性、隔离性、持久性!(如果你想回答的更好那么把各个解释下吧:事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确)那么说了那么多,为什么需要事务呢?之前就说过,为了保证数据的完整性,对的,事务就是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。OK,那么我们就要知道Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。好了,那么我们平时一般怎么处理事务呢?spring的事务是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处是大大减少了代码量,提高了工作效率。
7、sql之left join、right join、inner join
答:说句实在话,自从辞职读研以来很久没有用过sql语句了,关于这几个连接光靠记忆的话,完全会是懵逼,幸亏自己还不算蠢,很自然的根据字面理解,我很好的回答了出来,left join就是返回包括左表中所有记录和右表中联结字段相等的记录,好了面试官会问你,那么如果A表中,有甲丙丁3条记录,B表中有甲乙丙丁4条记录,那么如果条件都满足的情况,A left join B 丙记录是否会被查出,答案是否定的!好了,right join就是和left join 相反的,inner join等值联结 只返回2表中联结字段相等的行!
8、sql优化
答:关于这个问题,我一直属于茫然状态,我不知道什么叫优化,不知道怎么样才算优化,记得第一次被问到的时候是在EMC的时候,当时我记得学数据库那会老师总会说尽量少的用的select *,尽量少用 distinct、group之类的命令,于是我就把这些说了上来,很显然,这不是面试官要的结果!哈哈,我就接着扯到写java代码的时候,我依稀记得preparedStatement可以缓存sql语句,下一次执行相同语句不需要再次解析,于是我就答了去,但可惜还是不是面试老大要的结果,之后经提醒,才拨乱反正,意识到索引这玩意,对啊,索引(DB中的索引是某个表中一列或多列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针)啊,主键(聚集索引)啊:一方面,建立索引提高查询速度;另一方面,把所有需提高查询速度的字段都加入聚集索引。最后啊,在sql中,尽量多的使用commit!
最后,这几天问的大概要代表性的问题都在这里吧,至于好多公司直接没怎么问java知识,直接给我问项目经验,一坨坨的论调,继续嘛,还有公司问到了OSI七层模型,让我把每层模型说出来,还有问我OS内存管理如何管理来的,这些我就不一一列举了,今天回忆起这些问题,一个方面,自己做个总结,另一个方面,大家一起共勉。。。
日21:28:09总结 by小仇哥
阅读(...) 评论()Oracle基本查询语法
本文含含: 基础/基本查询/排序/函数(单/多)
一.前言知识
1.oracle如何操作硬盘上的文件,最终都是以进程方式操作硬盘上的文件,最基本进程:读 写 ,还有其他客户端访问内存中的数据库实例,实例在内存中有很多块,小方块取决于客户端的个数,大方块叫做SGA:system global area 系统全局区域,一个内存实例只有一个,
小方块叫PGA:process global area 进程全局区域,(见图)
在写数据时,客户端操作的PGA先写到SGA,SGA再统一写到硬盘(分两阶段提交),可以减少访问数据库的次数,提高写入速度
2.oracle的事务提交之后,数据不一定会保存下来,临时表的数据是会被删除的
//回滚使用 ,需要事务,
Oracle开启事务是自动默认开启的,我们的操作本身就在事务中,
Oracle数据库事务默认是不自动提交.
oracle中事务提交后,也可以撤销,通过闪回方式(flashback) ,
mysql开启事务是手动开启, start transaction ,commit提交
MYSQL数据库事务默认是自动提交的.
二.语句基础知识
1.学前基础知识:
1.字符串大小写,日期格式,都有严格格式要求.
2.查看设置:
select * from v$nls_ //查看当前设置:字符集,日期格式 ........
修改: alter session/system set NLS_CALENDAR='yyyy-mm-dd'; //设置日期格式
Oracle显示会自动分页, 设置分页大小: set pagesize 20;
连接oracle:sqlplus scott/scott@192.168.200.128/orcl
select *//列出当前用户下的表和视图
spool d:\基本查询.txt //录屏语句,会把命令窗体的内容给记录下来
//查询当前用户
desc emp //查看表的结构
/ //表示执行上一条语句
host cls //Windows清屏
host clear //linux清屏
lsnrctl statusstart / //oracle的监听器状态 查看,启动或关闭
netca可视化监听配置
//查看当前显示的行宽
set linesize 150; //设置行宽
clo(colum缩写) ename for(format) a8 // 设置列宽, 此处设置名字(字符)这个列宽度为8, for表示格式
col sal for 9999; //设置数字的宽度 ,一个9代表一个数字,
set time on //可以让sql语句前显示时间,如下:
11:23:21 SQL& set time off
set timing on //可以开启时间记录,记录程序执行时间
2.字符串 :
字符串可以是select 列表中的一个字符,数字,日期; 日期和字符只能在单引号中出现,
双引号用于列的别名;
3.区分sql语句 还是sqlplus语句
sqlplus是oracle提供的命令行工具.在此工具中可以执行sql语句,
sql语句的关键词不能使用缩写,如select.insert,Update,delete都是sql语句,
sqlplus语句的关键词可以缩写,如 ed, c , for col ,desc,
isqlplus是sqlplus的网页版
4.修改错误语句:c代表change命令
//from输入错误, 修改错误字符如下:
第2行出错了, 输入:2 //回车;定位到第二行
输入: c/froo/from 回车, c /修改谁/改成谁
输入 / 执行上一条语句即可
5..乱码处理:
1.查看服务器端编码
select userenv('language')
我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK
2.执行语句 select * from V$NLS_PARAMETERS
查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否和第一步得到的值一样。
如果不是,需要设置环境变量.否则PLSQL客户端使用的编码和服务器端编码不一 致,插入中文时就会出现乱码.
3.设置环境变量
计算机-&属性-&高级系统设置-&环境变量-&新建
设置变量名:NLS_LANG,变量值:第1步查到的值, 我的是
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
6.修改oracle密码
1.管理员登录 : sqlplus system/
2.解锁: alter user scott account unlock/
3.改密码: alter user scott identified by 新密码;
7.用户查询
select * from dba_ 查看数据库里面所有用户,前提你是有dba权限帐号,如sys,system
select * from all_
查看你能管理的所有用户!
select * from user_ 查看当前用户信息 !
三.查询语句
1.,基本查询
select * //查询所有, * 表示所有
select empno,ename,job,mgr,hiredate,sal,comm, //通过列名查询指定列
select ename,job,
//算数计算
select empno, ename, sal,sal*12//查询工号,姓名,月薪,年薪
2..空值问题 :空值是无效的,未指定的,未知的或不可预知的值,不是空格或者0;
1.null永远 != null
2.包含null的表达式都为
因此判断一个值是否为空,不能用 = 或 != ;
enameis null; 或 ename i
3.如果集合中有空值,不能使用not in(set), 但可以使用 in(set)
oracle中,空值最大,因此降序排序空值在最前,升序则在最后,
降序使用 nulls last,会让null值排后面,
升序使用 nulls first ,会让空值排前面.
5.组函数(多行函数)自动滤空;可用滤空函数来屏蔽他的滤空功能
3..虑空函数: nvl(a,b) //即当a的值为空时,返回b, a不为空返回a本身,
//错误查询 奖金为空的人没有年收入: 查询员工,姓名,月薪,年薪,奖金,年收入
//select empno,ename,sal,sal*12,comm, sal*12+ //因为含null的表达式都为null
select empno,ename,sal,sal*12,comm, sal*12+nvl(comm,0) //正确查询,使用虑空函数
4..起别名:
select empno as "员工号", ename "姓名" ,sal 月薪 ,sal*12,comm,sal*12+nvl(comm,0) //as 用于起别名,可以省略!
//普通别名可以不加双引号, 若别名中有 空格/关键字/特殊字符/数字, 需要加"",
5.去重复记录:select
select distinctdeptno , //distinct 作用于后面所有列,这些列组合起来是不一样的,那就算是不重复的,
6.连接符: ||
concat函数 //连接字符串
select concat('Hello',' world'); //这是错的
// 由于oracle遵循sql99标准,没有from 不行,但from后面是表,如果操作的数据跟表没有关系,就使用 做占位符.
dual表,仅仅是为了满足oracle的语法要求,是伪表,占位用的,
同样有伪列; 如:
select concat('Hello',' world')//这是对的.
select 3+2
查询员工薪水:
select ename||'的薪水是'||sal 信息 //连接字符串,日期和数字只能用单引号,
7.where 语句若有多条件时,解析的顺序是从右往左.
因此,对于and条件,应该把为假的条件放右边,这样就不判断左边的了,,短路,提高效率
对于 or 尽可能把为真的条件放右边,
四.条件过滤
1.where条件筛选
select * from emp where ename='KING'; //字符串区分大小写
select * from emp where hiredate='17-11月-81'; //默认格式: DD-MM月-YY;(设置格式见上面)
2.比较运算: =, &, &=, &, &= , &&或!=
赋值使用 := 符号 如 : a number := 0 ; //变量名在前,变量类型 := 变量值
between.... and ... 在两个值之间,含边界, 必须小值在前,大值在后, 日期也是一样小值在前.
in(set) 等于值列表中的一个
like 模糊查询
is null ,判断空值
//查询薪水 在之间
select * from emp where sal&1000 and sal&2000;
select * from emp where sal
between 1000and 2000;
//查询10号20号部门的员工,或查询此2部门之外的员工
select * from emp where deptno
not in(10,20);
注: 3.如果集合中有空值,不能使用not in(set), 但可以使用 in(set)
select * from emp where deptno not in(10,20,null); //错误语句,
//模糊查询 % :表示任意个字符 _:表示一个字符
select * from emp where ename like 'S%'; //查询姓名s开头的员工;
select * from emp where ename like '____'; //查询姓名4个字的员工
//查询姓名含有"_"下划线的
使用 escape 声明 转义字符 ,习惯用 \ ,
select * from emp where ename like '%\_%'escape '\';
3.逻辑运算符 注:where 语句若有多条件时,解析的顺序是从右往左.
逻辑并or 逻辑或not 逻辑否
如: where condition1 and condition2
where condition2 and condition1 是两条不一样的语句 ,但结果一样,
3.排序order by 此句在select语句结尾
1.ASC 默认升序(ascend) DESC(descend)降序
order by 后面可以跟 : 列名, 表达式 , 别名 , 序号
select empno ,ename ,sal,sal*12 from emp order by sal*12 //表达式做排序条件
select empno ,ename ,sal,sal*12
年薪 from emp order by 年薪 //别名
empno ,ename ,sal, sal*12 from emporder by 4
//按序号, 序号须在有效范围内
2.. 多个列排序
order by 作用于所有列先按左边(最近) 排, 相同了,再按右边排
//降序只作用于最近列
select empno ,ename,sal,deptno from emp order by deptno, //默认升序
select empno ,ename,sal,deptno from emp order by deptno,//降序只作用于最近列
select empno ,ename,sal,deptno from emp order by
deptno desc,
排序的时候,列中如果有空值,采用降序,空值会排在前面,
原因:oracle中空值最大
解决: null last 或null last
select * from emp order by comm desc
单行函数:只对一行进行变换得到一个结果,如nvl(), concat()
多行函数:对多行操作产生结果,如:max()等
1.单行函数:
字符,数值,日期,转换,通用,条件表达式
1.字符函数 -单行
1.大小写控制函数:lower , upper , initcap(首字母大写)
lower('Hello world') 转小写,upper('Hello world') 转大写,initcap('hello')
首字母大写
2. 字符控制函数
concat(a,b) 连接拼接a,b两个字符串
substr 求一个串的子串 substr(a,b) 从a中第b位取到最后
substr(a,b,c) 从a中 第b位 取c个
length(s) / lengthb(s) 长度:字符数 /字节数
instr(a,b) 在一个串中查找子串 instr(a,b) 在a中查找b,返回下标;
lpad(a,b,c) | rpad(a,b,c) 左填充 右填充 对a填充, 填充b位, 用c填充
trim 去掉前后指定字符
replace(a,b,c) 替换a中的b,用c替换
select instr('helloworld','ll') //查找子串
select substr('helloworld',3,3) //截取子串
select length('被in个') 字符,lengthb('北京') 字节 //长度
select lpad('abc',10,'*') 左, rpad('asd',10,'*') 右 //左右填充
select trim('h' from 'helloh') //去掉前后指定字符
select replace('hello','l','*') //替换
2.数值函数-单行
round(a,b) 四舍五入,对a保留b位小数,
round(45.926,-1) 为50 , round(45.926,-2) 为0
trunc(a,b) 截断,保留几位小数, 对日期也可以截断
trunc(45.926,0)为45 trunc(45.926,-1) 为40 , trunc(45.926,-2) 为0
3.日期函数-单行
months_between(a,b) 计算两个日期差的月数
add_months(a,b) 向指定日期a 加上若干月数b
next_day(a) 指定日期的下一个星期几是几号
last_day(a) 本月最后一天
round(sysdate,'month') 日期四舍五入:按月四舍五入
trunc 日期截断
select now(); //mysql中查询当前时间
sysdate //查询当前日期
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') //日期和时间
1.日期运算: 只有加减 ,且不允许 日期+日期
select (sysdate-1) 昨天,sysdate 今天,(sysdate+1) 明天
2.计算员工的工龄: 天 星期 月 年
select empno,ename,hiredate,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期,(sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年
3.months_between(a,b) 计算两个日期差的月数
select ename,hiredate,(sysdate-hiredate)/30 ,months_between(sysdate,hiredate) from emp
add_months(sysdate,53) //53个月后的日期
next_day(sysdate,'星期三') //下一个星期三是几号
round(sysdate,'month'), round(sysdate,'year') 四舍五入
4.转换函数: -单行
1.隐式 :oracle自动完成数据类型转换
2.显式:手动完成,需要指定格式
to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day')
//把日期按格式转换成字符串,由于里面含文字,不是格式一部分,用""括起来
//查询员工薪水:两位小数,千位符,本地货币代码
to_char(sal,'L9,999.99') //把数字按格式转成字符串
5.通用函数-单行
1.nvl(a,b) 当a为空时,返回b, 通用于任何类型
2.nvl2(a,b,c) 当a为空返回c , 否则返回b
3.nullif(a,b) 当a=b时,返回null ,否则返回a,
4.coalesce(a1,a2,a3,...) 从左往右,找到第一个不为空的值
举例:select sal*12 + nvl2(comm,comm,0)
select nullif('abc','abc') 值
select nullif('abc','abcd') 值
select comm,sal,coalesce(comm,sal) "第一个不为null的值"
6.条件表达式-单行
在sql语句中使用if - else 逻辑
两种方式: case表达式:sql99的语法,类似basic,比较繁琐
decode函数:oracle自己的语法,类似java,简单
decode( 表达式, 条件1,值1,条件2,值2,...., default ) from 表;
举例: 1.select empno,ename,job,sal 涨前,
casejobwhen 'PRESIDENT'then sal+1000
when 'MANAGER' then sal+800
else sal+400
2. select empno,ename,job,sal 涨前,
decode(job,'PRESIDENT',sal+1000,
'MANAGER',sal+800,
sal+400) 涨后
2. 多行函数
分组函数作用于一组数据,并对一组数据返回一个结果
avg count max min sum
//组函数有自动虑空功能,不计算为空的内容,可以滤空函数来屏蔽他的滤空功能
count(distinct expr) //返回表达式非空且不重复的记录数
select sum(sal) //求工资总额
select count(*) //总人数
sum(sal)/count(*) 一,avg(sal) 二 //平均工资 两种方式
sum(comm)/count(*) 一,sum(comm)/count(comm)二,avg(comm) 三
//三种方式计算奖金, 后两中方式结果相同 , 因为只有4个人有奖金, 因为有null, 具体问题具体分析
select count(*), count(nvl(comm,0)) //结果相同了,虑空了
2.分组函数 group by
注:1.group by先按照第一个列分组;再按照第二列分组;以此类推
2.所有没有包含在组函数中的列,必须写在group by 后面, 不写group by则错
如 : select a,b,c 组函数(X) from 表
group by a,b,c,d;
//求每个部门的平均工资
deptno,avg(sal) from emp
//按不同部门的不同职位 计算总工资
deptno,job,sum(sal) from empgroup by deptno,joborder by 1;
3.having 过滤分组数据
1.where和having的区别:where后面不能使用多行函数
行已经被分组,使用了组函数,满足having条件的分组被显示
//按部门分组,求各部门平均工资
select deptno,avg(sal) from emp group by deptno having avg(sal) & 2000;
//查询10号部门的平均工资
select deptno,avg(sal) from emp group by deptno having deptno=10;
4.group by的增强
select deptno,job,sum(sal) from emp group by deptno,job
SQL& select deptno,sum(sal) from emp group by deptno
SQL& select sum(sal) from emp
上面三条语句的相加就是下面这条语句的结果
SQL& select deptno,job,sum(sal) from emp group by rollup(deptno,job)
SQL& group by rollup(a,b)
SQL& group by a,b
SQL& group by a
SQL& 没有group by
SQL& select deptno,job,sum(sal) from emp group by rollup(deptno,job);
break on deptno skip 2 //部门之间显示2个空行
/ //执行上一条语句
Oracle的基本语法和操作
ORACLE中的几大基本操作指令及其含义
数据定义语言(DDL):用于建立、修改、删除数据库的对象(对列操作)
1.CREATE:创建表或其他对象的结构
2.ALTER:...
Oracle语句大全
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql ser...
Oracle语法
一、.DDL语言(data definition language)数据定义语言1.建表 create
table2.操作表 alter
tablea.添加字段:alter
oracle最基本的操作语法
oracle数据库基本操作
insert intotable (column1, column2, …)
mysql与Oracle语法区别
int / DECIMAL
DECIMAL就是NUMBER(1...
----------------------------------------
帮助初学者掌握&em&oracle&/em&基本&em&语法&/em&,便于&em&oracle&/em&查找一些知识
*版权证明: 只允许上传png/jpeg/jpg/gif格式的图片,且小于3M
*详细原因:
交 &em&oracle&/em& sql &em&语法&/em&解析 3 积分 立即下载 ...
一、ORACLE的启动和关闭
1、在单机环境下
要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下
su - oracle
a、启动ORACLE系统
oracle&svrmg...
Oracle基础学习
系统全局共享区
system global area
(SGA):共享的内存空间,被看做数据库的一个大的缓冲池。可被oracle的各个进程公用。包括library 和 data dictiona...
没有更多推荐了,}

我要回帖

更多关于 sql基本语句大全 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信