数据库SQL学习(一)

文章目录

一.概述

1.数据库定义:按照数据结构来组织,存储和管理数据的仓库

2.提供数据库服务的软件:

MySQL,SQL_Server,Oracle,Mariadb,DB2,MongoDB…

3.选用数据库

(1)开源软件:MySQL,Mariadb,MongoDB
商业软件:Oracle,DB2,SQL_Server
(2)是否跨平台:
不跨平台:SQL_Server
跨平台:MySQL,Oracle,Mariadb,DB2,MongoDB

二.MYSQL:是一种关系型数据库(RDBMS),指建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据,支持多种语言。

1.特点:

(1)数据以表格形式出现
(2)一行称为一条记录
(3)列代表字段,如3列代表三个字段
(4)许多的行和列组成一张表单
(5)若干的表单组成database

2.术语

(1)数据库: 数据库是一些关联表的集合。
(2)数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
(3)冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
(4)外键:外键用于关联两个表。
(5)复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
(6)索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
(7)参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

3.关于关系型和非关系型数据库

关系型示例:
学生信息:
姓名:小明 年龄:13 ,班级:12340班
班级信息
班级:12340班 班主任:王静
当查找小明的班主任时,则可以通过这种关系型数据库找到

非关系型:
学生信息:
{“姓名”:“小明” “年龄”:13 ,“班级”:“12340班” “班主任”:“王静”}

4.数据存储

(1)所有数据都是以文件的形式放在数据库目录下
(2)数据库目录 :/var/lib/mysql

5.安装

网上的教程挺详细的,戳这里
但是可能会遇到各种各样的问题,感谢万能的大佬们,整理了几篇常见问题的解决方法,戳这里
问题解决1
问题解决2

6.名词介绍

(1)DB(database):数据库
(2)DBMS(database management system):数据库管理系统
数据库管理系统的软件:MySQL,Oracle…
(3)DBS(database system):数据库系统
DBS= DB(存储)+DBMS(数据库软件)+数据库应用+用户

7.登录

先切换到mysql安装目录下的bin文件夹,输入net start mysql,然后输入mysql -u root -p
会看到输入密码的提示符,输入密码即可。

三.MySQL管理(Windows系统)

1.连接MySQL服务器

(1)启动 :打开命令行窗口,进入安装目录

cd C:/mysql/bin
mysql -u root -p #会提示输入密码,输入密码后回车即可

(2)关闭

cd C:/mysql/bin
quit

四.命令

1.说明

(1)每条SQL命令必须以 ;结尾
(2)SQL命令不区分大小写
(3)使用\c 来中止命令的执行

2.库的管理

(1)基本操作

show databases;               #查看已有的库
create 库名 default=UTF-8 ;  #创建库,指定默认字符集

show create database 库名;  #查看创建的库(查看字符集)
select database();          #查看当前所在库
use 库名;                    #切换库
show tables;                 #查看库中已有的表
drop database 库名;          #删除库

(2)库名的命名规则

(1)可以使用数字,字母,_,但不能使用纯数字
(2)库名区分大小写
(3)库名有唯一性
(4)不能使用特殊字符

3.表的管理

(1)基本操作

show tables              #查看已有的表
create 表名(字段名,数据类型 
字段名,数据类型
...)default =utf-8 ;     #创建表,指定默认字符集
show create table 表名;  #查看创建的库(查看字符集)
desc 表名                 #查看表的结构
drop table 表名;          #删除表

(2)表的命名规则

同上库的命名

(3)where 条件子句(配合查询,修改,删除操作)

select * from 表名 where 条件;

(4)表记录的管理

# 插入记录
insert into 表名values(值1),(值2),... ; #在表中插入记录,值指的是一行所有的字段依次赋值
insert into 表名(字段名列表)values(值一),(值二),... ; 值按照前面的字段列表依次赋值

