关系数据库与Sql

1. 数据库连接

1.1 Oracle

1.1.1 命令行连接

sqlplus  /nolog 

conn username/password@IP:[1521]/数据库服务名 [as sysdba]

 

使用tnsname

vi  $ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora

ORCL =                 “orcl服务名”

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 主机IP地址)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ABC)

    )

sqlplus /nolog

conn username@orcl  #使用配置文件内的名字连接,配置文件需在默认位置

 

1.1.2 cx_oracle

 

 

1.2 mysql

1.2.1 命令行连接

连接数据库mysql -u maria -p

使用数据库 use hangzhou;

1.2.2 pymysql

1.3 

 

df sf

2. 数据库管理

2.1 数据库查询

查看数据库                   show   databases;

查看当前使用的数据库  select database();

show tables;

查看数据库状态   status;      

查看表结构             desc t1;  

 

#连接当前系统连接数

select count(*) from v$process        

#查询最大连接数设置

select value from v$parameter where name = 'processes'

 

2.2 用户管理

创建用户 CREATE USER u1 IDENTIFIED BY ’pass’;

修改用户名  RENAME USER u1 TO u2;

修改密码 SET PASSWORD FOR u1 = Password(‘pass’);

修改自己密码  SET PASSWORD = PASSWORD(‘pass’);

删除用户 DROP USER u1;

查看当前登录用户  SELECT USER();

查看用户表   use  mysql;

select  user from user;

 

2.3 权限管理

查看自己的授权 show  grants;

查看其他用户权限 show grants for u1;

授权 grant 权限1,权限2,select  on 数据库.表 to u1;

更新授权    flush privileges;

在数据库test的所有表授予u1用户查询权限

grant select on test.*  to  u1;

收回权限  grant revoke 权限1  on 数据库.表 to u1;

创建用户同时授权

grant reload,lock tables,replication client on *.* to 'uback’@’localhost' identified by 'uback';

 

权限清单

usage 无权限

all 除进行授权本身外的所有权限

 

2.4 事务

创建保存点a   savepoint  a;

回滚到保存点   rollback to a;

回滚到上次保存点  rollback;

提交修改         commit;

2.5 定时任务

2.5.1 创建

declare

  job number;

BEGIN

  DBMS_JOB.SUBMIT(  

        JOB => job,  /*自动生成JOB_ID*/  

        WHAT => 'testJob;',  /*需要执行的存储过程名称或SQL语句*/  

        NEXT_DATE => sysdate,  /*初次执行时间-立即执行*/  

        INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分钟执行一次*/

      );  

  commit;

end;

 

2.5.2 查询

select * from all_jobs where what like ‘%存储过程名字%’;

2.5.3 启动

 

declare

begin

   DBMS_JOB.RUN(24);   /*24 job的id*/

   commit;

end

2.5.4 停止

declare

begin   

  dbms_job.broken(24,true,sysdate);        /*停止一个job,jobId, job的ID,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。   */

commit;

end;

2.5.5 删除

declare

begin

  dbms_job.remove(24);  /*删除自动执行的job,参数是 job的id*/

  commit;

end;

2.5.6 修改

修改执行间隔

declare

begin

  dbms_job.interval(24,interval => 'TRUNC(SYSDATE)+1');  /*第一个参数为job的ID,第二个参数interval: 计算下一次任务执行的时间表达式*/

  commit;

end;

修改下一次执行的时间

 

declare

begin

   dbms_job.next_date(24,to_date('2020-11-9 12:08:00','yyyy-mm-dd hh24:mi:ss')); /*第一个参数:job的ID;第二个参数:要修改后的计算下一次执行的时间表达式*/

   commit;

end;

更换要执行的存储过程

declare

begin

    dbms_job.what(24,'testJob2();');   /* 第一个参数:job的ID;第二个参数:要更改的新操作名称(操作名必须存在)*/

commit;

end;

2.5.7 时间参数说明

INTERVAL 部分参数值示例:

 

每天午夜12点: 'TRUNC(SYSDATE + 1)'

 

每天早上8点30分: 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'

 

