你还不会SQL Server数据库吗?一篇让你学会SQL数据库基础(从零开始超详解)

目录

SQL Server数据库简介:

1,主要特性

2,SQL安装

3,SQL数据库创建

4,关于数据库的操作

4.1,SQL数据库的修改和删除

4.1.1 修改

4.1.2 删除

4.2,SQL数据类型

4.2.1 数字类型

4.2.2时间类型

4.2.3字符串类型

5,关于表的操作

5.1 创建表

5.2 修改,删除表结构

5.2.1 修改表结构

5.2.2删除表结构

5.3 定义主键外键

5.3.1 增加主键(上面都有)

5.3.2 删除主键

5.3.3 添加外键

5.3.4 删除外键

5.4 新增表数据

5.5 查询表结构

5.5.1 Distinct\Top用法

5.6 修改表数据

5.7 删除表记录

6,语句

6.1 条件限制while

6.2 between语法

6.3 子查询in

6.4 子查询EXISTS

6.5返回记录排序

6.6 关联查询

6.6.1 inner join

6.6.2 left join

6.6.3 right join

7,函数

7.1 聚合函数avg(),sum()

7.1.1 avg()

7.1.2 sum()

7.2 聚合函数min(),max()

7.2.1 min()

7.2.2 max()

7.3 count()和sum()函数

7.3.1 sum() 

7.3.2 count()

7.4 len()函数

7.5 随机数产生

7.6 getdate()和getutcdate()函数

7.7 convert()函数

7.8 datediff()函数

7.9 datepart()函数

7.10 charindex()和patindex()函数

7.10.1 charindex()函数

7.10.2 patindex()函数

7.11 stuff()函数

7.12 substring()函数

7.13 left()和right()函数

7.14 ltrim()和rtrim()函数

7.15 upper()和lower()函数

7.16 replace()函数

7.17 replicate()和space()函数

7.18 reverse()函数

7.19 cast()函数

7.20 case()函数


SQL Server数据库简介:

SQL是一种关系型数据库,是一个可扩展的,高性能的,为分布式客户机/服务器计算所和设计的数据库管理系统

1,主要特性

  • 高性能设计

  • 系统管理先进,支持图形化管理工具,支持本地和远程的系统管理和配置

  • 强壮的事务处理能力

  • 支持对称多处理结构,存储过程,ODBC,并具有自主的SQL语言

2,SQL安装

这个地方不好意思,搞错了,这个地方是linux的centos版本的下载。如果需要下载虚拟机可以看看

镜像文件:http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/

VM虚拟机下载地址:https://download3.vmware.com/software/wkst/file/VMware-workstation-full-10.0.4-2249910.exe

推荐安装教程:Linux从0到1:安装Linux操作系统(超级详细版)_sunshine1_彤的博客-CSDN博客_linux安装

VM虚拟机密钥可以百度直接搜索:VM虚拟机各版本密钥;

上面VM虚拟机链接密钥(下面三个应该都可以):

1Z0G9-67285-FZG78-ZL3Q2-234JG
4C4EK-89KDL-5ZFP9-1LA5P-2A0J0
HY086-4T01N-CZ3U0-CV0QM-13DNU

3,SQL数据库创建

下面都用的是语句创建,没有展示如何界面话创建

create database Tset01          --数据库名称
on Primary
(
name ='Test01_1',       --数据文件名称
filename='E:\SQL数据库\Test01_1.mdf',        --保存地址
size=10mb,           --起初大小
maxsize=100mb,          --最大大小
filegrowth=5mb               --增长速率
)
log on
(
name ='Test01_2',       --日志文件名称
filename='E:\SQL数据库\Test01_2.ldf',
size=5mb,
maxsize=50mb,
filegrowth=5mb
)

4,关于数据库的操作

4.1,SQL数据库的修改和删除

4.1.1 修改

alter database oldname
modify name=newname;

alter database 数据库名称
modify file(
name ='将要修改的文件名称',                 --这个文件名称不能修改     
size=20mb,
maxsize=50mb,
filegrowth=1mb
);

