数据库中的一些基本用法

1.SQL语言的动词

功能动词
创建定义creat
删除定义drop
修改定义alter
数据查询select
数据插入insert
数据更新update
数据删除delete
授予权限grant
回收权限revoke

2.SQL语言的基本数据类型

数据类型含义
number(p,s)数字类型;其中“p”是精度(数字总位数),最大38位;“s”是刻度范围(小数点的位数),可在84-127间取值。
char(n)可存储字母符号,数字符号,以及特殊符号;n是字符长度(1-2000)缺省值为1,每个字符占用一个字节,如果实际输入字符不足n个,则用空格补充
varchar2(n)变长字符型数据;n是字符长度(1-4000),没有缺省值,必须设值,存储大小为输入数据的字节实际长度,而不是n个字节。一般情况下可以节省空间但仍然有不足之处,不能过度使用。一个汉字占两个字节。
text最大长度为65535个字符
date日期,默认格式:DD-MON-YY,如“01-1-04”表示2004年1月1日
boolean布尔类型,仅仅可以表示true或false或null

3.代码演示

create table SC
	(Son char(5)/* primary key*/,
	Con char(2),
	Grade number(3),
	constraint SC_pk primary key(Son,Con),
	/*constraint Son_fk foreign key (Son) References S(Son),*/
	constraint Ck1 check(Grade>=0 and Grade<=100)
	);

4.修改基本表:
(1)、add:为表增加一新列,新列必须允许为空(除非有默认值)。

alter table S add Birthday date;

(2)、drop column:在表中删除一个原有的列。

alter table S drop column Birthday;

(3)、modify:修改表中原有列的定义。

alter table S modify (Age unmber);

(4)、add constraint:增加新的表级约束。
(5)、drop constraint:删除原有表级约束。

alter table SC drop constraint Ck1;

(6)、rename:重新命名,表名,视图序列或同义词名。

rename SC to Detail_SC;

(7)、删除表:只有表的创建者或具有drop any table权限的用户才能删除表格。

drop table S;

(8)、truncate table:截断基本表,删除表中的所有行并释放存储空间,只有表格的所有者或有delete table系统权限的用户才能截断表,虽然delete语句也可以删除表中的所有行,但它不能释放存储空间,且truncate更快。

truncate table S;

5.索引的创建和撤销
索引的使用是有代价的,维护表的同时要更新索引,所以有索引的表格的维护过程比较费时间。
索引的建立包括自动建立和手动建立:自动方式,在表的定义中,当定义一个primary key 或 unique 约束时,一个唯一索引被建立。

手动方式:
(1)、unique表示:规定索引的每一个索引的值只对应于表中唯一的记录。

create unique index S_idx on S(Sno);

(2)、每个列名后都可以指定ASC(升序)或DESC(降序),默认ASC。若索引有多个列决定,则首先以第一个列的值排序,该列值相同的记录,按下一列值排序,以此类推。

create unique index SC_idx on SC(Sno ASC,Cno DESC);

(3)、删除索引

drop index S_idx;

6、SELECT语句的基本格式

(1)、语句格式
select [all|distinct] <目标列表达式> [as <别名>][,<目标列表达式>[[as <别名>],…] from <关系名>[<关系别名>][,<关系名>[关系别名],…] [where <条件表达式>] [group by <用于分组的别名>] [having<对组再选择的条件表达式>] [order by <用于分组的列名> [ASC|DESC] [,<用于排序的列名>[ASC|DESC]],… ]

说明:
<1> all | distinct
all:查询出所有符合条件的分组(默认为all),distinct:查询出的分组中每组重复元组只输出一条。

<2> <目标列表达式>的一般格式

a) [<关系名>.]<属性列名>
即为 表名.列名, 若被查询各关系中,只有一个关系有该属性,则关系名可省略。

b) [<关系名>.] *
即为 表名. * ,若结果关系的各列正好是被查询的关系的所有属性时,则可用此格式。若被查询的关系只有一个,则上述关系名可省略。

c) 不含有任何被查询关系中属性名
最极端时,该表达式只由一个常量组成,则该列的列名和各元组的分量都为此常量。

d) [<关系名>.]<目标列表达式>
表达式中可以对目标列施加算术运算和函数运算:count(),max(),min(),sum(),avg()等。

