经过这段时间对SQL的基础学习,下面对自己的学习做个总结或者也可以说是个回顾吧!

我练习的是在oracle数据库平台上,并且安装了PLSQL Developer工具。下面是我从小白开始一路学习的回顾:

首先这是PLSQL Developer的登陆界面:

SQL SELECT 查询语法

基本查询:

SELECT  列名称  FROM  表名称

条件查询:

SELECT  列名称  FROM  表名称   WHERE  条件

条件排序查询:

SELECT   列名称   FROM  表名称    WHERE  条件   ORDER BY  

INSERT INTO  插入语句

基本插入语句:

INSERT INTO  表名称  VALUES (值1, 值2, 值3,. . .)

指定所需要插入数据的列:

INSERT INTO 表名称(列1, 列2, 列3, . . . )VALUES  (值1,值2,值3,  . . .)

UPDATE 更新语句

基本更新语句:

UPDATE  表名称  SET  列名称 =  新值   WHERE  列名称 = 某值

更新某一行的若干列:

UPDATE 表名称 SET 列1 = 值1, 列2 = 值2, 列3 = 值3,. . . WHERE  条件

DELETE 删除语句

按条件删除:

DELETE  FROM   表名称  WHERE  列名称 = 值

删除表的所有行:

DELETE FROM  表名称

或者:

DELETE  *  FROM  表名称;

默认情况下,我先是以管理员身份登陆,然后创建我自己练习的用户(jim)

那么是怎么来创建我的用户的呢?

CREATE USER 用户名 IDENTIFIED BY 密码
//创建新用户jim,密码就是changeit
CREATE USER jim IDENTIFIED BY changeit

创建好的用户是什么功能都木有的,哪怕是登陆的权限也没有,这时候我们就要给新用户赋予一定的权限

给用户赋予登陆的权限:

/*给用户赋予登陆的权限*/
GRANT CONNECT TO jim;

这时候,用户jim是可以登录的,但是它还是没有权限去操作数据库,表这些对象,哪怕它自己建一个表的权利也没有,

这时候我们再给他赋一个对象的权限,这样他就可以创建表了:

/*给用户赋予创建表等对象的权限*/
GRANT RESOURCE TO jim;

这时候我们jim用户就有了基本的功能了,这时候我们在退出原来的用户,用jim用户即可登录。

这里顺平提下删除用户的方法:

/*那么对应得删除用户我们顺便提下*/
DROP USER jim

一般情况下,这样会报错不删除,出发jim用户是空的,什么表也没创建,

如果jim用户创建表,我们可以在后面加casecode,表示把jim用户下的所有资源全部删除

/*如果jim用户下有创建表,或者其他对象,这样是删除不了,
我们在后面加个casecode就可以*/
DROP USER jim CASECADE;

好了,赶紧用我们的新用户来登陆吧. . . .

我们先来创建一个叫作Persons的表:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

对应的sql语句为:

/*创建Persons表*/
CREATE TABLE Persons(
Id number,
LastName nvarchar2(20),
FirstName nvarchar2(20),
Address nvarchar2(20),
City nvarchar2(20));

这样一个空的表就创建成功了,但是里面的内容是空的,这时候我们可以往表中插入数据

完整的字段插入:INSET INTO 表名  VALUES(值1,值2,值3,. . .);
/*往Persons表插入数据*/
INSERT INTO Persons VALUES(1,'Adams','John','Oxford Street','London');
INSERT INTO Persons VALUES(2,'Bush','George','Fifth Avenue','New York');
INSERT INTO Persons VALUES(3,'Carter','Tomas','Changan Street','Beijing');

这样我们插入的是完整的数据,当然我们也可以插入部分字段的数据,

部分字段插入:INSERT INTO 表名(字段1,字段2,字段3. . .) VALUES (值1,值2,值3 .  . . )
/*也可以给表中的部分字段添加数据*/
INSERT INTO Persons(Id,LastName,Firstname,City) VALUES(1,'Jiang','Jim','Dalian');

当然我们也可以修改表中的数据,比如我们修改FirstName为Jim的City为Wuyuan

UPDATE 表名 SET 字段1=新值 WHERE 字段1 = '某个值'
/*更新表中的数据*/
UPDATE Persons SET City = 'Wuyuan' WHERE FirstName = 'Jim';

再后来呢,我们可以删除我们不需要的数据,注意,删除数据需要特别小心

比如我们想删除某一行,一定要用WHERE加个限定,不然就真的是删除数据库跑路了.........

现在删除LastName = 'Jiang'这一行,我们可以这样写:

/*删除某一行数据*/
DELETE FROM Persons WHERE LastName = 'Jiang' ;