#查询记录
select * from 表名; #查询表的所有信息
select 字段1,字段2... from 表名;#查询某几个字段
select 字段1,字段2... as x1,x2...from 表名#显示的字段是x1.x2....

# 删除记录
delete from 表名 where 条件;如 delete from 表名 where id =1
delete from 表名;#会删除表中所有记录

# 更新表记录 
update 表名 set 字段名1=值1,字段名2=值2... where 条件;#如果没有where语句,则会将表中所有记录的相应字段都更新
#

(4)表字段的操作

alter table 表名 执行动作;
# 添加字段
alter table 表名 add 字段名 数据类型 first;#将字段加在第一列
alter table 表名 add 字段名 数据类型 after 字段名1;#将字段添加在字段名1后面
# 删除
alter table 表名 drop 字段名;
#修改字段数据类型
alter table 表名 modify 字段名 新数据类型;#要注意原来的数据范围限制
#修改字段名
alter table 表名 change 旧名 新名 数据类型;
#修改表名
alter table 表名 rename 新表名;



五.数据类型

1.分类

(1)数值类型
(2)字符类型
(3)枚举类型
(4)日期时间类型

2.数值类型

在这里插入图片描述

(1)整型 :

int 和 tinyint比较常用,存储空间和取值范围等见上。

(2)浮点型:

float(最多显示7个有效位)
用法:

float(m,n)# m表示总位数,n表示小数位

注意:浮点型插入整数时会自动补全小数位位数;小数位如果多于指定位数,会对指定位的下一位进行四舍五入
double(最多显示15个有效位)
用法和注意事项同float
decimal(最多显示28个有效位)

3.字符型

在这里插入图片描述

(1)char(定长):默认宽度为1

(2)varchar(变长):没有默认宽度,必须给定一个宽度值

(3)两者比较

char 占用固定的存储空间,比如定义长度为5,如果字符串的长度为2,那么系统会自动补3个空格
varchar 是根据输入字符串的长度来分配存储空间
所以char性能好,varchar可以节省存储空间

4.枚举类型

(1)定义:字段值只能在列举的范围内选择

(2)enum(…)单选(最多有65535个不同的值)

字段名 enum(choice1,choice2....)

(3)set(…)多选(最多有64个不同的值)

字段名 set(choice1,choice2....)

5.日期时间类型

在这里插入图片描述
注意:插入记录时datatime字段不给值默认返回NULL;插入记录时timestamp字段不给值默认返回系统当前时间

6.字符类型和数值类型宽度的区别

数值类型的宽度仅仅为显示宽度,只用于select 查询显示,和存储空间无关,可以用zerofill 查看效果
字符类型的宽度超过则无法存储
示例:

mysql> create database stu;
Query OK, 1 row affected (0.02 sec)

mysql> use stu;
Database changed
mysql> create table t2(id int(3) zerofill);
Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> insert into t2 values(1),(2),(6666);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t2;
+------+
| id   |
+------+
|  001 |
|  002 |
| 6666 |
+------+
3 rows in set (0.00 sec)

六.运算符操作

1.数值比较和字符比较

(1)数值比较

=  |= | > | < | >= | <=| 

(2)字符比较

=  |= | 

2.逻辑比较

and  |  or

3.范围内比较

between A and B #A,B是两个值
in(值1,值2...值N)
not in(值1,值2...值N)

4.匹配空和非空

is null #空
is not null# 非空
# 注意这里是空值的意思,而不是空字符串,空字符串用''来匹配,空值必须用is(not)null匹配

5.模糊比较(like)

where 字段名 like 表达式;
表达式:
_ : 匹配单个字符
% : 匹配0到多个字符

示例:

where 字段名 like '_%_' ; #有两个字符及以上
where 字段名 like '%';    #匹配所有的,NULL不会被统计
where 字段名 like '___';  #有3个字符
where 字段名 like '王%';  #匹配以王字开头的

6.正则匹配查询

where 字段名 regexp "正则表达式";