<3> <别名>
a) 当目标列中含有特殊字符(如:±*/)或函数时,会使列变得模糊,为此取别名很有必要。查询结果关系中该列的列名就是此别名。如果别名中包含特殊字符(如#)时,或大小写敏感时,应该将别名放在双引号(“ ”)中。

b) 使用连字运算符
使用连字运算符“||”,可以进行列与列之间,列与算术表达式之间或者列与常数之间的连接,来创建一个字符表达式。
例如:

select Sname||Sdept as "student" from S;

此例中,Sname与Sdept 被连接合并到一个单元输出列,并且被指定为列别名student。

c) 使用文字字符串
文字字符串可以是一个数字或一个日期,对每个返回行打印一次,任意格式文本的文字字符串能够包含在查询结果中。
例如:

select Sname||'is long to'||Sdept as "student" from S;

(4)常用的查询条件

查询条件谓词
比较=,>,<,>=,<=,<>,NOT+上述比较运算方符
确定范围between…and , not between … and…,
确定集合in , not in
字符匹配like , not like
空值is null , is not null
多重条件and , or

7、查询语句举例

select Sname, Spec, Age, from S where Age between 20 and 25;
select Sname from S where Sname not like '王%';
select Sno, Cno, from SC where grade is null;
select Sno from SC where Grade in (80,85,90);

/*查询全体学生情况,查询结果按所在系名升序排列,
若是同一系的则按专业名升序排列,若又是同一专业的,按照年龄降序排列*/
select * from S order by Sdept, Spec, Age DESC;

(1)笛卡尔积:

select S.* , C.* from S,C;

(2)自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自身进行连接。

select X.Sno , X.Grade from SC X, SC Y where X.Grade>Y.Grade 
and X.Cno='1' and Y.Cno='1' and Y.Sno='00101';

(3)内连接

select * from a_table a inner join b_table bon a.a_id = b.b_id;

(4)左连接
查询每个学生以及他们的学习课程的情况,若某个学生没有选课,则只输出其基本信息,其选修信息为空。

select S.Sno, Sname, Sex, Age, Spec, Sdept, Cno, Grade
from S left outer join SC on S.Sno=SC.Sno;

(5)右连接

select * from a_table a right /*outer*/ join b_table b on a.a_id = b.b_id;

(6)分组查询
a) 集函数
为了增强检索功能,SQL提供了许多集函数,主要有:

集函数功能
count( [ distinct / all ] * )统计元组个数
count( [ distinct / all ] * <列名> )统计一列中值的个数
sum( [ distinct / all ] * <列名> )计算一列值的总和(此列必须是数值型)
avg( [ distinct / all ] * <列名> )计算一列值的平均值(此列必须是数值型)
max( [ distinct / all ] * <列名> )求一列值中的最大值
min( [ distinct / all ] * <列名> )求一列值中的最小值
/*查询选修"2"号课程的学生人数和平均成绩*/
select count( Sno ), avg( Grade ) from SC where SC.Cno='2';

/*查询各门课程号以及相应的学生人数和平均成绩*/
select Sno , count( distinct sno), avg( Grade ) from SC group by Cno;

/*查询开设专业少于3个的系名以及专业数*/
select Sdept, count( distinct Spec) from S 
group by Sdept having count( distinct Spec)<3  ;

下面的网址写出了where与 having之间的区别用法
https://blog.csdn.net/jdjh1024/article/details/76647866

(7)嵌套查询
嵌套查询中先处理子查询后处理父查询,特别指出的是:子查询的select语句中不能使用order by子句,order by字句只能对最终的查询结果排序。

a) 不相关子查询

子查询的查询条件不依赖父查询,子查询一般写在谓语动词之后,有以下形式:

i) <属性名>[ not ] in ( select 子查询);

查询与“李敏浩”选修同一专业的学生的姓名和学号:

select Sno ,Sname from S where Spec in
(select Spec from S where Sname ='李敏浩');

ii) <属性名>¥( select 子查询);当用户确切知道查询结果为单值,用该形式,其中¥为比较运算符。

查询与“李敏浩”同系,切=且年龄大于“李勇”的学生信息:

select Sname, Age, Spec from S where Spec=
(select Spec from S where Sname='李敏浩') and 
Age>(select Age from S where Sname='李勇');

iii) <属性名>¥[ any | all ]( select 子查询) ;

查询其他系中比计算机系某一学生年龄小的学生学号,姓名和年龄:

select Sno,  Sname, Age from S where Age < any
(select Age from S where Sdept='计算机系') and Sdept<>'计算机系';