exec SP_HELPDB 数据库名称;            --查看数据库的内部结构

alter database Tset01             --修改名字
modify name=Test02;

alter database Test02       --修改属性
modify file(
name ='Test01_1',
size=20mb,
maxsize=50mb,
filegrowth=1mb
);

exec SP_HELPDB Test02;         --查看数据库结构

4.1.2 删除

drop database 数据库1,数据库2,数据库3;(需要删除几个中间用空格隔开即可)

create database Test;       --创建一个新数据库
drop database Test;      --将新创建的数据库删除

4.2,SQL数据类型

数据类型是一种属性,用于指定对象可保存的数据的类型:整型数据,字符数据,日期和时间,二进制字符串等等。

4.2.1 数字类型

数据类型描述存储
tinyint允许从 0 到 255 的所有数字。1 字节
smallint允许从 -32,768 到 32,767 的所有数字。2 字节
int允许从 -2,147,483,648 到 2,147,483,647 的所有数字。4 字节
bigint允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。8 字节
decimal(p,s)

固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节
numeric(p,s)

固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节
smallmoney介于 -214,748.3648 和 214,748.3647 之间的货币数据。4 字节
money介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。8 字节
float(n)从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 参数 n 指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。4 或 8 字节
real从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。4 字节

4.2.2时间类型

数据类型描述存储
datetime从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。8 bytes
datetime2从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。6-8 bytes
smalldatetime从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。4 bytes
date仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。3 bytes
time仅存储时间。精度为 100 纳秒。3-5 bytes
datetimeoffset与 datetime2 相同,外加时区偏移。8-10 bytes
timestamp存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。

4.2.3字符串类型

数据类型描述存储
char(n)固定长度的字符串。最多 8,000 个字符。n
varchar(n)可变长度的字符串。最多 8,000 个字符。
varchar(max)可变长度的字符串。最多 1,073,741,824 个字符。
text可变长度的字符串。最多 2GB 字符数据。

5,关于表的操作

5.1 创建表

主键:大多数表有一个主键,主键由表的一列或者多列组成。主键始终是唯一的,表中的任何主键都不能重复。

create table 表名称(
属性 数据类型 primary key not null,
属性 数据类型(自行添加是否可以为空),
..................
);

如果需要添加多个主键,则在前面不用写primary key,在最后加上primary key(属性1,属性2,.....)
primary key(ID,name)

create table Student(
ID int primary key not null,
name varchar(10) not null,
age int not null,
claseID int
);

5.2 修改,删除表结构

5.2.1 修改表结构

如果使用界面话修改,此处可能出现修改不成功的情况,修改后系统不让保存;

我找到的一个方法链接:https://jingyan.baidu.com/article/a17d5285761845c098c8f282.html

  • 更改字段类型长度

alter table 表
alter column 字段名 类型的长度;

  • 更改字段类型

alter table 表
alter column 字段名 更改后的类型;

  • 添加not null约束

alter table 表
alter column 字段名 数据类型 not null;

  • 设置主键

alter table userint
add constraint 主键名称 primary key(字段名)

  • 更改字段名

EXEC sp_rename '字段.字段名',
'更改后的字段名','column'

  • 添加字段名

alter table 表 add 字段名 字段类型 default null

--更改字段长度
alter table Student
alter column name varchar(100);

--更改字段类型
alter table Student
alter column age float;

--添加not null约束
alter table student
alter column classID int not null;

--设置主键(前提是表结构中没有设置主键)
alter table student
add constraint Kname primary key(name);

--更改字段名
EXEC sp_rename 'student.age',
'ages','column';

--添加字段名
alter table student
add num int default null

5.2.2删除表结构

drop table 表1,表2,表3;(需要删除几个,就添加几个表,中间用逗号隔开)

--删除表结构
drop table student;