正则表达式符号:


^ :以...开头
$ :以...结尾
. :匹配任意一个字符
[]:包含...内容
[0-9]:匹配带数字的
[a-z]:匹配带小写字母的
[A-Z]:匹配带大写字母的
* :星号前面的字符出现0个或者多次 

组合使用示例:

选取name 字段为例
where name regexp "^[0-9]";#以数字开头
where name regexp "[0-9]$";#以数字结尾
where name regexp "^王.*明$";#以王字开头,以明字结尾
where name regexp "^...$";#以任意一个字符开头,一任意一个字符结尾,中间还有一个字符,所以要有三个字符,中文或英文字符

七. SQL查询

1.总结(执行顺序)

1.where;
2.group by…
3.select …聚合函数 from 表名;
4.having
5.order by;
6.limit
下面的示例均采用t1来做示范:


mysql> desc t1;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int         | YES  |     | NULL    |       |
| name    | varchar(20) | YES  |     | NULL    |       |
| age     | int         | YES  |     | NULL    |       |
| country | char(3)     | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)


mysql> select * from t1;
+------+--------+------+---------+
| id   | name   | age  | country |
+------+--------+------+---------+
|    1 | 王军   |   23 | ABC     |
|    2 | 黎明   |   34 | ABC     |
|    3 | 李天   |   56 | BCD     |
|    4 | 王平   |   33 | BCD     |
|    5 | Amy    |   22 | EFG     |
+------+--------+------+---------+
5 rows in set (0.00 sec)

2.分类介绍

(1)order by

作用:给查询结果进行排序

语法格式:order by 字段名 排序方式;
排序方式:ASC(升序,且为默认排序方式),DESC(降序) 

示例

 select * from t1 order by age desc;
+------+--------+------+---------+
| id   | name   | age  | country |
+------+--------+------+---------+
|    3 | 李天   |   56 | BCD     |
|    2 | 黎明   |   34 | ABC     |
|    4 | 王平   |   33 | BCD     |
|    1 | 王军   |   23 | ABC     |
|    5 | Amy    |   22 | EFG     |
+------+--------+------+---------+
5 rows in set (0.00 sec)

(2)limit

作用:限制显示查询记录的个数。
注意:limit 永远放在SQL语句最后面

limit n;显示n条记录
limit m,n; 从第m+1条记录开始,显示n条记录,m从0开始计数

(3)聚合函数

分类:

(1)avg(字段名):求字段的平均值
(2)sum(字段名):求和
(3)max(字段名):求最大值
(4)min(字段名):求最小值 
(5)count(字段名):统计该字段记录的个数 注意NULL
不会被统计

示例:


mysql> select max(age) as max_age from t1;
+---------+
| max_age |
+---------+
|      56 |
+---------+
1 row in set (0.00 sec)

(4)Group by

作用:给查询的结果进行分组,收集某一个字段的记录,然后统计出所有不同的记录,先分组,再聚合
示例:

mysql> select country from t1 group by country;
+---------+
| country |
+---------+
| ABC     |
| BCD     |
| EFG     |
+---------+
3 rows in set (0.00 sec) #注意只能显示一个字段,否则的话就要用聚合函数进行处理,使左右两边的记录数一样相匹配,如下

select country,avg(age) from t1 group by country;
+---------+----------+
| country | avg(age) |
+---------+----------+
| ABC     |  28.5000 |
| BCD     |  44.5000 |
| EFG     |  22.0000 |
+---------+----------+
3 rows in set (0.00 sec)

#查找所有国家中人数最多的前两名
mysql> select country,count(name)  from t1 group by country order by count(name) desc limit 2;
+---------+-------------+
| country | count(name) |
+---------+-------------+
| ABC     |           2 |
| BCD     |           2 |
+---------+-------------+
2 rows in set (0.00 sec)

**注意:groupby 之后的字段名必须要为select之后的字段名;
如果select之后的字段名在groupby之后,则必须要对该字段进行聚合处理
**