iiii) [ not ] between <下限> and<上限>;其中<下限>和<上限>也可以是子查询。

b) 相关子查询

查询条件表达格式:[ not ] exists ( select 子查询)
在此格式中,子查询不返回任何数据,只产生逻辑值,子查询查到元组,条件表达式为真,否则为假。子查询中的 <目标表达式> 一般为 *,因为没有实际意义。

查询没有选择任何课程的学生学号和姓名:

select Sno, Sname from S where not exists
( select * from SC where S.Sno=SC.Sno);

8、插入数据
SQL的数据插入语句 insert 通常有两种形式。一种是插入一个元组,另一种是插入子查询结果。后者可以一次插入多元组。

(1)插入单个元组
插入单个元组,按顺序在表后给出表中每个列名,在values后给出对应的每个列值。插入完整的新元组时,可省略表的列名,插入部分列值,必须在表名后给出要输入的列名。

例如:

insert into S values('02001','李强','男',21,'信息管理','信息系');
insert into SC(Sno,Cno) values ('01302','2');

(2)插入子查询结果
例如:

insert into Courseavg(Cno,Cavg)
	select Cno,avg(Grade) from SC group by Cno;

9、修改数据

update S set Spec ='计算机应用' where Sno = '2';
update SC set Grade = Grade+5 where Cno='2';
update SC set Grade = 0 where '数据库'=(select Cname from C where Cno=SC.Cno);

10、删除数据
删除数据要注意为了维护数据库的一致性,一般应用参照完整性约束定义或者触发器来完成删除数据工作,以下命令不建议使用:

delete from SC where '王丹'=(select Teacher from C where Cno=SC.Cno);

11、视图

视图的优缺点:https://blog.csdn.net/helloxiaozhe/article/details/80171793

12、授予权限与收回权限
(1)系统权限:all 或create database 或create table 或create view

grant create database to U1 with grant option;

with grant option指该用户可以将这种权限赋予其他用户的权限。

(2)对象权限:all 或 select 或 update

grant all on SC to U2;

13、SQL事务处理与游标概念
事务提交:commit 或 commit work;
事务回退:rollback 或 rollback work;事务一旦提交就不能再rollback了。

commit之前,只有当前被操作的记录被锁定,其他用户看不到更改,只有当前用户能看到更改,commit之后则更改完成。
若数据库突然故障或断开连接,数据库自动执行rollback。

设置保存点:savepoint <保存点的名称>
回退到保存点:rollback to savepoint <保存点的名称>
如果事务过长,设置保存点再commit,可以rollback 到保存点的位置。

游标概念略。

14、存储过程与触发器

存储过程例子:

create or replace procedure student_del( p1 in student.sno%type )
as
begin
	delete from student where Sno = p1;
end;

触发器例子:

create or replace trigger sc_upd
	after update on student
	referencing new as new old as for each row
begin
	if updating then 
		update sc set sno =:new.sno where sno=old.sno;
	end if;
end;
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库连接池是一种技术,它可以在应用程序启动时创建一些数据库连接,并将这些连接保存在池,以便需要时可以重复使用这些连接,从而提高应用程序的性能。 数据库连接池的基本原理如下: 1. 在应用程序启动时,创建一定数量的数据库连接。 2. 将这些连接保存在池,并记录每个连接的状态。 3. 当应用程序需要连接数据库时,从连接池获取一个可用连接。 4. 在使用完连接后,将连接放回连接池,以供下次使用。 使用数据库连接池可以提高应用程序的性能,避免不必要的连接创建和销毁。通常情况下,连接池的大小应该根据应用程序的实际情况进行调整,以确保连接池始终有足够的连接可供使用。 常见的数据库连接池有:C3P0、DBCP、Druid等。其,Druid是一个非常优秀的连接池,支持多种数据库,性能优异,使用也比较简单。下面是一个使用Druid连接池的示例代码: ```java // 创建Druid连接池 DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUsername("root"); dataSource.setPassword("123456"); // 获取数据库连接 Connection connection = dataSource.getConnection(); // 使用连接执行SQL语句 Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM user"); // 关闭连接 resultSet.close(); statement.close(); connection.close(); ``` 在上面的示例代码,我们首先创建了一个Druid连接池,并设置了连接的参数。然后,通过调用getConnection()方法获取一个数据库连接,并使用这个连接执行SQL语句。最后,我们需要关闭连接以释放资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值