5.3 定义主键外键

  1. 主关键字是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录。一个表中只有一个关键字。主关键字又可以称为主键。主键可以由一个字段,也可以由多个字段组成,分别称为单字段主键或多字段主键。又称主码,并且它可以唯一确定表中的一行数据,或者可以唯一确定一个实体。
  2. 外键表示了两个关系之间的相互联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字
  3. 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。

5.3.1 增加主键(上面都有)

alter table 表名
add constraint 主键名 primary key(属性);

5.3.2 删除主键

alter table 表名 drop 主键名

5.3.3 添加外键

alter table 将要加入外键表
add constraint 外键名字 foreign key(增加外键字段) references 主键表(主键字段);

alter table student
add constraint F_classid foreign key(classid) references class(classid);

5.3.4 删除外键

alter table 表名 drop constraint 外键名

5.4 新增表数据

  • 插入单行数据

insert into 表名 (栏位1,栏位2,栏位3......)
values(值1,值2,值3);

  • 插入多行数据

insert into 表名 (栏位1,栏位2,栏位3......)
values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3)......;

--插入一行数据
insert into Student1 (ID,name,age,claseID)
values(1,'小明',12,11);

--插入多行数据
insert into Student1 (ID,name,age,claseID)
values(2,'小红',13,3),
(3,'小刚',14,3),
(4,'小陈',15,4),
(5,'小李',16,4);

5.5 查询表结构

select 字段名称(*代表全部)  from 表

select * from Student1;
select name,id from student1;

5.5.1 Distinct\Top用法

  • Distinct(去除重复的值)

select  distinct 字段名称 from 表 

  • Top(前n行数据)

select top 行数 字段名称  from 表

select distinct * from Student1;
select top 3 name,id from student1;

5.6 修改表数据

update 表 
set 字段名 = 新数据

update student1 
set id = 5
where name='小明';   --限制条件,修改哪一条数据

5.7 删除表记录

delete from 表

delete from student1
where name='小明'     --限制条件,删除哪一行

6,语句

6.1 条件限制while

  • 精确限制条件

where 字段=值

  • 模糊限制条件

where 字段like'%值%'        --表示带有值的数据,%放在那一边表示那一边的字可有可无

where name like'%红%';          --带有红字的数据

6.2 between语法

用法限制条件表达式,指定表达式范围值

  • (not) between 值1 and 值2;
select distinct * from Student1
where age not between 13 and 15;

6.3 子查询in

用于限制条件表达式,指定表达式范围值

  • (not) in(值1,值2,值3.......)       --或者扩号里面可以写语句
select distinct * from Student1
where age in(13,14,15);

6.4 子查询EXISTS

  • exists用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回true或false
  • existe指定一个子查询,检测行的存在
select *from student          --显示两表中共同的数据
where exists(select *from class where Student.classid=Class.classID)

6.5返回记录排序

order by 字段名 (asc/desc)          --asc升序,desc降序,不加的话默认为升序;多个限制字段按从前往后

select *from student
order by classID asc,age desc

6.6 关联查询

6.6.1 inner join

交叉关联,只返回两个表中联结字段相等的值

select *from 表1
inner join 表2
on 表1.字段=表2.字段

6.6.2 left join

左关联,返回包含左表中的所有记录和右表中联结字段相等的值

select *from 表1
left join 表2
on 表1.字段=表2.字段

6.6.3 right join

右关联,返回包含右表中的所有记录和左表中联结字段相等的值

select *from 表1
right join 表2
on 表1.字段=表2.字段

select *from student        --交叉关联
inner join class
on student.classid=class.classID

select *from student         --左关联
left join class
on student.classid=class.classID

select *from student        --右关联
right join class
on student.classid=class.classID

7,函数

7.1 聚合函数avg(),sum()

7.1.1 avg()

  • 返回组中各值的平均值。其中忽略null值
  • 计算字段类型必须为数字型(整数,小数)
  • select avg(字段) from 表 

7.1.2 sum()

  • 返回表达式中所有值的和。其中忽略null值
  • 只能用于数字列
  • select avg(字段) from 表 

select avg(Student.age) as'年龄平均' from student
select sum(Student.age) as'年龄总和' from student

