初见数据库(三天)
•发布于   •作者 懂不懂  •105 次浏览  •来自 分享

创建一个普通用户:(管理员才有权限)

create user 用户名 identified by 口令;

授权:

通常就两个,connect,resource 。

grant connect,resource to 用户名;

关于用户的相关语句:

删除用户:(管理员可以删除)

drop user 用户名 cascade;

修改密码:(忘记密码,需要管理员权限)

alter user 用户名 identified by 新口令;

表的创建:

CREATE TABLE 表名(

  列1名 类型 约束,

  列2名 类型 约束, 

  ....

  列n名 类型 约束

);

数据类型:

NUMBER:数值型,整数,小数,--int,Integer

VARCHAR2:可变长度的文本型(字符串)----String

CHAR:固定长度的文本型(字符串)----char 

DATE:存储时间,有默认的格式的-----date

CLOB:用来存储大量的字符,最多达到2GB

BLOB:用来存储大量的字节,最多可达到2GB

约束:一种限制,限制数据,对应的要求

1)NOT NULL:非空约束,不能没有

2)UNIQUE:唯一,不能重复的

3)CHECK:检查,限定数据的范围

4)PRIMARY KEY:主键约束

5)FOREIGN KEY:外键约束 

关于表的相关语句:

删除表:

DROP TABLE 表名;

查看当前用户下所有的表名:

SELECT table_name FROM user_tables;

查看当前用户下的所有表:

select * from tab

查询一个表的全部数据:SELECT * FROM 表名;

如果脚本中的日期是英文的,需要把当前环境的日期语言修改

alter session set nls_date_language=english;

数据的添加:

INSERT INTO 表名 (列名) VALUES(值);

SELECT语句:

SELECT 列1名,列2名...列n名    FROM 表名;

查询的时候起别名:改变显示的结果,列名是新的名字(大写)

SELECT 原表名 新名   FROM 表名

空值转换函数NVL(列,值)

对于数值列:NVL(列,数值),如果是null,取数值

对于字符串列:NVL(列,'字符串常量');,如果是null,取值字符串常量;


查询所有不重复的名字:DISTINCT


ORDER BY:排序,可以针对要查找的数据结果排个序

SELECT 列1名,....

FROM 表名

ORDER BY 某列名 升序/降序(ASC/DESC) ;


WHERE子句:筛选数据

WHERE后面跟的是表达式,如果表达式结果成立,则结果集包含这一行, 不成立,不包含

表达式中的运算符:

比较运算符:

>,=,>=,<=,   !=,<>,^=,不等于

BETWEEN...AND...:在..和..之间

IN:在某一个集合范围内

LIKE:像...样的,模糊查询

IS NULL:是空的

NOT BETWEEN...AND...

NOT IN()

NOT LIKE ''

IS NOT NULL

逻辑运算符:与或非

AND:与  ,两个结果都满足才满足

OR:或    只要有一个结果满足就满足

NOT:非

注意:

1)WHERE的位置紧跟在FROM之后

2)执行顺序:

SELECT

FROM

WHERE

ORDER BY;

1.FROM->2.WHERE->3.SELECT,到此确定结果集->4.ORDER BY,对结果集排序

应该说是先拿到表,再选择表内所有字段的满足where要求的行,再选择列,最后排序

3.单行函数

函数分为:

单行函数:一行可以得到一个结果

多行函数(组函数):多个行得到一个结果,(一组得到一个结果)

1)字符函数(字符串)

LOWER:转换为小写

UPPER:转换为大写

INITCAP:把每个单词的首字母大写,其余都小写

CONCAT:拼接

LENGTH:长度

SUBSTR(字符串,起始点,长度)  在数据库中,起始点都是1

2)数值函数

ROUND:四舍五入

TRUNC:截取

MOD:取余数

ROUND(数值,精确度)

正整数:精确到小数点后几位

负整数:精确到小数点前几位

0:精确到整数位

不写,默认为0


TRUNC(数值,保留的位)

正负0不写规则同ROUND

后面的都舍弃


3.日期函数

MONTHS_BETWEEN(date1,date2):两个日期的月份差,求出的结果带小数部分

SELECT MONTHS_BETWEEN(sysdate,'28-Jan-17')

FROM dual;

求年差: MONTHS_BETWEEN(date1,date2)/12

求日期差: date1-date2

求小时差: (date1-date2)*24

求分: (date1-date2)*24*60

求秒: (date1-date2)*24*60*60

add_months(date,添加的月份):增加几个月

SELECT add_months(sysdate,3)

FROM dual;

增加年: add_months(date,n*12):增加n年

增加日期:date+n

sysdate+3

增加小时:

sysdate+3/24

增加分:

sysdate+3/24/60

增加秒:

sysdate+3/24/60/60

NEXT_DAY(date,'sunday'):当前日期之后的第一个星期日

SELECT NEXT_DAY(sysdate,'monday')

FROM dual;

LAST_DAY(date):当前日期所在的月的最后一天

SELECT last_day(sysdate)

FROM dual;

ROUND:四舍五入

SELECT ROUND(sysdate,'year')

FROM dual;

year:四舍五入到年,是否进位看月,逢7进1

SELECT ROUND(sysdate,'mm')

FROM dual;

mm:四舍五入到月,是否进位看日:逢16进1

SELECT ROUND(sysdate,'dd')

FROM dual;

dd:四舍五入到日,是否进位看时:逢12进1

TRUNC:截取

SELECT TRUNC(sysdate,'year')

FROM dual;

SELECT TRUNC(sysdate,'mm')

FROM dual;

SELECT TRUNC(sysdate,'dd')

FROM dual;

eg:

SELECT sysdate-to_date('2017-01-01','yyyy-mm-dd')

FROM dual;

day:星期,精确到星期

SELECT ROUND(SYSDATE, 'day') FROM dual;

如果一周没有过半,就得到当前星期的星期日,过半的到下一个星期日

SELECT TRUNC(SYSDATE, 'day') FROM dual;

无论如何,得到的都是本周的周日(第一天)

SYSDATE:默认格式,dd-Mon-yy

SYSTIMESTAMP:默认格式精确到毫秒

SELECT systimestamp

FROM dual;


4.转换函数

to_char:转换为字符串

日期->字符串

SELECT sysdate FROM dual;

SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss')

FROM dual;


yyyy:四位数字的年   mm:两位数字的月   dd:两位数字的日期   hh24:24进制的小时   mi:分   ss:秒


多表查询:重点

基本语法:

SELECT 字段1,字段2

FROM 表1名,表2名,...;

多表联查:

SELECT 表名.列名,表名.列名...

FROM 表1,表2...

WHERE 表1.列n=表2.列m;

表1.列n=表2.列m:两个表有关系,某个表的外键列=另一个表的主键列

表的连接方式:

1)等价连接

两个表的值取相等的,用=的方式

2)不等价连接

不通过等号=连接

1)左外连接:左表,右表

可以使左表的数据全部查询出来

语法:

SELECT c.name,e.first_name

FROM s_customer c,s_emp e

WHERE c.sales_rep_id=e.id(+);

等价于:

SELECT c.name,e.first_name

FROM s_customer c LEFT OUTER JOIN s_emp e

ON c.sales_rep_id=e.id;

在等号右边加(+),左外连接,等号左边的表会全部查询查询出来

右表没有匹配的数据使用null





0 回复
回到顶部

©2017 Powered by 三十三行伪代码
皖ICP备17005175号-3