每星期二中午12点: 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'

 

每个月第一天的午夜12点: 'TRUNC(LAST_DAY(SYSDATE ) + 1)'

 

每个季度最后一天的晚上11点: 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'

 

每星期六和日早上6点10分: 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'

 

每月25号00:00执行: 'TRUNC(LAST_DAY(SYSDATE ) + 25)'

 

--------------------------

 

1:每分钟执行

Interval => TRUNC(sysdate,'mi') + 1/ (24*60)

Interval => sysdate+1/1440

 

2:每天定时执行

例如:每天的凌晨1点执行

Interval => TRUNC(sysdate) + 1 +1/ (24)

 

 

3:每周定时执行

例如:每周一凌晨1点执行

Interval => TRUNC(next_day(sysdate,'星期一'))+1/24

 

4:每月定时执行

例如:每月1日凌晨1点执行

Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24

 

5:每季度定时执行

例如每季度的第一天凌晨1点执行

Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24

 

6:每半年定时执行

例如:每年7月1日和1月1日凌晨1点

Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24

 

7:每年定时执行

例如:每年1月1日凌晨1点执行

Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

2.5.8 job参数说明

dba_jobs 表中字段含义:

 

JOB                                         任务的唯一标识码

 

LOG_USER         提交任务的用户

 

PRIV_USER         赋予任务权限的用户

 

SCHEMA_USER           对用户作语法分析的用户模式

 

LAST_DATE         最后一次成功执行任务的时间

 

LAST_SEC         最后一次成功执行任务的时间的时分秒

 

THIS_DATE         正在执行的任务的开始时间,若没有则为空

 

THIS_SEC 正在执行的任务的开始时间的时分秒,若没有则为空

 

NEXT_DATE 下一次执行定时任务的时间

 

NEXT_SEC 下一次执行定时任务的时间的时分秒

 

TOTAL_TIME 执行当前任务所需要的时间,单位:秒

 

BROKEN         标志参数,Y表示任务中断,以后不会再运行

 

INTERTAL 计算下一次执行定时任务的时间表达式

 

FAILURES 当前定时任务执行失败的总次数

 

WHAT 执行任务的PL/SQL代码块

 

NLS_ENV 任务执行的NLS会话设置

 

MISC_ENV 定时任务运行的其他一些参数设置

 

INSTANCE 标识当前任务运行是否受限,0 没有受限

 

 

  •  

 

 

 

3. 表操作

3.1 建表

创建表空间

create  tablespace  abc  

datafile  ‘/u01/app/oracle/oradata/TestDB11/catalog.dbf’ 自定义数据文件位置及名字   

size  100M                    #大小

extent  management  local  autoallocate    扩展自动管理

segment  space  management  auto;

 

创建表

CREATE  TABLE  t1 (

   c1  varchar2(50)  PRIMARY  KEY        主键

   c2  date  REFERENCES  t2(c2)          外键关联到t2的c2列 

   c3  date  UNIQUE                    唯一约束,该列的值不可以重复

   c4  date  not null                     非空

c5  date )

   TABLESPACE abc;                                   指定表空间

复制创建

CREATE TABLE test TABLESPACE abc AS SELECT * FROM test2;

仅复制表结构

CREATE TABLE tes  AS SELECT * FROM test2 where rownum<1;

 

 

3.2 新增

增加列   ALTER TABLE test ADD hobby nvarchar2(20);

添加索引 CREATE INDEX  index1  ON  t1(c1)

添加唯一索引 CREATE UNIQUE INDEX index1 ON t1(c1)

添加主键 ALTER TABLE t1  ADD  PRIMARY KEY(字段名);

添加主键 ALTER TABLE test ADD CONSTRAINT test_pk PRIMARY KEY(ename);

添加外键 ALTER TABLE t ADD CONSTRAINT f3 FOREIGN KEY(c2) REFERENCES t3(id); 

//外键条件,一个表的非主键连接另一个表的主键

添加唯一约束 ALTER TABLE test ADD UNIQUE(id);

check约束 ALTER TABLE test ADD CONSTRAINT emp_chk CHECK(empno>7000);

 