7.2 聚合函数min(),max()

7.2.1 min()

  • 返回表达式中最小值
  • 忽略任何null值
  • 计算字段类型可以为数字型或字符型
  • select min(字段) from 表 

7.2.2 max()

  • 返回表达式中最大值
  • 忽略任何null值
  • 计算字段类型可以为数字型或字符型
  • select max(字段) from 表

select min(Student.age) as'年龄最小' from student
select max(Student.age) as'年龄最大' from student

7.3 count()和sum()函数

7.3.1 sum() 

同上

7.3.2 count()

  • 返回组中的项数
  • 其中忽略null值
  • 计算字段类型必须为整型
  • select count(字段) from 表 

 select count(Student.age) as'字段数' from student

7.4 len()函数

  • 返回指定字符串表达式的字符数
  • 其中不包含尾随空格
  • 若要返回用于表达式的字节数,使用datalength()函数
  • select len(字段)  from 表
select len(Student.age) as'字符数' from student
select datalength(Student.age) as'字节数' from student

7.5 随机数产生

  • select rand()      可以得到一个随机小数
  • select floor(rand()*N)          返回小于或等于所给数字表达式的最大整数
  • select ceiling(rand()*N)          返回大于或等于所给数字表达式的最大整数
  • eg:    floor(8.122)=8;ceiling(8.122)=9
select rand()
select floor(rand())
select ceiling(rand())

7.6 getdate()和getutcdate()函数

  • getdate()   返回当前数据库的系统时间值,返回值的类型为datetime
  • getutcdate() 返回当前国际标准时间值,返回值的类型为datetime
select getdate() as '当前时间'
select GETUTCDATE() as '国际标准时间'

7.7 convert()函数

  • 该函数是把日期转换为新数据类型的通用函数
  • 可以用不同的格式显示日期/时间数据
  • convert(长度,日期,格式)
格式数字
对应格式
0 或 100 (*)mon dd yyyy hh:miAM(或 PM)
101mm/dd/yyyy
102yy.mm.dd
103dd/mm/yy
104dd.mm.yy
105dd-mm-yy
106dd mon yy
107mon dd, yy
108hh:mm:ss
9 或 109 (*)mon dd yyyy hh:mi:ss:mmmAM(或 PM)
110mm-dd-yy
111yy/mm/dd
112yymmdd
13 或 113 (*)dd mon yyyy hh:mm:ss:mmm(24h)
114hh:mi:ss:mmm(24h)
20 或 120 (*)yyyy-mm-dd hh:mm:ss[.fff]
21 或 121 (*)yyyy-mm-dd hh:mm:ss[.fff]
126(***)yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
130*dd mon yyyy hh:mi:ss:mmmAM
131*

dd/mm/yy hh:mi:ss:mmmAM

select CONVERT(varchar(50),getdate(),101)
select CONVERT(varchar(50),getdate(),102)
select CONVERT(varchar(50),getdate(),103)
select CONVERT(varchar(50),getdate(),104)
select CONVERT(varchar(50),getdate(),105)
select CONVERT(varchar(50),getdate(),106)
select CONVERT(varchar(50),getdate(),107)
select CONVERT(varchar(50),getdate(),108)
select CONVERT(varchar(50),getdate(),109)
select CONVERT(varchar(50),getdate(),110)

7.8 datediff()函数

  • datediff()函数返回两个日期之间的天数

  • datediff(日期类型,日期1,日期2)

  • dateadd()函数返回两个日期之间的天数

  • dateadd(日期类型,天数,日期)

select dateadd(YY,5,'08-12-29 16:25:46.635')
select dateadd(MM,5,'08-12-29 16:25:46.635')
select dateadd(DD,5,'08-12-29 16:25:46.635')
select dateadd(HH,5,'08-12-29 16:25:46.635')

7.9 datepart()函数

  • 用于返回日期/时间的单独部分,比如年,月,日,小时,分钟等;返回类型是一个int类型
  • datename()同样是返回一个日期/时间的单独部分,返回类型是一个varchar()型
  • day(),Month(),year()