(5)having

作用: 对查询的结果进一步筛选
示例:

mysql> select country,count(name)  from t1  group by country having count(name) =2 order by count(name) desc  limit 2;
+---------+-------------+
| country | count(name) |
+---------+-------------+
| ABC     |           2 |
| BCD     |           2 |
+---------+-------------+
2 rows in set (0.00 sec)
#where 语句会出错,因为where 语句里面必须包含的是字段名,而这里用到了聚合函数,所以要用having 语句进一步筛选

注意:having语句鲳鱼group by语句使用,用来过滤 group by 语句返回的数据集
having语句弥补了where条件子句不能和聚合函数联合使用的不足

(6)distinct

作用:不显示字段的重复值
示例:

mysql> select distinct name, country from t1;
+--------+---------+
| name   | country |
+--------+---------+
| 王军   | ABC     |
| 黎明   | ABC     |
| 李天   | BCD     |
| 王平   | BCD     |
| Amy    | EFG     |
+--------+---------+
5 rows in set (0.00 sec)
# 要求distinct 后面跟的字段名必须都相同才会去重

**注意:distinct后面跟的字段名必须都相同才会去重,distinct不能对任何字段做聚合处理 **

3.查询表记录时的数学计算

(1)运算符

+   |    -   |    *   |  /  |   %   |

示例:

mysql> select name,age+1 from t1;
+--------+-------+
| name   | age+1 |
+--------+-------+
| 王军   |    24 |
| 黎明   |    35 |
| 李天   |    57 |
| 王平   |    34 |
| Amy    |    23 |
+--------+-------+
5 rows in set (0.00 sec)

八.约束

1.作用:为了保证数据的完整性,一致性,有效性,可以限制无效的数据插入到数据表中

2.分类

(1)默认约束

作用:在插入记录时,如果不给该字段赋值,则使用默认值
格式: 字段名 数据类型 default 默认值

(2)非空约束

作用: 不允许该字段的值有空值
格式: 字段名 数据类型 not null。在查看表结构的时候,会发现NULL那一栏为No,表示不能为空