当然,你真的要删除所有,那就可以不用限定条件,直接把表中所有数据清空

/*清空数据*/
DELETE FROM Persons;

如果你要斩草除根,把数据连同表结构也一起删除,你可以这么干

/*章草除根,直接把表结构也删除的话就可以这么干*/
DROP TABLE Persons;

好了,三个单词一夜回到解放前,一无所有了 . . . .

In操作符

SELECT 字段名 FROM 表名称 WHERE 字段 IN (值1,值2,值3,值4,  . . .)

BETWEEN. . .AND. . .区间语法

SELECT   字段名  FROM   表名称  WHERE  字段名 BETWEEN  值1  AND  值n 

下面我们来创建一个时间维度表,假设表的名称为DIM_DATE

     D_ID      D_DATE             D_YEAR           D_QUARTER    D_MONTH     D_WEEK
20160723    2016/7/23           2016              Q3        JULE     SATURDAY
--设计日期维度表
CREATE TABLE DIM_DATE(
D_ID NUMBER(8) PRIMARY KEY, --
D_DATE DATE, --2016/7/23
D_YEAR NUMBER, --
D_QUARTER CHAR(2), --Q3
D_MONTH NVARCHAR2(15), --JULE
D_WEEK NVARCHAR2(15)); --SATURDAY

接下来我们可以往表中差数据,如果手工一条一条的插入数据,那将会要人命的,因此,我们可以写一个存储过程,可以从起始日期到结束日期

插入到数据表中,对对应的存储过程如下:

--创建存储过程,插入时间,从起止日期到结束日期
CREATE OR REPLACE PROCEDURE P_INSERTDATE(startDate NVARCHAR2,endDate nvarchar2)
AS
BEGIN
MERGE INTO DIM_DATE t1
USING (
select to_number(to_char(to_date(startDate,'YYYY-MM-DD')+(rownum-1),'yyyymmdd')) t_date from dual
connect by rownum<=(to_date(endDate,'YYYY-MM-DD')-to_date(startDate,'YYYY-MM-DD'))
) temp_date
ON(t1.d_id=temp_date.t_date)
when matched then
update set t1.d_date=to_date(temp_date.t_date,'YYYY-MM-DD')
,t1.d_year=to_number(substr(to_char(temp_date.t_date),1,4))
,t1.d_quarter='Q'||to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'Q')
,t1.d_month=to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'MONTH')
,t1.d_week=to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'DAY')
when not matched then
insert (t1.d_id,t1.d_date,t1.d_year,t1.d_quarter,t1.d_month,t1.d_week) values
(
temp_date.t_date,to_date(temp_date.t_date,'YYYY-MM-DD'),
to_number(substr(to_char(temp_date.t_date),1,4)),
'Q'||to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'Q'),
to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'MONTH'),
to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'DAY')
);
END;

其中注意的几点,我们先要获取某段时间,这时候我们可以这么写,

比如获取从2016年7月23日至2017年7月22日这段日期:

SELECT to_date('2016-07-23','YYYY-MM-DD')+ROWNUM-1 FROM DUAL CONNECT BY
ROWNUM <= to_date('2017-07-23','YYYY-MM-DD')-to_date('2016-07-23','YYYY-MM-DD');

结果:

在利用merge into即可在我们的时间维度表进行更新和插入。

1.用一条语句查出每门课都大于80分的学生姓名

NAME SUBJECT SCORE
张三 语文 85
张三 数学 90
李四 语文 76
李四 数学 100
王五 语文 69
王五 数学 95
王五 英语 88
--创建学生成绩表
CREATE TABLE SCORES(
NAME VARCHAR2(10),
SUBJECT VARCHAR2(10),
SCORE NUMBER);
--插入数据
INSERT INTO SCORES VALUES('张三','语文',85);
INSERT INTO SCORES VALUES('张三','数学',90);
INSERT INTO SCORES VALUES('李四','语文',76);
INSERT INTO SCORES VALUES('李四','数学',100);
INSERT INTO SCORES VALUES('王五','语文',69);
INSERT INTO SCORES VALUES('王五','数学',95);
INSERT INTO SCORES VALUES('王五','英语',88);

思路:先对学生按姓名进行分组(group by),然后过滤(having)

--用一条语句查出每门课都大于80分的学生姓名
SELECT t1.name FROM SCORES t1 GROUP BY T1.NAME HAVING MIN(t1.score)>80;

也可以这么写,先把成绩低于80的学生姓名查找出来,然后再筛选(not in)