3.3 删除

#删除表空间

drop  tablespace  abc               

including  contents                    同时删除表空间中的数据

cascade  constraints;                  同时删除完整性限制

 #删除表

DROP TABLE test1             

CASCADE CONSTRAINTS PURGE;    #同时删除引用及数据文件

 

删除列  ALTER TABLE test DROP COLUMN hobby;

删除唯一约束 ALTER TABLE test DROP UNIQUE(id);        #列名

删除约束 ALTER TABLE test DROP CONSTRAINT emp_chk ;   #约束的名字

删除主键 ALTER TABLE t1 DROP PRIMARY KEY ;                 

删除主键 ALTER TABLE test DROP CONSTRAINT id_pk;      #主键名字

删除外键 ALTER TABLE new DROP CONSTRAINT new_test3;  #外键名字

 

 

 

3.4 修改

改表名 ALTER TABLE t6 RENAME TO t3;      

改列名  ALTER TABLE test RENAME COLUMN id TO id1;

改列数据类型 ALTER TABLE t MODIFY id integer;

设置列非空  ALTER TABLE test MODIFY ename NOT NULL;

设置列可以为空  ALTER TABLE test MODIFY ename NULL;

列设置默认值 ALTER TABLE test MODIFY(id DEFAULT 22);

 

3.5 查询

获取表的全部字段

select wm_concat(column_name) from user_tab_columns where table_name=upper('tableName')

查询表字段类型

select * from all_tab_cols where table_name=upper('表名')

查询建表语句(可以看字段类型)

select dbms_metadata.get_ddl('TABLE',upper('表名')) from dual;

 

查询索引

select  *  from all_ind_columns where table_name=upper('表名')

4. 数据类型

5. 插入

INSERT INTO test VALUES('smith',7369,5);

INSERT INTO t1(c1,c2,c3) VALUES(’abc’,’123’,’hahaha’);

 

从另一个表查询数据插入

INSERT INTO test(id,ename) SELECT id,ename FROM emp;

insert into tab1 select * from tab2  #一个表全部数据插入另一个表

 

Merge into存在更新,不存在插入,

merge into yytbt t1

using yytb_tmp t2

on (t1.编号=t2.编号)

when matched then

     update set t1.a=t2.a      