1 SQL基础 1.1 基本概念 结构化查询语言(Structured Query Language)简称SQL,是一种关系数据库查询语言,用于存取数据以及查询、更新和管理关系数据库系统。 1.2 语句结构 1.2.1 数据查询语言(DQL) 对数据库进行的信息查询,select。 1.2.2 数据操作语言(DML) 用于操作关系型数据库对象内部的数据,insert、update、delete。 1.2.3 数据定义语言(DDL) 用来建立及定义数据表、字段以及索引等数据库结构,create、alter、drop 。 1.2.4 数据控制语言(DCL) 用于控制对数据库里数据的访问,通常用于创建与用户访问相关的对象以及控制用户的权限,grant、revoke(撤销)。 1.2.5 事务控制命令(TPL) 用于管理数据库事务,commit、rollback、savepoint(在一组事务里创建标记点以用于回退)。 1.3 表的构成 1.3.1 字段 字段是表里的一列,用于保持每条记录的特定信息 1.3.2 记录 记录,也被成为一行数据,是表里的每一行 1.4 完整性的约束条件 1.4.1 实体完整性 关系模型的实体完整性在create table中用primary key约束实现,primary key约束用于定义主键,它保证主键的唯一性和非空性。 1.4.2 参照完整性 关系模型的参照完整性可以通过在create table中用foreign key (<外键>) references <被参照表名> (<与外键对应的主键名>)进行约束定义。 1.4.3 用户定义完整心 在create table语句中可以根据应用要求,定义属性以及元组上的约束。 常见的用户定义的完整性约束有: not null或null约束。 unique约束:唯一性约束。 default约束:默认值约束。 check约束:检查约束,check约束通过约束条件表达式设置列值应该满足的条件。 1.5 范式 1.5.1 第一范式 1.5.1.1 规范 无重复的列,确保每列保持原子性,即数据库表中的所有字段值都是不可分解的原子值。 1.5.1.2 举例 姓名 年龄 联系电话 地址 省 市 详细地址 1.5.2 第二范式 1.5.2.1 规范 属性完全依赖于主键,确保表中每列都与主键相关。 1.5.2.2 举例 订单表 订单Id 商品Id 总金额 商品名称 001 1 10 苹果 001 2 10 橘子 联合主键订单Id、商品Id => 商品表 商品Id 商品名称 单价 订单表 订单Id 总金额 1.5.3 第三范式 1.5.3.1 规范 属性不依赖于其它非主属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关,即要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 1.5.3.2 举例 党员表 党员Id 党员姓名 组织Code 符合3NF 党员表 党员Id 党员姓名 组织名称 不符合3NF 组织表 组织Code 组织名称 1.6 外连接 1.6.1 准备 create table student_A( uuid varchar2(32), name varchar2(100)); create table student_B( uuid varchar2(32), name varchar2(100)); insert into student_A values('1','小黄'); insert into student_A values('2','小黑'); insert into student_A values('3','小红'); insert into student_B values('1','大黄'); insert into student_B values('2','大黑'); insert into student_B values('4','大红'); insert into student_B values('4','大紫'); 1.6.2 左连接(left join) 1.6.2.1 说明 查询指定的左表的所有行,而不仅仅是联接列所匹配的行;如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。 1.6.2.2 语法 select A.*,B.* from student_A A left join student_B B on A.Uuid = B.Uuid; 1.6.2.3 结果 1.6.2.4 (+)表示 select A.*,B.* from student_A A,student_B B where A.Uuid = B.Uuid(+) 1.6.3 右连接(right join) 1.6.3.1 说明 查询指定的右表的所有行,而不仅仅是联接列所匹配的行;如果右表的某行在左表中没有匹配行,则在相关联的结果集行中左表的所有选择列表列均为空值。 1.6.3.2 语法 select A.*,B.* from student_A A right join student_B B on A.Uuid = B.Uuid; 1.6.3.3 结果 1.6.3.4 (+)表示 select A.*,B.* from student_A A,student_B B where A.Uuid(+) = B.Uuid 1.6.4 全外连接(full outer join) 1.6.4.1 说明 完整外部联接返回左表和右表中的所有行;当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值;如果表之间有匹配行,则整个结果集行包含基表的数据值。 1.6.4.2 语法 select A.*, B.* from student_A A full outer join student_B B on A.Uuid = B.Uuid; 1.6.4.3 结果 1.6.4.4 全外连接不支持(+)写法 1.6.5 (+) + 表示补充,即哪个表有加号,这个表就是匹配表。 1.7 运算符 1.7.1 比较 =、>,<,>=,<=,!=,<>, 1.7.2 确定范围 between and 、not between and 1.7.3 确定集合 in、not in 1.7.4 字符匹配 like(“%”匹配任何长度,“_”匹配一个字符) 1.7.5 转义字符 1.7.5.1 常规转义字符 “\”转义字符,“\%”则表示单纯的字符“%” 1.7.5.2 escape escape关键字经常用于使某些特殊字符,如通配符:'%','_'转义为它们原来的字符的意义,被定义的转义字符通常使用'\',但是也可以使用其他的符号。 select * from Student_a where name like '%$%%' escape '$'; 1.7.6 空值 is null、is not null 1.7.7 集合查询 union(并)、intersect(交)、minus(差) 1.7.8 多重条件 and、or、not 1.7.9 对查询结果分组 <group by 列名> 1.7.10 分组筛选条件 [having <条件表达式>] 1.7.11 字符串拼接 select 'A' || 'B' from dual; // || 拼接 1.8 函数 1.8.1 聚集函数 count、sum、avg、max、min 1.8.2 case when 1.8.2.1 语法 select t.uuid, t.score, case when t.score > 90 then '优秀' when t.score > 60 then '及格' else '不及格' end from exam_user_exam t 1.8.3 decode 1.8.3.1 语法 select decode(x,1,'x is 1', 2 , 'x is 2','others') from dual 1.8.3.2 说明 当x等于1时,则返回‘x is 1’,当x等于2时,则返回‘x is 2’,否则,返回‘others’。 1.8.4 nulls first(nulls last)排序 1.8.4.1 语法 select * from dy_info t order by t.degree nulls first 1.8.4.2 说明 控制null显示行位置 1.8.5 Nvl 1.8.5.1 语法 select nvl(t.sap,'空') from dy_info t; 1.8.5.2 说明 如果sap号为空,则返回‘空’,否则返回sap号。 1.8.6 递归查询 1.8.6.1 语法 select t.* from g_organ t start with t.organcode = '080' connect by prior t.parentcode = t.organcode; //递归查询父节点 select t.* from g_organ t start with t.organcode = '080' connect by t.parentcode = prior t.organcode; //递归查询子节点 1.8.7 union 和 union all 1.8.7.1 语法 select * from dual union all select * from dual 1.8.7.2 说明 union 会对查询数据进行去重并排序,union all只是简单的将两个结果合并。 1.8.8 wm_concat 1.8.8.1 语法 select wm_concat(t.role_name) from g_role t where t.role_name like '%书记%' 1.8.8.2 说明 拼接字符串,结果为:‘党工委副书记,总支副书记,党支部书记,党委书记,党委副书记,党总支书记,党工委书记,党总支副书记,党支部副书记’ 1.8.9 相似度 1.8.9.1 语法 select utl_match.edit_distance_similarity('aaaaa','bbaaaa') from dual; 1.8.10 去格式 1.8.10.1 oracle正则表达式:去除<></>格式 select REGEXP_REPLACE(title,'<[^>]*>','') title from exam_question 1.8.11 rank() over (partition by …) 1.8.11.1 语法 select organcode,score,ranknum from ( select t.organcode, t.score, rank() over (partition by t.organcode order by t.score desc) ranknum from exam_user_exam t) where ranknum < 4 1.8.11.2 说明 获取每个组织,考试成绩前三名。 1.9 存储过程 1.9.1 定义 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.9.2 准备 create table t_user ( username varchar2(20), password varchar2(20) ); create table t_user_temp ( username varchar2(20), password varchar2(20) ); insert into t_user(username,password) values('小王','1111'); insert into t_user(username,password) values('小李','1111'); 1.9.3 创建存储过程 create or replace procedure adduser as begin insert into t_user_temp(username,password) select username,password from t_user t where t.username = '小李'; end adduser; 1.9.4 执行 begin adduser; end; 1.9.5 验证 select * from t_user; select * from t_user_temp 2 SQL深入 2.1 常用 2.1.1 表空间 2.1.1.1 创建表空间 create tablespace TS_DJY datafile 'd:/software/oracle/tablespace/ts_djy.dat' size 1024M autoextend on next 100M maxsize 2048M; 2.1.1.2 指定用户表空间 alter user cssdj default tablespace TS_DJY; 2.1.1.3 指定表的表空间 create table t_student( uuid varchar2(32) )tablespace TS_DJY; 2.1.2 自增sequence 2.1.2.1 创建 create sequence seq_student_uuid minvalue 1 maxvalue 999999999999999 start with 1 increment by 1 nocache; 2.1.2.2 使用 select seq_student_uuid.nextval from dual; //获取下一个 select seq_student_uuid.currval from dual; //获取当前 2.1.3 批量插入 2.1.3.1 查询结果批量插入 insert into tablea(cola,colb) select cola,colb from tableb; 2.1.3.2 创建相同的表结构并插入数据(备份表数据) create tab_new as select * from tab_old; 2.1.3.3 创建相同的表结构不插入数据 create tab_new as select * from tab_old where rownum=0; 2.1.4 伪列伪表 2.1.4.1 伪列 伪列不是表的真实列,但是你可以象使用真实列一样使用伪列,常用伪列:rowid行的绝对物理编号,每一行是唯一的。rownum序号,返回查询结果的每行序号。系统时间sysdate,返回系统当前时间。 2.1.4.2 伪表 select * from dual; 2.1.5 系统表 2.1.5.1 user_tables 当前用户表信息 2.1.5.2 user_tab_columns 当前用户表所有列信息,搜索列所在的表: select * from user_tab_columns t where t.column_name like '%ORGANCODE%'; 2.1.5.3 user_tablespaces 当前用户表空间 2.1.5.4 dba_users 数据库所有用户 2.1.5.5 dba_tables 数据库所有表 2.1.5.6 dba_tablespaces 数据库所有表空间 2.1.6 锁表解锁 2.1.6.1 查看锁表信息 select l.OBJECT_ID,s.SID,s.SERIAL#,s.USERNAME, s.MACHINE from V$locked_Object l,V$session s where l.SESSION_ID = s.SID; 2.1.6.2 解锁 alter system kill session 'sid,serial#'; 2.1.7 备份与恢复 2.1.7.1 导出 导出用户: exp cssdj/cssdj@zr owner=(cssdj,cssdj_zsy) file=d:/cssdj.dmp log=d:/cssdj.log 导出用户表: exp cssdj/cssdj@zr tables=(g_dict,g_dict_item) file=d:/cssdj.dmp log=d:/cssdl.log 2.1.7.2 导入 imp cssdj/cssdj@zr fromuser=cssdj_zsy touser=cssdj file=d:/cssdj.cmp log=d:/cssdj.log 2.1.7.3 数据泵 2.1.8 Dblink 2.1.8.1 创建 create database link orcllink connect to cssdj identified by cssdj using '(DESCRIPTION = (ADDRESS_LIST= (ADDRESS=(PROTOCOL = TCP)(HOST = 219.239.110.65)(PORT = 1521))) (CONNECT_DATA=(SID = orcl)))'; 2.1.8.2 删除 drop database link orcllink; 2.1.8.3 使用 select * from dy_info@orcllink; 2.2 Oracle与Mysql差异 2.2.1 Group by 2.2.1.1 Oracle select后面出现的列,如果没有使用集合函数,必须出现在group by 中。 select sno,sname,sum(grade) from student group by sno,sname; //合法写法 select sno,sname,sum(grade) from student group by sno; //非法写法 select sno,min(sname),sum(grade) from student group by sno; //建议用这种写法,效率高些 2.2.1.2 Mysql select sno,sname,sum(grade) from student group by sno,sname; //合法写法 select sno,sname,sum(grade) from student group by sno; //合法写法 2.2.2 分页 2.2.2.1 Oracle 使用rownum来表明分页位置,而且rownum只能小于某值,不能大于某值,故而rownum和where联用才能完成数据范围的控制 2.2.2.2 Mysql mysql的分页可以用limit startNum,pageNum 2.3 了解 2.3.1 事务 2.3.1.1 Rollback start transaction; --开始事务 insert into g_dict values('test','测试','1',''); --执行数据操作语言(DML) select * from g_dict where code = 'test'; --可以查看是否执行正确 rollback; --错误执行rollback操作 commit; --正确执行commit操作 2.3.1.2 Savepoint start transaction; --开始事务 insert into g_dict values('t1','测试','1',''); --执行数据操作语言(DML) savepoint pointA; insert into g_dict values('t2','测试','1',''); --执行数据操作语言(DML) select * from g_dict where code = 'test33'; --可以查看是否执行正确 rollback to savepoint pointA; 2.3.2 利用执行计划评估SQL语句的性能 2.3.2.1 工具 在PL/SQL Developer中写好一段SQL代码后,按F5,PL/SQL Developer会自动打开执行计划窗口,显示该SQL的执行计划。 2.3.2.2 查看总COST,获得资源耗费的总体印象 一般而言,执行计划第一行所对应的COST(即成本耗费)值,反应了运行这段SQL的总体估计成本,单看这个总成本没有实际意义,但可以拿它与相同逻辑不同执行计划的SQL的总体COST进行比较,通常COST低的执行计划要好一些。 2.3.2.3 了解执行计划的执行步骤 按照从左至右,从上至下的方法,了解执行计划的执行步骤; 执行计划按照层次逐步缩进,从左至右看,缩进最多的那一步,最先执行,如果缩进量相同,则按照从上而下的方法判断执行顺序,可粗略认为上面的步骤优先执行。每一个执行步骤都有对应的COST,可从单步COST的高低,以及单步的估计结果集(对应ROWS/基数),来分析表的访问方式,连接顺序以及连接方式是否合理。 2.3.2.4 分析表的访问方式 表的访问方式主要是两种:全表扫描(TABLE ACCESS FULL)和索引扫描(INDEX SCAN),如果表上存在选择性很好的索引,却走了全表扫描,而且是大表的全表扫描,就说明表的访问方式可能存在问题;若大表上没有合适的索引而走了全表扫描,就需要分析能否建立索引,或者是否能选择更合适的表连接方式和连接顺序以提高效率。 2.3.2.5 分析表的连接方式和连接顺序 表的连接顺序:就是以哪张表作为驱动表来连接其他表的先后访问顺序。 表的连接方式:简单来讲,就是两个表获得满足条件的数据时的连接过程。主要有三种表连接方式,嵌套循环(NESTED LOOPS)、哈希连接(HASH JOIN)和排序-合并连接(SORT MERGE JOIN)。我们常见得是嵌套循环和哈希连接。 嵌套循环:最适用也是最简单的连接方式。类似于用两层循环处理两个游标,外层游标称作驱动表,Oracle检索驱动表的数据,一条一条的代入内层游标,查找满足WHERE条件的所有数据,因此内层游标表中可用索引的选择性越好,嵌套循环连接的性能就越高。 哈希连接:先将驱动表的数据按照条件字段以散列的方式放入内存,然后在内存中匹配满足条件的行。哈希连接需要有合适的内存,而且必须在CBO优化模式下,连接两表的WHERE条件有等号的情况下才可以使用。哈希连接在表的数据量较大,表中没有合适的索引可用时比嵌套循环的效率要高。 2.3.3 优化器 Oracle优化器分为基于规则的优化器(RBO)和基于代价的优化器(CBO)。 2.3.3.1 规则的优化器(RBO) RBO的优化方式,依赖于一套严格的语法规则,只要按照规则写出的语句,不管数据表和索引的内容是否发生变化,不会影响PL/SQL语句的"执行计划"。 2.3.3.2 基于代价的优化器(CBO) CBO计算各种可能"执行计划"的"代价",即cost,从中选用cost最低的方案,作为实际运行方案。各"执行计划"的cost的计算根据,依赖于数据表中数据的统计分布,ORACLE数据库本身对该统计分布是不清楚的,须要分析表和相关的索引,才能搜集到CBO所需的数据。 2.3.4 表分析analysis 2.3.4.1 说明 analyze table,一般可以指定分析表、所有字段、所有索引字段、所有索引,若不指定则全部都分析。 2.3.4.2 表分析 analyze table dy_info compute statistics; 2.3.4.3 删除分析数据 analyze table dy_info delete statistics; 2.3.5 oracle添加强制索引 如果使用的是CBO的话,可能SQL不执行索引,则可以添加强制索引执行索引。 2.3.5.1 语法 /*+index(tablename indexname)*/ 2.3.5.2 举例 select /*+index(t INDEX_SAP)*/* from dy_info t where t.sap = 'T6000890'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值