SQL基础(一)
经过这段时间对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基础(一)的更多相关文章
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
- 黑马程序员+SQL基础(上)
黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...
- Oracle SQL 基础学习
oracel sql 基础学习 CREATE TABLE USERINFO ( ID ,) PRIMARY KEY, USERNAME ), USERPWD ), EMAIL ), REDATE DA ...
- 第一章 SQL基础
第一部分:SQL基础1. 为什么学习SQL自人类社会形成之日起,社会的运转就在不断地产生和使用各种信息(文献.档案.资料.数据等):在如今所谓的信息时代,由于计算机和互联网的作用,信息的产生和使用达到 ...
- SQL基础--> 约束(CONSTRAINT)
--============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完 ...
- SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)[转]
--====================================================== --SQL基础-->层次化查询(START BY ... CONNECT BY ...
随机推荐
- postgresql 数据库,模式,表空间的关系
数据库与模式模式(schema)是对数据库(database)逻辑分割在数据库创建的同时,就已经默认为数据库创建了一个模式--public,这也是该数据库的默认模式.所有为此数据库创建的对象(表.函数 ...
- Rails的静态资源管理(五)—— 自定义 Asset Pipeline
官方文档:http://guides.ruby-china.org/asset_pipeline.html http://guides.rubyonrails.org/asset_pipeline.h ...
- C#字符串全排序
排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 ...
- IC卡和RFID卡的区别(网上说的都不准确)
其实IC卡是卡类型的称呼,IC卡和RFID卡不应该在一起对比的,和IC卡在一起对比的应该是ID卡. RFID卡是其实是对卡技术类型称呼. IC为卡类型称呼(Integrated Circuit Car ...
- Ubuntu16.04 Hadoop2.6.0伪分布式安装与启动中遇到的问题
1.安装JDK1.8,下载安装包解压至 /usr/lib/jdk vim /etc/profile #配置路径 export JAVA_HOME= /usr/lib/jdk export JRE_HO ...
- 管理linked break-off snapshot
1. 建立linked break-off snapshot (1) 建立原卷 #> vxassist -g APS2_AFC_DG make vol1 4096000 #> vxpr ...
- SpringMVC工作原理图解
SpringMVC的工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMa ...
- 12-01JavaScript事件(Events)
JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. 2.属性(当这些事件的属性发生时,会触发function{}的函数): 1)ona ...
- javascript删除option选项的多种方法总结
转自:https://blog.csdn.net/xiaoxuanyunmeng/article/details/16886505 1. JavaScript 代码如下: var oSel=docum ...
- Android实现智能提示的文本输入框AutoCompleteTextView
今天我们要讲一个十分简单的内容,就是一个安卓控件的使用,用法很简单,但是很常用的一个.这里我用两种不同的写法来处理.当然,无论用哪一种写法,效果都是一样的. 我们先来看效果图. 要实现这种效果十分简单 ...