select DATEPART(yy,GETDATE())
select DATEPART(mm,GETDATE())
select DATEPART(dd,GETDATE())
select DATEPART(hh,GETDATE())
select DATEPART(mi,GETDATE())
select DATEPART(ss,GETDATE())

select DATENAME(yy,GETDATE())      --varchar类型

select YEAR(GETDATE())
select month(GETDATE())
select day(GETDATE())

7.10 charindex()和patindex()函数

7.10.1 charindex()函数

  • 返回字符或者字符串在另一个字符串中的起始位置
  • charindex(寻找的字符(串),字符串,[开始的位置(根据需要添加)])
  • 如果找到,则返回一个整数,整数即为位置;如果没有找到,则返回0

7.10.2 patindex()函数

  • 该函数支持通配符,不加%则需要完全相同
  • eg:%a,则需要结尾是a;a%,则需要开头是a;%a%,可以正确找到a的位置
  • patindex('%寻找字符(串)%',字符串)
select charindex('c','abcdefg')
select charindex('c','abcdefg',5)

select PATINDEX('%g','abcdefg')
select PATINDEX('g%','abcdefg')
select PATINDEX('%g%','abcdefg')

7.11 stuff()函数

  • 用于删除指定长度的字符,并可以在指定的起点处插入另一组字符,返回类型是一个字符串型
  • stuff(列名,开始位置,长度,替代字符串)
select stuff('aabbccddee',5,4,'')
select stuff('aabbccddee',5,4,'111111')

7.12 substring()函数

  • 用于截取指定长度的字符串
  • substring(列名,开始位置,截取长度)
select substring('aabbccddee',5,4)

7.13 left()和right()函数

  • left()返回字符串从左边开始指定个数的字符
  • left(列名,长度)
  • right()返回字符串从右边开始指定个数的字符
  • right(列名,长度)
select left('aabbccddee',5)
select RIGHT('aabbccddee',5)

7.14 ltrim()和rtrim()函数

  • ltrim()删除起始空格后返回字符表达式
  • ltrim(列名)
  • rtrim()删除尾随空格后返回字符表达式
  • rtrim(列名)
select ltrim('   aabbcc  ddee   ')
select rtrim('   aabbcc  ddee   ')

7.15 upper()和lower()函数

  • upper()返回将小写字符数据转换为大写的字符表达式
  • upper(列名)
  • lower()返回将小写字符数据转换为大写的字符表达式
  • lower(列名)
select upper('aabbccddee')
select lower('aabbccddee')

7.16 replace()函数

  • 用一个字符串值替代出现的所有指定字符串
  • replace(列名,被替代值,替代值)
select replace('aabbccddeeaa','aa','11')

7.17 replicate()和space()函数

  • replicate()以指定的次数重复字符表达式
  • replicate(字符表达式,次数)
  • space()返回指定个数的空格表达式
  • space(次数)
select replicate('aa',5)
select space(5)
select replicate('aa',5)+space(5)+replicate('aa',5)

7.18 reverse()函数

  • 用于倒置字符串中各个字符的位置
  • reverse(字符串)
select reverse('aabbccddee')

7.19 cast()函数

  • 用于将某种数据类型的表达式显示转换为另一种数据类型
  • cast(字符串 as 数据类型)
select cast(111 as varchar(10))
select cast(111 as varchar(10))+'aaaa'

7.20 case()函数

  • 是一种简单的条件判断转换的一个函数

  • 简单case函数:case 字段 when '1' then 'a' when '2' then 'b' else 'c'end

  • case搜索函数:case when 字段='1' then 'a' when 字段='2' then 'b' else 'c' end

select *,case id when '1' then '一号' when '2' then '二号' else '其它'end
from student

select *,case when age<12 then '儿童' when age<15 and age>=12 then '青少年' else '少年'end
from student

  • 33
    点赞
  • 143
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
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'

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大学生毕设

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值