SQL常见面试题
https://wenku.baidu.com/view/d695dc4c0a4c2e3f5727a5e9856a561253d32155.html
http://www.oh100.com/peixun/SQL/122901.html
https://wenku.baidu.com/view/8e49950e0e22590102020740be1e650e53eacf47.html
https://www.w3school.com.cn/sql/sql_functions.asp
SQL常见面试题
1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
A: select distinct name from table where name not in (select distinct name from table where fenshu<=80)
select name from table group by name having min(fenshu)>80
2. 学生表 如下:
自动编号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
删除除了自动编号不同, 其他都相同的学生冗余信息
A: delete tablename where 自动编号 not in(select min( 自动编号) from tablename group by学号, 姓名, 课程编号, 课程名称, 分数)
3.一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合.
你先按你自己的想法做一下,看结果有我的这个简单吗?
答:select a.name, b.name
from team a, team b
where a.name < b.name
4.请用SQL 语句实现:从TestDB 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。请注意:TestDB 中有很多科目,都有1 -12 月份的发生额。
AccID :科目代码,Occmonth :发生额月份,DebitOccur :发生额。
数据库名:JcyAudit ,数据集:Select * from TestDB
答:select a.*
from TestDB a
,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b
where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur
************************************************************************************
5.面试题:怎么把这样一个表儿
year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成这样一个结果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
答案一、
select year,
(select amount from aaa m where month=1 and m.year=aaa.year) as m1,
(select amount from aaa m where month=2 and m.year=aaa.year) as m2,
(select amount from aaa m where month=3 and m.year=aaa.year) as m3,
(select amount from aaa m where month=4 and m.year=aaa.year) as m4
from aaa group by year
*******************************************************************************
6. 说明:复制表( 只复制结构, 源表名:a新表名:b)
SQL: select * into b from a where 1<>1 (where1=1,拷贝表结构和数据内容)
Oracle:create table b
As
Select * from a where 1=2
[<>(不等于)(SQL Server Compact)
比较两个表达式。 当使用此运算符比较非空表达式时,如果左操作数不等于右操作数,则结果为 TRUE。 否则,结果为 FALSE。]
7. 说明:拷贝表( 拷贝数据, 源表名:a目标表名:b)
SQL: insert into b(a, b, c) select d,e,f from a;
8. 说明:显示文章、提交人和最后回复时间
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
9. 说明:外连接查询( 表名1 :a表名2 :b)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUTER JOIN b ON a.a = b.c
ORACLE:select a.a, a.b, a.c, b.c, b.d, b.f from a ,b
where a.a = b.c(+)
10. 说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f 开始时间,getdate())>5
11. 说明:两张关联表,删除主表中已经在副表中没有的信息
SQL:
Delete from info where not exists (select * from infobz where info.infid=infobz.infid )
*******************************************************************************
12.有两个表A 和B ,均有key 和value 两个字段,如果B 的key 在A 中也有,就把B 的value 换为A 中对应的value
这道题的SQL 语句怎么写?
update b set b.value=(select a.value from a where a.key=b.key) where b.id in(select b.id from b,a where b.key=a.key);
***************************************************************************
13.高级sql 面试题
原表:
courseid coursename score
-------------------------------------
1 Java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
-------------------------------------
为了便于阅读, 查询此表后的结果显式如下( 及格分数为60):
courseid coursename score mark
---------------------------------------------------
1 Java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
---------------------------------------------------
写出此查询语句
select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass') as mark from course
完全正确
SQL> desc course_v
Name Null? Type
----------------------------------------- -------- ----------------------------
COURSEID NUMBER
COURSENAME VARCHAR2(10)
SCORE NUMBER
SQL> select * from course_v;
COURSEID COURSENAME SCORE
---------- ---------- ----------
1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
SQL> select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass') as mark from course_v;
COURSEID COURSENAME SCORE MARK
---------- ---------- ---------- ----
1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
SQL面试题(1)
create table testtable1
(
id int IDENTITY,
department varchar(12)
)
select * from testtable1
insert into testtable1 values('设计')
insert into testtable1 values('市场')
insert into testtable1 values('售后')
/*
结果
id department
1 设计
2 市场
3 售后
*/
create table testtable2
(
id int IDENTITY,
dptID int,
name varchar(12)
)
insert into testtable2 values(1,'张三')
insert into testtable2 values(1,'李四')
insert into testtable2 values(2,'王五')
insert into testtable2 values(3,'彭六')
insert into testtable2 values(4,'陈七')
/*
用一条SQL语句,怎么显示如下结果
id dptID department name
1 1 设计 张三
2 1 设计 李四
3 2 市场 王五
4 3 售后 彭六
5 4 黑人 陈七
*/
答案:
SELECT testtable2.* , ISNULL(department,'黑人')
FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID
也做出来了可比这方法稍复杂。
sql面试题(2)
有表A,结构如下:
A: p_ID p_Num s_id
1 10 01
1 12 02
2 8 01
3 11 01
3 8 03
其中:p_ID为产品ID,p_Num为产品库存量,s_id为仓库ID。请用SQL语句实现将上表中的数据合并,合并后的数据为:
p_ID s1_id s2_id s3_id
1 10 12 0
2 8 0 0
3 11 0 8
其中:s1_id为仓库1的库存量,s2_id为仓库2的库存量,s3_id为仓库3的库存量。如果该产品在某仓库中无库存量,那么就是0代替。
结果:
select p_id ,
sum(case when s_id=1 then p_num else 0 end) as s1_id
,sum(case when s_id=2 then p_num else 0 end) as s2_id
,sum(case when s_id=3 then p_num else 0 end) as s3_id
from myPro group by p_id
SQL面试题(3)
1.触发器的作用?
答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
2。什么是存储过程?用什么来调用?
答:存储过程是一个预编译的SQL 语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL ,使用存储过程比单纯SQL 语句执行要快。可以用一个命令对象来调用存储过程。
3。索引的作用?和它的优点缺点是什么?
答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
3。什么是内存泄漏?
答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new 等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free 或者delete 释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。
4。维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
答:我是这样做的,尽可能使用约束,如check, 主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。
5。什么是事务?什么是锁?
答:事务就是被绑定在一起作为一个逻辑工作单元的SQL 语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID 测试,即原子性,一致性,隔离性和持久性。
锁:在所以的 DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
6。什么叫视图?游标是什么?
答:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
7。为管理业务培训信息,建立3个表:
S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号,学员姓名,所属单位,学员年龄
C(C#,CN)C#,CN分别代表课程编号,课程名称
SC(S#,C#,G) S#,C#,G分别代表学号,所选的课程编号,学习成绩
(1)使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名?
答案:select s# ,sn from s where S# in(select S# from c,sc where c.c#=sc.c# and cn=’税收基础’)
(2) 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位?
答:select sn,sd from s,sc where s.s#=sc.s# and sc.c#=’c2’
(3) 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位?
答:select sn,sd from s where s# not in(select s# from sc where c#=’c5’)
(4)查询选修了课程的学员人数
答:select 学员人数=count(distinct s#) from sc
(5) 查询选修课程超过5门的学员学号和所属单位?
答:select sn,sd from s where s# in(select s# from sc group by s# having count(distinct c#)>5)
SQL面试题(4)
1.查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列,完整的查询语句如下:
select top 10 * from A where ID >(select max(ID) from (select top 30 ID from A order by A ) T) order by A
2.查询表A中存在ID重复三次以上的记录,完整的查询语句如下:
select * from(select count(ID) as count from table group by ID)T where T.count>3
SQL面试题(5)
在面试应聘的SQL Server数据库开发人员时,我运用了一套标准的基准技术问题。下面这些问题是我觉得能够真正有助于淘汰不合格应聘者的问题。它们按照从易到难的顺序排列。当你问到关于主键和外键的问题时,后面的问题都十分有难度,因为答案可能会更难解释和说明,尤其是在面试的情形下。
你能向我简要叙述一下SQL Server 2000中使用的一些数据库对象吗?
你希望听到的答案包括这样一些对象:表格、视图、用户定义的函数,以及存储过程;如果他们还能够提到像触发器这样的对象就更好了。如果应聘者不能回答这个基本的问题,那么这不是一个好兆头。
NULL是什么意思?
NULL(空)这个值是数据库世界里一个非常难缠的东西,所以有不少应聘者会在这个问题上跌跟头您也不要觉得意外。
NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑上希望获得一个答案。您必须使用IS NULL操作符。
什么是索引?SQL Server 2000里有什么类型的索引?
任何有经验的数据库开发人员都应该能够很轻易地回答这个问题。一些经验不太多的开发人员能够回答这个问题,但是有些地方会说不清楚。
简单地说,索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。在SQL Server里,它们有两种形式:聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格。由于存在这种排序,所以每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。这个行标识符是一个指向磁盘上数据的指针。它允许每个表格有多个非聚集索引。
什么是主键?什么是外键?
主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(尽管可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。
什么是触发器?SQL Server 2000有什么不同类型的触发器?
让未来的数据库开发人员知道可用的触发器类型以及如何实现它们是非常有益的。
触发器是一种专用类型的存储过程,它被捆绑到SQL Server 2000的表格或者视图上。在SQL Server 2000里,有INSTEAD-OF和AFTER两种触发器。INSTEAD-OF触发器是替代数据操控语言(Data Manipulation Language,DML)语句对表格执行语句的存储过程。例如,如果我有一个用于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执行一个更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是我执行的更新语句则不会执行操作。
AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。
您如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?
这个与关系相关的问题有两个可能的答案。第一个答案(而且是您希望听到的答案)是使用外键限制。外键限制用来维护引用的完整性。它被用来确保表格里的字段只保存有已经在不同的(或者相同的)表格里的另一个字段里定义了的值。这个字段就是候选键(通常是另外一个表格的主键)。
另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。由于这个原因,微软建议开发人员使用外键限制而不是触发器来维护引用的完整性。
对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑?
你正在寻找进行与数据操控有关的应聘人员。对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。
你可以用什么来确保表格里的字段只接受特定范围里的值?
这个问题可以用多种方式来回答,但是只有一个答案是“好”答案。您希望听到的回答是Check限制,它在数据库表格里被定义,用来限制输入该列的值。
触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。因此,微软建议使用Check限制而不是其他的方式来限制域的完整性。
如果应聘者能够正确地回答这个问题,那么他的机会就非常大了,因为这表明他们具有使用存储过程的经验。
返回参数总是由存储过程返回,它用来表示存储过程是成功还是失败。返回参数总是INT数据类型。
OUTPUT参数明确要求由开发人员来指定,它可以返回其他类型的数据,例如字符型和数值型的值。(可以用作输出参数的数据类型是有一些限制的。)您可以在一个存储过程里使用多个OUTPUT参数,而您只能够使用一个返回参数。
什么是相关子查询?如何使用这些查询?
经验更加丰富的开发人员将能够准确地描述这种类型的查询。
相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。
SQL面试题(6)
原表:
courseid coursename score
-------------------------------------
1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
-------------------------------------
为了便于阅读,查询此表后的结果显式如下(及格分数为60):
courseid coursename score mark
---------------------------------------------------
1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
---------------------------------------------------
写出此查询语句
ORACLE : select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass') as mark from course
(DECODE函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数)
(SQL: select courseid, coursename ,score ,(case when score<60 then 'fail' else 'pass' end) as mark from course )
数据库基础(常用SQL语句)
一、数据库级及SQL语言简介
1、目前主流数据库
微软:sql server、access
瑞典:mysql
ibm: db2
sybase:sybase
ibm: informix
oracle: oracle
2、SQL语言
DQL-------------数据查询语言
select … From … Where
DML-------------数据操纵语言
insert、update、delete
DDL-------------数据定义语言
create、alter、drop
DCL-------------数据控制语言
commit、rollback、savepoint
二、数据库的数据类型(MySQL)
1、字符类型:
char类型:固定长度的内容,效率高。存储空间范围(1-2000)字节。
varchar类型:动态长度的字符类型,存储空间范围(1-4000)字节。
long类型:存储2G的文件大小。
2、数值数字类型:
3、日期类型:
三、基本Sql语句
1、表设计
创建表:
create table 表名 (字段 字段类型);
1
复制表结构及数据:
create table 新表 as select * from 旧表
1
复制表结构不需要数据:
create table 新表 as select * from 旧表 where 2<>2
1
查看表结构:desc 表名.
复制表数据:
insert into 目标表 select * from 参考表
1
伪表:系统中保留的虚拟表,不能更改,也不能删除。
名称:dual
通过伪表显示当前系统时间:select sysdate from dual;
1
2
查看指定用户下所有的表
SELECT table_name FROM all_tables WHERE owner = upper('用户名');
注意:用户名必须大写
1
2
2、操作字段
增加字段:
alter table 表名 add (字段名称 字段类型)
1
修改字段:
alter table 表名 modify (字段名称 字段类型)
注意:实际上大部分时间我们修改的是字段类型的大小,而不是类型本身,如果非在改成其它类型,则需要满足兼容性。或者把对应这列数据全部清除。
1
2
删除字段:
alter table 表名 drop column 字段名称
1
3、表约束
约束说明
NOT NULL 指定字段不能包含空值
UNIQUE 指定字段的值(或字段组合的值)表中所有的行必须唯一
PRIMARY KEY 表的每行的唯一标识,即主键
FOREIGN KEY 在字段和引用表的一个字段之间建立并且强制外键关系,即外键
CHECK 指定一个必须为真的条件
主键与唯一约束的区别:
1.主键只能有一个,而唯一约束可以有多个;
2.主键可以由一列或多列充当,但唯一约束只能一列一列创建;
3.主键不允许为空,而唯一约束在Oracle中可以多次为空,在SQL中唯一约束只能一次为空;
NOT NULL:此约束为行级约束,不在能表级约束中定义。
添加约束:
ALTER TABLE 表名 ADD [CONSTRAINT 约束标识名称] 约束类型(字段名称);
例:ALTER TABLE stu ADD CONSTRAINT stuid_pk PRIMARY KEY(stuid);
1
2
删除约束:
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE(字段名) | CONSTRAINT 约束名 [CASCADE]
例:ALTER TABLE stu DROP PRIMARY KEY;
1
2
3
-----------------------------------------------------------------
示例一:【创建表的同时指定约束】
create table 表(
字段 字段类型 CONSTRAINT 约束标识名称 约束类型;
);
示例二:【先创建表,后创建约束】
ALTER TABLE 表名 ADD CONSTRAINT 约束标识名称 约束类型(字段);
外键约束的创建:
alter table table_name add constraint cid_fk foreign key(cid) references classes(cid) 【on delete cascade】
(主-从)建表规则:
1.先create父表(要有pk或uk),再create子表(FK)
2.先insert父表,然后insert子表。
3.先delete子表,在delete父表。
4.先drop子表,在drop父表。
父表先于子表存在,子表比父表先消亡。
--------------------------------------------------------------
4、表查询
基本查询
语法格式:
select [列名],... from 表名
1
2
条件查询(where)
语法格式:
select [列名],... from 表名 where 条件
1
2
逻辑运算
操作符包括如下几种:
1、算术操作符:算术操作符包括加(+)、减(-)、乘(*)、除(/)
2、比较操作符:比较操作符包括 =、!=、<、>、<=、>=、BETWEEN…AND、IN、LIKE 和 IS NULL等
3、逻辑操作符:逻辑操作符包括与(AND)、或(OR)和非(NOT)。
4、集合操作符:集合操作符包括冻并集(UNION)、交集(INTERSECT)、剪集(MINUS)
5、连接操作符:|| 例:SELECT ename || ' is a ' || job FROM emp;
集合操作符:多用于数据量比较大的数据局库,运行速度快。
1). union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。
SELECT ename, sal, job FROM emp WHERE sal >3000
UNION
SELECT ename, sal, job FROM emp WHERE job = 'MANAGER';
2).union all
该操作符与union 相似,但是它不会取消重复行,而且不会排序。
SELECT ename, sal, job FROM emp WHERE sal >2500
UNION ALL
SELECT ename, sal, job FROM emp WHERE job = 'MANAGER';
3). intersect
使用该操作符用于取得两个结果集的交集。
SELECT ename, sal, job FROM emp WHERE sal >2500
INTERSECT
SELECT ename, sal, job FROM emp WHERE job = 'MANAGER';
4). minus
使用改操作符用于取得两个结果集的差集,他只会显示存在第一个集合中,而不
存在第二个集合中的数据。
SELECT ename, sal, job FROM emp WHERE sal >2500
MINUS
SELECT ename, sal, job FROM emp WHERE job = 'MANAGER';
(MINUS 就是减法的意思)
注意: 集合运算中各个集合必须有相同的列数,且类型一致,集合运算的结
果将采用第一个集合的表头作为最终的表头,order by
必须放在每个集合后
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
排序
语法格式:
select [列名],... from 表名 where 条件 order by 字段 (desc | asc)
说明:
DESC:表示按降序排序(即:从大到小排序)
ACS:表示按升序排序(即:从小到大排序)
1
2
3
4
5
函数
1、常用的系统函数
1.1 日期函数:
-ADD_MONTHS(d,f):指定时间d,推移f月,得到推移后的时间
d:指定一个时间(需要使用to_date函数转换)
f:在指定时间上推移多少个月
例:在“2010-05-12”时间上推移3个月后的时间
select ADD_MONTHS(to_date('2012-05-12','yyyy-mm-dd'),3) from dual;
-Months_between(d1,d2):显示两个时间相差的月份
d1:第一个时间
d2:第二个时间
注意:必须注意的是,d1与d2都为Date类型,不然会出现错误。
须用to_date('','') 来转换为日期格式,才能参加计算。
例:计算 2012-12-12 与 2012-2-12 相差的月份。
SELECT MONTHS_BETWEEN(to_date('2012-12-12','yyyy-MM-dd'),to_date('2012-2-12','yyyy-MM-dd'))
FROM dual;
-last_day(m):返回特定日期所在月份的最后一天
m:时间
例:计算“2010-10-12”所在月份的最后一天
SELECT last_day(to_date('2010-10-12','yyyy-mm-dd')) FROM dual;
-next_day(x,y)用于计算x时间后第一个星期y的时间。
例子,当前时间是2014-08-15
select next_day(to_date('2014-08-15','yyyy-mm-dd'),'星期二')from dual;
返回的结果是: 2014-08-19
-trunc(date,[fmt]):处理时间
date:一个日期值
fmt :日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去
例:
trunc(sysdate,'yyyy') --返回当年第一天.
trunc(sysdate,'mm') --返回当月第一天.
trunc(sysdate,'d') --返回当前星期的第一天.
trunc(sysdate,'dd')--返回当前年月日
trunc(sysdate, 'hh')--返回当前小时
trunc(sysdate, 'mi')--返回当前分钟
-trunc(number,[decimals]):处理数字
number: 待做截取处理的数值
decimals:指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分
例:
TRUNC(89.985,2)=89.98
TRUNC(89.985)=89
TRUNC(89.985,-1)=80
2、常用的字符函数:
-lower(string):转小写
用法:比如将字符“ABC”转为小写
select lower('ABC') from dual;
结果:abc
-upper:转大写
用法:比如将字符“abc”转为大写
select upper('abc') from dual;
结果:ABC
-length():长度函数
用法:获取字符“abc”的长度
select length('abc') from dual;
结果:3
注:长度是指字符串的长度 如“中国”为2 “ab”也为2
-substr(char,m,n):截取字符串
用法:将字符“abcde”中的“cd”进行截取
select substr('abcde', 3 ,2 ) from dual;
结果:cd
-replace(s1,s2):替换
用法:将字符“abcde”中的“c”替换为“123”;
select replace('abcde', 'c' ,'123' ) from dual;
结果:ab123de
-concat(s1,s2):拼接
用法:将字符“abc”与字符“de”拼接显示
select concat('abc','de') from dual;
结果:abcde
等价于: 'abc'||'de'
lpad( string, padded_length, [ pad_string ] ):指定长度,不够则填充
用法:将字符“abcde”以10个长度显示,左侧用“X”填充
select lpad('abcde',10,'x') from dual;
结果:xxxxxabcde
3、数字函数:
ceil:往上取整,与小数位的大小无关
floor:往下取整,与小数位的大小无关.
mod:取余。求模。
round:四舍五入。
trunc(m,n):
4、 转换函数:
-to_char:日期转化为字符串
例:
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;
select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年
select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月
select to_char(sysdate,'dd') as nowDay from dual; //获取时间的日
select to_char(sysdate,'hh24') as nowHour from dual; //获取时间的时
select to_char(sysdate,'mi') as nowMinute from dual; //获取时间的分
select to_char(sysdate,'ss') as nowSecond from dual; //获取时间的秒
select to_char(sysdate,'day') as nowSecond from dual; //获取时间的星期
-to_date:把字符串类型日期转换为date类型日期。
例:
select to_date('2014-02-11','yyyy-mm-dd') from dual
sysdata当前日期
-to_number:把某种类型转换为数字类型。
注意:如果字符类型的内容是数据,则可以实现自动转换为数字类型
5、 其它函数:
-NUL函数:把数字类型为null的值转换为0;
结构:
nvl(字段名称,0);
nvl(comm,0);
转换之后,可以实现算术运算。
-decode函数:
decode(参数一,参数二,参数三,....);
参数一:字段名称
参数二:参数一字段对应的内容。
参数三:把参数一字段对应的内容替换成其它的内容。
示例:select decode(JOB,'CLERK','业务员') from emp;
6、聚合函数:MAX、MIN、SUM、AVG、COUNT
-AVG :返回指定组中的平均值。
-COUNT:返回指定组中项目的数量。
-MAX:返回指定数据的最大值。
-MIN:返回指定数据的最小值。
-SUM:返回指定数据的和,只能用于数字列。
————————————————
版权声明:本文为CSDN博主「AIm锁锁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41751237/article/details/102303643
语法:
一步步由浅到深,这里用的都是mysql做的。
基础:
连接数据库:
mysql -h10.20.66.32 -uroot -p123456
1
-h后面是mysqlServer所在地址,-u后面是用户名,-p后面是密码。
查看数据库
show databases;
1
使用数据库
use test;
1
查看表
show tables;
1
查看表结构
desc winton
1
建表
create table t1(
id int not null primary key, name char(20) not null );
1
2
3
4
语法 create table 表名称( 字段名 字段名类型 字段描述符,字段名 字段类型 字段描述符);
删除表
drop table test;
1
语法:drop table 表名称;
修改表
添加字段
alter table t1 add(score int not null);
1
语法:alter table 表明称 add(字段名 类型 描述符);
移除字段
alter table t1 drop column score;
1
语法:alter table 表名 drop colunm 字段名,drop colunm 字段名;
变更字段
alter table t1 change name score int not null;
1
语法:alter table 表名 change 旧字段名 新字段名 新字段描述符
插入
全字段插入
insert into winton values(001,'zww'),(002,'rs');
1
语法:insert into 表名 values(字段1值,字段2值,……),(字段1值,字段2值,……);
个别字段插入
insert into winton(id) values(004);
1
查看插如后的结果,如上图所示。
语法:insert inton 表名(字段名) values(值一),(值二);
普通查询
单表全字段查询
select * from t1;
1
语法:select * from 表名;
单表个别字段查询
select id from t1;
1
语法:select 字段一,字段二 from 表名;
多表查询
select t1.id,t1.score,winton.name from t1,winton;
1
语法:select 表一字段,表二字段,表三字段,…… from 表一,表二,表三,……
条件查询
单表条件查询
select * from t1 where socre>90;
1
语法:select 字段1,字段2 from 表名 where 条件;
多表条件查询
select t1.id,t1.score,winton.name from t1,winton where t1.id=winton.id;
1
语法:select 表一字段,表二字段 from 表一,表二 where 条件;
嵌套查询
select name from winton where id=(select id from t1 where score=90);
1
语法:select 字段一,字段二…… from 表名 where 条件(查询);
并查询
(select id from t1 )union(select id from winton);
1
交查询
select id from t1 where id in (select id from winton);
1
删除
delete from winton where id=4;
1
语法:delete from 表名 where 条件;
更新
update t1 set score=69 where id=2;
1
语法:update 表名 set 更改的字段名=值 where 条件;
常用函数
求和
select sum(score) from t1;
1
注:sum(字段) 对字符串和时间无效
求平均值
select avg(score) from t1;
1
注:avg(字段)对字符串和时间无效
计数
select count(*) from t1;
1
注:count(字段名)不包含NULL;
求最大值
select max(name) from winton;
1
注:max(colunm)返回字母序最大的,返回数值最大的
求最小值
select min(name) from winton;
1
注:min(colunm)返回字母序最小值,返回数值最小值
常用的修饰符
distinct 字段中值唯一
select distinct name from winton;
1
limit查询结果数限制
select * from winton limit 2;
1
order by 排序
select * from winton order by name;
1
注:默认是升序
desc 降序
slelect * from winton order by name desc;
1
asc 升序
select * from winton order by name asc;
1
group by 分组
select name from winton group by name;
1
索引
创建普通索引
create index wintonIndex on winton (name);
1
语法:create index 索引名称 on 表名 (字段一,字段二,……);
创建唯一索引
create unique index wintonIndex on winton (id);
1
语法:create unique index 索引名 on 表名 (字段一,字段二,……);
ps:unique index 要求列中数据唯一,不能出现重复。
移除索引
drop index wintonIndex on winton;
1
语法: drop index 索引名 on 表名;
结尾
恩,基本能想起来的就值么多了,都是最基础,最常用的一些。
————————————————
版权声明:本文为CSDN博主「Zeus_龙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36381855/article/details/80008253
常用SQL语句
主要总结mysql一些常用知识点
[常用命令]
1、查看数据库
show database;
2、创建数据库
create database database_name;
3、切换数据库
use database_name;
4、查看某数据库中所有的数据表
show table;
5、创建数据表
View Code
6、查看数据表结构
describe table_name; --缩写: desc
7、查看数据表中的记录
select * from table_name;
-- 去重复select distinct name from table_name
8、往数据表中添加数据记录
INSERT INTO table_nameVALUES('puffball','Diane','hanst','f','1999-03-23',NULL);
-- 指定属性insert into user3 (name) value('asfjl');
9、删除数据
delete from table_name where name='puffball';
10、修改数据
update table_name set name='wang' where owner='haha'
11、建表约束--主键
View Code
12、建表约束--自增
create table user3(
id int primary key auto_increment,
name varchar(20)
);
12、建表约束--唯一:约束修饰的字段的值不可以重复
View Code
13、非空约束:修饰的字段不能为NULL
create table user6(
id int,
name varchar(20) not null
);-- 反null? 异常insert into user6 (name) value('jfsl');
14、默认约束
create table user7(
id int,
name varchar(20),
age int default 10
);
insert into user7 (id,name) value(1,'slfj');
insert into user7 (id,name,age) values(1,'slsfj',5);
15、外键约束
create table classes(
id int primary key,
name varchar(20)
);create table students(
id int primary key,
class_id int,
foreign key(class_id) references classes(id)
);
[查询]
1、多表查询
-- 两表查询select sname,cno, degree from student,scorewhere student.sno = score.sno;
-- 三表查询select sname, cname,degree from student,course,course,scorewhere student.sno = score.snoand course.cno = score.cno;
2、分组查询
-- 子查询加分组求评均select cno, avg(degree) from scorewhere sno in (select sno from student where class='1233')group by cno;
-- year函数与带in关键字的子查询select * from student where year(sbirthday) in (select year(sbirthday) from student where sno in (108,117));
3、多层嵌套查询
View Code
4、union与not in
View Code
5、any与all
-- any表示至少一个select * from score where cno='34'and degree>any(select degree from score where cno='334')order by degree desc;
-- all表示所有select * from score where cno='34'and degree>all(select degree from score where cno='334')order by degree desc;
常用SQL语句
写在前面
本文记录对表中数据的操作的基本SQL语句,以对数据库数据操作“增删改查”来覆盖复习SQL语句,对于数据库的创建、删除、和对表的创建、修改、删除不做记录,因为现在这个可以很高效方便的通过图形界面快速完成,所以本文仅仅记录一些数据操作的、逻辑性的数据操作SQL语句——数据的增、删、改、查,其中“查”为重难点,所以写在后面,详细记录。
建立一个简单的表来做实验 ,表中pers为person的简写,persId自动增长
增
增,即向数据表中插入数据或者说添加新的一条记录。
语句 :INSERT INTO ...
语法1:
INSERT INTO 表名称 VALUES (值1, 值2,....)
例子:
1 INSERT INTO person2 VALUES (1,'张华','男','阅读')
对于这种不在表名后面写出字段(属性)的插入方式,需要在VALUES值中添加所有的字段,包括可null的字段和自动增长的id字段都要添加进去,来看反例:
- 不在values中添加可自动增长的persId:
1 INSERT INTO person2 VALUES ('小华','男','编程')
- 不在values中添加可null字段
1 INSERT INTO person2 VALUES (3'小华','男')
语法2:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
例子
- 不添加ID(已经设置自增长)和不添加可null项,仅仅添加not null:
1 INSERT INTO person(persName)2 VALUES ('小华')
这个没问题,避免了语法1中的不足,在开发中更为灵活,但是要注意,写入的值对应好相对的属性,避免一些由于类型相同而错位的问题。
语法3:
在values的值一次加入多组
1 insert into students2 values (5,'李白','男',18),(6,'后羿','男',19),(7,'周哥','男',22)
改
改,即对数据中已有数据的更新、修改。
语句:Update...SET...
语法
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
以下是例子,一张修改前的表如下
执行修改:
UPDATE person
SET persSex = '男',
persHobby = '思考'
WHERE persId = 4
修改结果:
删
删,即删除,删除数据库中不用的数据,具体的是删除整个表(这里不写)、删除某条记录。
语句:DELETE
语法
DELETE FROM 表名称 WHERE 列名称 = 值
以下是一个栗子:
删除前:
执行删除
1 DELETE FROM person2 WHERE persId = 4
删除后:
查
查,即查询,通过一定条件限制,查询出符合要求的数据,查有很多技巧和用处,是重难点。
语句:SELECT
基本查询语句:
简单查询单个或多个属性:
SELECT 列名称 FROM 表名称
查询全部属性:
SELECT * FROM 表名称
基础查询
- 结果样式:order by排序 ASC:小到大,DESC:大到小;group by 分组、distinct去重
- 笛卡尔积:select * from table1,table2
- 模糊查询:like和 _ 和 %
- 统计处理:count()、avg()、sum()、max()、min()
- 条件限定:having 、where、in/not in和exists、between_and
- 属性、表重命名为新的属性、表:AS
- 运算符:> < = != or and not
- 查询某个属性并修改其值:select Freight + 10 as' 运费',name as' 姓名'将一个查询结果作为下一次查询的条件(例子:【查询1】 查询出雇佣日期比Margaret Peacock还晚的员工。(Employees)
1 select *2 from Employees3 where HireDate >(4 select HireDate5 from Employees6 where FirstName = 'Margaret '7 AND LastName = 'Peacock'8 )
将查询结果存储为一张新表
1 CREATE table mytableone AS 2 SELECT *3 FROM students,4 (SELECT student,classes,score5 FROM score_t6 WHERE score > 80) as R17 WHERE students.id = R1.student
高级查询
集合操作
- 并:union、union all(保留重复行),R U S,和并两表,要求两表的属性类型相同
- 差(defference),except,R-S,得出的结果是R中有的S中没有的行
- 交:intersect,两表共有的
连接 join(笛卡尔积的简化)
- 内链接 join,有的平台用 inner join
- 左外链接 left [outer] join,
- 右链接 right join
- 全外链接 full join
除(覆盖)运算
一、数据库操作
1、说明:创建数据库
CREATE DATABASE 数据库名
2、说明:删除数据库
drop database 数据库名
3、选择数据库
USE 数据库名
二、表操作
1、说明:创建新表
create table 表名(列名 类型 [not null:非空] [primary key:主键] [auto_increment:自增] [comment:备注],col2 type2 [not null],..)
2、根据已有的表创建新表:
create table 新表名 as select 列名1,列名2… from 旧表名
3、说明:删除新表
drop table 表名
4、说明:增加一个列
Alter table 表名 add column 列名 类型
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
5、说明:添加主键: Alter table 表名 add primary key(列名)
说明:删除主键: Alter table 表名 drop primary key
6、外键约束
alter table 外键表名 add constraint 约束名称 foreign key (外键字段) references 主键表名(约束列名)
7、说明:创建索引:create [unique] index 索引名 on 表名(列名)
删除索引:ALTER TABLE 表名 DROP INDEX 索引名
8、说明:创建视图:
CREATE VIEW 视图名 AS
SELECT 列名
FROM 表名
删除视图:DROP VIEW 视图名
三、说明:几个简单的基本的sql语句
选择:select * from 表名 where 范围
插入:insert into 表名(列名,列名) values(value1,value2)
删除:delete from 表名 where 范围
更新:update 表名 set 列名=value1 where 范围
查找:select * from 表名 where 列名 like ’%value1%’
总数:select count(0) as totalcount from 表名
求和:select sum(列名) as sumvalue from 表名
平均:select avg(列名) as avgvalue from 表名
最大:select max(列名) as maxvalue from 表名
最小:select min(列名) as minvalue from 表名
升降序
默认情况下,它是按升序排列。
升序 SELECT * FROM 表名 ORDER BY field ASC
降序 SELECT * FROM 表名 ORDER BY field DESC
分组 select 列名 from 表名 group by 列名
分页 select 列名 from 表名 limit Index(起始页数索引),page(显示几条数据)
子查询(表名1:a 表名2:b)
select 列名 from a where a IN (select 列名 from b ) 或者: select a,b,c from a where a IN (1,2,3)
外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
内连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a inner JOIN b ON a.a = b.c
2
添加约束
alter table 添加约束表名 add constraint 约束名称 约束类型 (约束字段)
删除约束
alter table 表名 drop constraint 约束名