when not matched then

     insert  (c1,c2,c3)

     values (t2.a,t2.b,t2.c) '''

 

不能更新on连接的字段,有时update出错,需带where字句

6. 删除

删除某条记录  DELETE FROM t1 WHERE id=5;

删除全部行,可撤销     DELETE FROM test;

删除全部行,不可撤销  TRUNCATE TABLE t1;

删除指定列重复的数据

delete from t1 where rowid not in (select max(rowId) from t1 group by user_Id)

 

7. 更新

更新单字段

UPDATE t1 SET c2=’123’ WHERE c1=young;

 

更新多字段

update t1 set (字段1, c2) = (值1, v2) WHERE c1=young;

 

忽略错误,更新能正常更新的行  

UPDATE IGNORE t1 set

 

使用子查询更新

UPDATE test SET id =(SELECT id FROM t2 WHERE eno=7369) WHERE name=’smith’;

 

 

清空列内容 UPDATE test SET id=null;

 

8. 数据库及表信息查询

8.1 数据库查询

查看数据库                   show   databases;

查看当前使用的数据库  select database();

show tables;

查看数据库状态   status;      

查看表结构             desc t1;  

 

#连接当前系统连接数

select count(*) from v$process        

#查询最大连接数设置

select value from v$parameter where name = 'processes'

8.2 表查询

获取表的全部字段

select wm_concat(column_name) from user_tab_columns where table_name=upper('tableName')

查询表字段类型

select * from all_tab_cols where table_name=upper('表名')

查询建表语句(可以看字段类型)

select dbms_metadata.get_ddl('TABLE',upper('表名')) from dual;

 

查询索引

select * from all_ind_columns where table_name=upper('表名')

select * from all_indexes where table_name = upper('表名') ; --更详细

查询更新时间等

select * from ALL_OBJECTS where object_name =upper('表名')

 

 

 

 

 

 

 

9. 查询select

9.1 基础查询

9.1.1 去重

单字段 select  distinct  c1  from  t1;

多字段 select  distinct(c1,c2)  from  t1;

查询某个字段不重复的全部记录

SELECT *  FROM  t1  WHERE rowid IN (SELECT max(rowid)  FROM  t1 WHERE  lng  IS NOT NULL GROUP BY  channel_id )

 

9.1.2 模糊查询

like  

where  c1  like ‘_alo%’; not like

_           单个字符

% 零或多个字符,无法匹配null

[abc]               其中一个字符

[^abc]              不在其中的字符

[!abc]               同上

 

regexp_like    正则表达式

where regexp_like(列名c1,'\d+$');  匹配出0到多个数字结尾的项

 

9.1.3 限制返回行数

Oracle查询前6行  select  c1 from  t where rownum<6; 符号只能< ,<= ,!=

Mysql查询前6行    select  c1 from  t limit  6;         计数从0开始

Mysql查询从第7行开始的6行

select  c1 from  t1  limit 6,6;  

   

Oracle查询第6行以后的数据

SELECT c1 ,c2 from ( SELECT ROWNUM  N, c1 ,c2  FROM  t1 )  WHERE  N>6

注:内层rownum 一定要用别名, 不然会冲突出错

 

 

9.1.4 日期查询

字符串转时间to_date(c1, 'YYYY-MM-DD HH24:MI:SS' )

时间转字符串 to_char(时间列,  'YYYY-MM-DD' )

时间列查询  20210930以后的数据

where  to_char(时间列, 'YYYY-MM-DD')  >  20210930

 

9.1.5 连接与子查询

 

INNER  JOIN 

SELECT a.a1,b.b1 FROM a,b WHERE a.a2=b.b2;

SELECT a.a1,b.b1 FROM a JOIN b ON a.a2=b.b2;  

full join 全连接

left join,左连接

right join

 

union

将两个select语句的查询结果合并到一起,表1的数据在上,对应列的数据类型要相同,union得到的结果会去重,

union all

同上,不去重

嵌套子查询

先执行括号内的子查询,再执行父查询

相关子查询

先执行父查询,父查询的结果逐行传递给子查询执行.即父查询的每一行都执行一遍子查询

select    c1,c2,c3 from t1 where c3>

(select  avg(c4) from t1 where  c1=t1.c1)

 

9.1.6 列转行

把查询出的某列显示在一行 select wm_concat(c1) from t1

根据分组把某列展示为多行 select wm_concat(c1) from t1 group by c2

 

9.1.7 操作符

IN:    

WHERE  LastName  IN  ('Adams','Carter');  

WHERE  LastName  IN  (select c2 from t2);

             NOT IN

  

IN 先查询外表(左侧),再查询内表(右侧)

比or快,可以代替or

EXISTS:

WHERE  LastName  EXISTS  (select c2 from t2);

 

EXISTS 先查询内表(右侧),再查外表

用NOT EXISTS 代替NOT IN ,

 

 

BETWEEN区间:    

WHERE Name BETWEEN 'Adams' AND 'Carter'

NOT BETWEEN  (数值,文本,日期等)

 

空值   where  id  is null;       is not null 

9.2 字符串函数

删除指定字符(删除c1字段中的楼和层, a可以是任意c1中不存在的字符)

select  translate(c1 ,'a楼层','a')   from  t1

获取指定字符的位置,instr

instr(c1,’字符’)

instr(c1,’字符’,3,4)

3起始位置, 缺省1

4匹配次数, 缺省全部

拆分列(以-符号拆分c1列, -之前c2, 之后c3)

select c1,

substr(c1, instr(c1, '-')-1) as c2

substr(c1, instr(c1, '-')+1) as c3

 from t1;

 

正则表达式

1.匹配出c1列开头的数字

select   regexp_substr(c1 , '^\d+')  from t1;

 

9.3 

 

              

    

 

上一篇:POJ1222熄灯问题C++


下一篇:Python基于socket模块实现UDP通信功能示例