【转】https://blog.csdn.net/tangzihao_c/article/details/52927347
一、 数据库介绍
1、数据库简介
设计数据库要保证冗余(重复)度小,数据的完整性
一套软件 UI、业务逻辑层、持久层
DB(database):数据库
DBMS(databasemanagement system):数据库管理系统
DBA:数据库管理员
DBS:数据库系统
关系型数据库(RDB)
什么是关系型数据库? 用二维表保存数据
2、主流的关系型数据库
商业型:
oracle Oracle(甲骨文)
db2 IBM
sql server 微软
开源的 免费的
MySql Oracle
3、操作数据库的语言---SQL
SQL:structured query language 结构化查询语言
查询(DQL): select
数据操作语言(DML): insert updata delete (增删改数据)
数据定义语言(DDL): creat alter drop (增删改对象)
事务处理语言(TCL): commit (提交) rollback(撤销) savepoint
数据控制语言(DCL): grant(授予权限) revoke(撤销权限)
4、远程连接服务器
步骤:
1) 连接服务器
telnet ip
ip: 176.3.20.200
用户名:oracle
密码:oracle
2) 使用账号登陆oracle
sqlplus :oracle提供的客户端访问工具
sqlplus 回车
输入用户名:oracle
输入密码:oracle
SQL> “输入命令”
第二步可以简化为:sqlplus用户名/密码
如: sqlplusoracle/oracle
5、描述表结构:
s_emp:员工信息表
desc 表名;
desc s_emp;
在cmd下输入命令:desc s_emp;
(
在ubuntu中 直接输入sqlplus syetem/open123也可以
ubuntu@linux:~$ sqlplus system/open123
SQL*Plus: Release 10.2.0.1.0- Production on Tue Oct 25 10:48:55 2016
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0- Production
With the Partitioning, OLAP and Data Miningoptions
SQL> desc s_emp;
)
SQL> desc s_emp;
Name Null? Type
------------------------------------------------- --------------
ID 员工编号 NOT NULL NUMBER(7)
LAST_NAME 姓 NOTNULL VARCHAR2(25)
FIRST_NAME 名 VARCHAR2(25)
USERID VARCHAR2(8)
START_DATE 入职日期 DATE
COMMENTS VARCHAR2(255)
MANAGER_ID 领导编号 NUMBER(7)
TITLE 职位 VARCHAR2(25)
DEPT_ID 部门编号 NUMBER(7)
SALARY 工资 NUMBER(11,2)
COMMISSION_PCT 提成 NUMBER(4,2)
Name:字段名
Null?表示该字段是否允许为空 NOT NULL不允许为空
Type:字段的数据类型
NUMBER(p,s) 数值类型
p [1,38]
s [-84,127]
[-1.0e-130,1.0e+126 )
1~22 bytes
varchar2(n) 变长字符串 <=4000字符
char 定长字符串 <=2000字符
data 日期
二、查询 select语句
1、from 子句
2、where 字句(条件字句)
3、order by (排序)
4、单行函数
5、多表查询
6、组函数和分组
7、子查询
三、form字句
select 字段 from 表名; 指定从表名里查询字段
1、 查询一个字段
/*列出所有员工的工资*/
select salary fromm s_emp ;
slect first_name from s_emp;
2、 查询多个字段
Select 字段1,字段2…….fom 表名
/*列出所有员工的id,first_name,salary */
select id,first_name,salary s_emp;
3、 查询表中全部数据
select id,last_name,first_name,……,commission_pctfrom s_emp;
使用*表示所有字段
select * from s_emp;
4、 使用算数运算(一般是数值类型的字段)
+ - * /
/*列出员工的年收入*/
12*salary
12*salary+1000
select id,first_name,salary,salary*12 froms_emp;
5、 字段或表达式的别名
字段或表达式 [as] 别名
select id,first_name,salary as sal,salary*12yearsal from s_emp;
“”:用双引号解决别名有非法字符的问题
select id,first_name,salary assal,salary*12 year sal from s_emp;error
select id,first_name,salary assal,salary*12 “year sal” from s_emp;
select id,first_name,salary assal,salary*12 “yearSal” from s_emp;
6、 sql中的字符串
1) sql中如何表示字符串
‘’ ‘ ‘ ‘a’ ‘hello world’
2) 字符串拼接
|| ---字符串拼劲
/*把first_name和last_name拼接起来 */
Select id,fist_name || last name name froms_emp;
/*在first_name和last_name之间拼接加一个点. */
Select id,fist_name || ‘.’|| last name name from s_emp;
Select id,fist_name || ‘’’|| last name name from s_emp; 错误
This’s
转义:’
Select id,fist_name || ‘’’’|| last name name from s_emp;
7、
1)/*列出所有员工的年收入,包括提成*/
SQL> select commission_pct from s_emp;
12*salary*(1+commission_pct/100)
select id,first_name,salary,12*salary*(1+commission_pct/100)yearsalary from s_emp;
NULL值和任何数值进行算数运算,结果为NULL
2)处理NULL值的函数
nvl(par1,par2) :参数可以是任意类型,但是两个参数类型必须一样
当par1不为null时,返回par1,
当par2为空时,返回par2;
selectid,first_name,salary,nv1(12*salary*(1+commission_pct/100),12*salary) yearsalaryfrom s_emp; 不好
NULL值要尽早处理
nvl(commission_pct,0)
或selectid,first_name,salary,12*salary*(1+nvl(commission_pct,0)/100) yearsalary from s_emp;
8、 排重显示
distinct
/*列出多有员工的职位(title)*/
select title from s_emp;
/*列出表中职位类型*/
select distinct title from s_emp;
多字段排重
select distinct title,dept_id from s_emp;
四、where字句(条件字句)
1、where字句的作用是限制返回的行
符合条件的行被筛选出来,不符合条件的行被过滤掉
Select 字段 from 表名 where 条件;
2、数字类型的条件
/*列出工资大于1500的员工的信息*/
select id,first_name,salary from s_empwhere salary>1500;
select id,first_name,salary from s_empwhere 1=1; /*数据库引擎不支持= =*/
select id, first_name,salary from s_empwhere 1!=1;
3、列出first_name为Mark的员工的信息
Select id,first_name from s_emp wherefirst_name=’Mark’;
sql中不区分大小写,但是字符串类型的值是区分大小写的
4、where字句能使用的运算符
< <= > >= != (<>、^=)
5、sql提供的运算符
1)表示一个闭区间 [a,b]
between a and b
/*列出工资在[1100,1450]之间的员工的信息*/
Select id,first_name,salary from s_empwhere salary between 1100 and 1450;
/*列出编号在[10,15]范围内的员工的id,first_name,dept_id*/
Select id,first_name,dept_id from s_empwhere id between 10 and 15;
2)表示字段的取值在一个列表中(值1,值2,…..)
字段 in(列表)
/*列出部门编号为32,42,50的部门的员工的信息*/
select id,first_name,dept_id from s_empwhere dept_ip in(32,42,50);
3)模糊查询
张小龙 龙小云 成龙 张三 李四
查询名字中带 龙的
通配符 % _
%:任意长度的任意字符
_:一个任意字符
like ‘%龙%’ 带龙的
like ‘_龙’ 第二个字是龙的
/*列出员工的first_name的首字母为A的员工的信息*/
select id,first_name from s_emp wherefirst_name like ‘A%’;
/*列出员工的first_name的第二个字母为a的员工的信息*/
select id,first_name from s_emp wherefirst_name like '_a%';
user_tables
desc user_tables;
/*所有的表名*/
select table_name from user_tables;
/*从user_tables表中查询出所有的S_开头的表名*/
select table_name from user_table wheretable_name like ‘S_%’ 不合适
escape:表示哪一个字符后面的字符需要转义
select table_name from user_tables wheretable_name like ‘S\_%’ escape ‘\’;
/*从user_tables表中查询出所有的S_开头的表名*/
select table_name from user_tables wheretable_name like ‘S\_\_%’ escape ‘\’;
4)NULL值的查询
字段 is null
select id,manager_id from s_emp wheremanager_id is null;
/*列出提成为空的员工的信息*/
select id,commission_pct from s_emp wherecommission_pct is null;
6、sql提供的逻辑运算符
and :逻辑与
or:逻辑或
not:逻辑非
1) 使用and列出工资在[1100,1450]范围内的员工的信息
select id,salary from s_emp wheresalary>=1100 and salary=<1450 ;
2) 使用or列出部门编号为32,42,50的部门的员工的信息
select id,first_name,dept_id from s_empwhere dept_id=32 or dept_id=42 or dept_id=50;
3) 列出提成不为null的员工的信息
对立面
> <=
< >=
= !=
between and not between and
in not in(注意null值)
like not like
is null is not null
select id,commission_pct from s_emp wherecommission_pct is not null;
五、orderby 子句
1、 order by 子句总是在select语句的最后
select 字段
from 表名
where 条件
orderby 子句
2、按照工资从高到低显示员工的信息
order by 排序标准 排序方式
排序标准: 字段或表达式
排序方式:升序 asc (默认的排序方式 自然顺序 字典顺序)
降序 desc
select id,first_name,salary from s_empwhere 1=1 order by salary desc;
3、在排序时,NULL值按最大值处理
列出员工的信息,按照manager_id升序排序
select id,first_name,manager_id from s_emporder by manager_id;
4、多字段排序
Order by 字段1 排序方式,字段2 排序方式
按照工资从高到低显示员工信息,如果工资相同,则按id升序显示
select id,first_name,salary from s_emporder by salary desc,id asc;