--查出每门课都大于80分的学生姓名(2)
WITH temp AS
(SELECT DISTINCT t1.name FROM SCORES t1 WHERE t1.score<80) --先找出成绩有低于80的学生姓名
SELECT DISTINCT t1.name FROM SCORES t1 WHERE t1.name NOT IN(SELECT * FROM TEMP);

2.对下表进行转换

NAME SUBJECT SCORE
张三 语文 85
张三 数学 90
李四 语文 76
李四 数学 100
王五 语文 69
王五 数学 95
王五 英语 88
NAME 语文 数学 英语
张三 85 90 0
李四 76 100 0
王五 69 95 88
SELECT t1.name
,sum(decode('语文',t1.subject,t1.score))
,sum(decode('数学',t1.subject,t1.score))
,sum(decode('英语',t1.subject,t1.score))
FROM SCORES t1 group by t1.name order by 1;

SELECT t1.name
,SUM(CASE WHEN t1.subject='语文' THEN t1.score ELSE 0 END)
,SUM(CASE WHEN t1.subject='数学' THEN t1.score ELSE 0 END)
,SUM(CASE WHEN t1.Subject='英语' THEN t1.score ELSE 0 END)
FROM SCORES t1 group by t1.name;
--进行表的转换(pivot)
SELECT * FROM (
SELECT t1.name ,t1.subject,t1.score from SCORES t1 group by t1.name,t1.subject,t1.score)
PIVOT
(SUM(score) FOR subject IN('语文','数学','英语'));

SQL基础(一)的更多相关文章

  1. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  2. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  3. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  4. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

  5. [SQL] SQL 基础知识梳理(五) - 复杂查询

    SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...

  6. 黑马程序员+SQL基础(上)

    黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...

  7. Oracle SQL 基础学习

    oracel sql 基础学习 CREATE TABLE USERINFO ( ID ,) PRIMARY KEY, USERNAME ), USERPWD ), EMAIL ), REDATE DA ...

  8. 第一章 SQL基础

    第一部分:SQL基础1. 为什么学习SQL自人类社会形成之日起,社会的运转就在不断地产生和使用各种信息(文献.档案.资料.数据等):在如今所谓的信息时代,由于计算机和互联网的作用,信息的产生和使用达到 ...

  9. SQL基础--&gt; 约束(CONSTRAINT)

    --============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完 ...

  10. SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)[转]

    --====================================================== --SQL基础-->层次化查询(START BY ... CONNECT BY ...

随机推荐

  1. postgresql 数据库,模式,表空间的关系

    数据库与模式模式(schema)是对数据库(database)逻辑分割在数据库创建的同时,就已经默认为数据库创建了一个模式--public,这也是该数据库的默认模式.所有为此数据库创建的对象(表.函数 ...

  2. Rails的静态资源管理(五)—— 自定义 Asset Pipeline

    官方文档:http://guides.ruby-china.org/asset_pipeline.html http://guides.rubyonrails.org/asset_pipeline.h ...

  3. C#字符串全排序

    排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 ...

  4. IC卡和RFID卡的区别(网上说的都不准确)

    其实IC卡是卡类型的称呼,IC卡和RFID卡不应该在一起对比的,和IC卡在一起对比的应该是ID卡. RFID卡是其实是对卡技术类型称呼. IC为卡类型称呼(Integrated Circuit Car ...

  5. Ubuntu16.04 Hadoop2.6.0伪分布式安装与启动中遇到的问题

    1.安装JDK1.8,下载安装包解压至 /usr/lib/jdk vim /etc/profile #配置路径 export JAVA_HOME= /usr/lib/jdk export JRE_HO ...

  6. 管理linked break-off snapshot

    1. 建立linked break-off snapshot   (1) 建立原卷 #> vxassist -g APS2_AFC_DG make vol1 4096000 #> vxpr ...

  7. SpringMVC工作原理图解

    SpringMVC的工作原理图: SpringMVC流程 1.  用户发送请求至前端控制器DispatcherServlet. 2.  DispatcherServlet收到请求调用HandlerMa ...

  8. 12-01JavaScript事件(Events)

    JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. 2.属性(当这些事件的属性发生时,会触发function{}的函数): 1)ona ...

  9. javascript删除option选项的多种方法总结

    转自:https://blog.csdn.net/xiaoxuanyunmeng/article/details/16886505 1. JavaScript 代码如下: var oSel=docum ...

  10. Android实现智能提示的文本输入框AutoCompleteTextView

    今天我们要讲一个十分简单的内容,就是一个安卓控件的使用,用法很简单,但是很常用的一个.这里我用两种不同的写法来处理.当然,无论用哪一种写法,效果都是一样的. 我们先来看效果图. 要实现这种效果十分简单 ...