数据库的增删改查?

数据库的增删改查?,第1张

1、数据库增加数据:

1)插入单行

insert [into] <表名>(列名) values (列值)

例:insert into t_table (name,sex,birthday) values ('开心朋朋','男','1980/6/15')

2)将现有表数据添加到一个已有表 insert into <已有的新表>(列名) select <原表列名>from <原表名>

例:insert into t_table ('姓名','地址','电子邮件')

select name,address,email from t_table

3)直接拿现有表数据创建一个新表并填充 select <新建表列名>into <新建表名>from <源表名>例:select name,address,email into t_table from strde

2、数据库删除数据:

1)删除<满足条件的>行

delete from <表名>[where <删除条件>]。

例:delete from t_table where name='开心朋朋'(删除表t_table中列值为开心朋朋的行)

2)删除整个表 truncate table <表名>

truncate table tongxunlu

注意:删除表的所有行,但表的结构、列、约束、索引等不会被删除;不能用语有外建约束引用的表

3、数据库修改数据 update <表名>set <列名=更新值>[where <更新条件>]

例:update t_table set age=18 where name='蓝色小名'

4、数据库查询数据:

1)精确(条件)查询

select <列名>from <表名>[where <查询条件表达试>] [order by <排序的列名>[asc或desc]]

2)查询所有数据行和列。例:select * from a

说明:查询a表中所有行和列

3)使用like进行模糊查询

注意:like运算副只用于字符串,所以仅与char和varchar数据类型联合使用

例:select * from a where name like '赵%'

说明:查询显示表a中,name字段第一个字为赵的记录

4)使用between在某个范围内进行查询

例:select * from a where nianling between 18 and 20

说明:查询显示表a中nianling在18到20之间的记录

5)使用in在列举值内进行查询

例:select name from a where address in ('北京','上海','唐山')

说明:查询表a中address值为北京或者上海或者唐山的记录,显示name字段

扩展资料:

插入之前需要创建数据表,创建方式如下:

CREATE TABLE 表名称

(

列名称1 数据类型,

列名称2 数据类型,

列名称3 数据类型,

....

)

例如:--流程步骤定义表

create table T_flow_step_def(

Step_no    int not null,     --流程步骤ID

Step_name    varchar(30)    not null, --流程步骤名称

Step_des    varchar(64)    not null,    --流程步骤描述

Limit_time    int not null,     --时限

URL     varchar(64)    not null,     --二级菜单链接

Remark    varchar(256)    not null,

)

参考资料:百度百科-sql语句大全

最近需要对数据进行加密/解密, 因此选用了CryptoJS库, 对数据做DES算法的加密/解密

首选查看官方示例, 将密文进行Base64编码, 掉进一个大坑

<script src="htt p:/ /crypto-js.googlecod e.c om/svn/tags/3.1.2/build/rollups/tripledes.js"></script>

<script>

var encrypted = CryptoJS.DES.encrypt("Message", "Secret Passphrase")

// ciphertext changed every time you run it

// 加密的结果不应该每次都是一样的吗?

console.log(encrypted.toString(), encrypted.ciphertext.toString(CryptoJS.enc.Base64))

var decrypted = CryptoJS.DES.decrypt(encrypted, "Secret Passphrase")

console.log(decrypted.toString(CryptoJS.enc.Utf8))

</script>

对这些加密算法不了解, 只能求助Google

des encrypion: js encrypted value does not match the java encrypted value

In cryptoJS you have to convert the key to hex and useit as word just like above (otherwise it will be considered as passphrase)

For the key, when you pass a string, it's treated as a passphrase and used to derive an actual key and IV. Or you can pass a WordArray that represents the actual key.

原来是我指定key的方式不对, 直接将字符串做为参数, 想当然的以为这就是key, 其实不然, CryptoJS会根据这个字符串算出真正的key和IV(各种新鲜名词不解释, 问我也没用, 我也不懂 -_-")

那么我们只需要将key和iv对应的字符串转成CryptoJS的WordArray类型, 在DES加密时做为参数传入即可, 这样对Message这个字符串加密, 每次得到的密文都是YOa3le0I+dI=

var keyHex = CryptoJS.enc.Utf8.parse('abcd1234')

var ivHex = CryptoJS.enc.Utf8.parse('inputvec')

var encrypted = CryptoJS.DES.encrypt('Message', keyHex, { iv: ivHex })

这样是不是就万事OK了? 哪有, 谁知道这坑是一个接一个啊.

我们再试试Java这边的DES加密是不是和这个结果一样, 具体实现请参考Simple Java Class to DES Encrypt Strings

果真掉坑里了, Java通过DES加密Message这个字符串得到的结果是8dKft9vkZ4I=和CryptoJS算出来的不一样啊...亲

继续求助Google

C# and Java DES Encryption value are not identical

SunJCE provider uses ECB as the default mode, and PKCS5Padding as the default padding scheme for DES.(JCA Doc)

This means that in the case of the SunJCE provider,

Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding")

and

Cipher c1 = Cipher.getInstance("DES")

are equivalent statements.

原来是CryptoJS进行DES加密时, 默认的模式和padding方式和Java默认的不一样造成的, 必须使用ECB mode和PKCS5Padding, 但是CryptoJS中只有Pkcs7, 不管了, 试试看...

<script src="htt p:/ /crypto-js.googleco de.c om/svn/tags/3.1.2/build/rollups/tripledes.js"></script>

<script src="ht tp:/ /crypto-js.googleco de.c om/svn/tags/3.1.2/build/components/mode-ecb.js"></script>

<script>

var keyHex = CryptoJS.enc.Utf8.parse('abcd1234')

var encrypted = CryptoJS.DES.encrypt('Message', keyHex, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

})

console.log(encrypted.toString(), encrypted.ciphertext.toString(CryptoJS.enc.Base64))

</script>

咦...使用Pkcs7能得到和Java DES一样的结果了, 哇塞...好神奇

那我们试试统一Java也改成Cipher.getInstance("DES/ECB/PKCS7Padding")试试, 结果得到一个大大的错误

Error:java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES/ECB/PKCS7Padding

没办法, 继续Google

java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/ECB/PKCS7PADDING

I will point out that PKCS#5 and PKCS#7 actually specify exactly the same type of padding (they are the same!), but it's called #5 when used in this context. :)

这位大侠给出的解释是: PKCS#5和PKCS#7是一样的padding方式, 对加密算法一知半解, 我也只能暂且认可这个解释了.

忙完了DES的加密, 接下来就是使用CryptoJS来解密了. 我们需要直接解密DES加密后的base64密文字符串. CryptoJS好像没有提供直接解密DES密文字符串的方法啊, 他的整个加密/解密过程都是内部自己在玩, 解密时需要用到加密的结果对象, 这不是坑我吗?

只好研究下CryptoJS DES加密后返回的对象, 发现有一个属性ciphertext, 就是密文的WordArray, 那么解密的时候, 我们是不是只要提供这个就行了呢?

var keyHex = CryptoJS.enc.Utf8.parse('abcd1234')

// direct decrypt ciphertext

var decrypted = CryptoJS.DES.decrypt({

ciphertext: CryptoJS.enc.Base64.parse('8dKft9vkZ4I=')

}, keyHex, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

})

console.log(decrypted.toString(CryptoJS.enc.Utf8))

果不其然, 到此为止, 问题全部解决, 豁然开朗...

完整代码请参考CryptoJS-DES.html

Use CryptoJS encrypt message by DES and direct decrypt ciphertext, compatible with Java Cipher.getInstance("DES")

--注释

--select *|字段名1,字段名2... from 表名

--1)

--查询|检索|获取 所有员工的所有信息

--查询的数据: 员工的所有信息

--数据的来源:员工表  emp

--条件:

select * from emp

--2)

--查询所有的员工名字

select ename from emp

--3)

--查询所有的员工编号和员工名称,员工上级的编号

--查询的数据: empno,ename,mgr

--数据的来源:员工表  emp

select empno,ename,mgr from emp

--4)

--查询所有部门部门编号

select deptno from dept

--5)

--查询出所有员工所在的部门的部门编号

select distinct  deptno from emp

--对查询数据进行去重(非字段去重) distinct

--6)

--查询出所有存在员工的部门的部门编号,以及员工名称

select deptno,ename from emp

select distinct sal,deptno from emp

--7)

--查询表达式,结果是表达式的值,显示的字段名就是表达式,计算值

select 1+1 from emp

select 'a' from emp

--8)

--给字段取别名  select 字段1 (as) 别名1,字段2 别名2 from 表名 别名  表的别名不能加as

--查询所有员工的名称(别名为:名字),员工编号(编号)

--别名默认变大写,别名中的内容原封不动出现 ""->中的内容原封不动出现

select 123+456 "get sum" from emp

select empno as 员工编号,ename "员工 姓名" from emp

--9)

--字符串 ''  原封不动显示""

select distinct '哈哈' 笑 from emp e

--10)

--字符串拼接 java中使用+  这里使用||

--查询 ab--cd  表达式

select distinct 'ab-'||'-cd' from emp

--查询所有的员工名字,给他们来一个前缀SXT

select 'sxt-'||ename from emp

--11)

--伪列 : 不存在的列就是伪列  比如:表达式,字符串

--12)

--虚表: 在oracle中不存在的表,也可以说是这个表中没有任何数据,没有任何字段 --oracle中的虚表:dual

--虚表的作用:可以不使用distinct就可以去重的效果,因为里面没有数据,不会出现多行

select * from dual

select distinct 123*456 from emp

select 123*456 from dual

select sysdate from dual

--比如查询当前时间

--13)

--给每一个员工在原来的基础上+100块钱奖金

--null 空

--null与数字运算,结果还为null

--null与字符串运算,结果原串

--nvl(参数1,参数2) 处理null使用  如果参数1为null,最终结果参数2,如果参数1不为null,最终的结果就是参数1

select comm 原奖金,comm||'100' 新奖金 from emp

select comm 原奖金,nvl(comm,0)+100 新奖金  from emp

--一节结尾小练习

--查询所有员工的名字, 工种, 年薪(不带奖金)

select ename,job,sal*12 年薪 from emp

--查询所有员工的名字,工种,年薪(带12月奖金的)

select ename,job,(sal+nvl(comm,0))*12 年薪 from emp

--查询所有员工的名字, 工种, 年薪(带一次奖金的)

select ename,job,sal*12+nvl(comm,0) 年薪 from emp

--select *|表达式|字符串|伪列|字段1 别名1,字段2 as 别名2... from 表名 别名|结果集 where 行过滤条件

--执行流程: from-->where-->select确定结果集

-- 查询20部门的员工信息

--数据: *

--来源: emp

--条件: deptno=20

select * from emp where deptno=20

-- ><>=  <=  = !=  <>

-- 查询工资大于1000的员工的姓名 工作岗位  工资  所属部门编号

--数据: ename,job,sal,deptno

--来源: emp

--条件: sal>1000

select ename,job,sal,deptno from emp where sal=1000

-- 查询不在20部门工作的员工信息

select * from emp where deptno != 20

select * from emp where deptno <>20

--where 中不能使用字段的别名

-- 查询员工的年薪大于20000的 员工名称、岗位 年薪

select ename 姓名,job 岗位,(sal+nvl(comm,0))*12 sum from emp where ((sal+nvl(comm,0))*12)>20000

select ename 姓名,job 岗位,(sal+nvl(comm,0))*12 sum from emp

select 岗位, sum

  from (select ename 姓名, job 岗位, (sal + nvl(comm, 0)) * 12 sum from emp)

where sum >20000

-- 查询  any(任意一个)  some(任意一个)  all(所有)

select * from emp where deptno = any(10,20)

select * from emp where deptno = some(10,20)

--大于最小的

select * from emp where sal>any(1500,2000)--薪资>1500的就可以

--大于最大的

select * from emp where sal>all(1500,2000)--薪资>2000的就可以

-- 查询 工种不为’SALESMAN’的员工信息 (注意 内容区分大小写)

select * from emp where not job ='SALESMAN'

--or或 and并且|都  not取反

-- -检索 工资 1600, 3000员工名称 岗位 工资

select ename,job,sal from emp where sal=1600 or sal=3000

select ename,job,sal from emp where not (sal=1600 or sal=3000)

-- 工资在2000到3000之间的员工信息

select * from emp where sal>2000 and sal<3000

--between 小范围值  and 大范围的值  两者之间  <= >=

select * from emp where sal between 1600 and 3000

---查询 岗位 为 CLERK 且部门编号为 20的员工名称 部门编号,工资

select ename ,deptno ,sal from emp where job='CLERK' and deptno=20

-- 查询 岗位 为 CLERK 或部门编号为 20的员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job='CLERK' or deptno=20

--查询 岗位 不是 CLERK 员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job!='CLERK'

select ename ,deptno ,sal,job from emp where not job='CLERK'

select ename ,deptno ,sal,job from emp where job<>'CLERK'

-- 查询 岗位 不为 CLERK 并且部门编号不为 20的员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job!='CLERK' and deptno!=20

select ename ,deptno ,sal,job from emp where not (job='CLERK' or deptno=20)

--存在佣奖金的员工名称

select ename,comm from emp where not comm is null

select ename,comm from emp where comm is not null

--不存在奖金的员工名称

select ename,comm from emp where comm is null

--集合

--Union,并集(去重) 对两个结果集进行并集 *** 作,不包括重复行同时进行默认规则的排序;

--Union All,全集(不去重) 对两个结果集进行并集 *** 作,包括重复行,不进行排序 ;

--Intersect,交集(找出重复) 对两个结果集进行交集 *** 作,不包括重复行,同时进行默认规则的排序;

--Minus,差集( 减去重复 ) 对两个结果集进行差 *** 作,不包括重复行,同时进行默认规则的排序

--查询工资大于1500 或 含有佣金的人员姓名

select ename,sal,comm from emp where sal>1500 or comm is not null

select ename,sal,comm from emp where sal>1500

select ename,sal,comm from emp where comm is not null

--并集

select ename,sal,comm from emp where sal>1500

Union

select ename,sal,comm from emp where comm is not null

select ename,sal,comm from emp where sal>1500

Union all

select ename,sal,comm from emp where comm is not null

--查询显示不存在雇员的所有部门号。

--求出所有的部门号

select deptno from dept

--有员工的部门号

select distinct deptno from emp

select deptno from dept

Minus

select distinct deptno from emp

-- 查询显示存在雇员的所有部门号。

select deptno from dept

Intersect

select distinct deptno from emp

--模糊匹配  like %任意任意字符  _一个任意字符  一起使用

--查询员工姓名中包含字符A的员工信息

select * from emp where ename like '%A%'

--完全匹配

select * from emp where ename like 'SMITH'

--查询员工姓名以'A'结尾的员工信息

select * from emp where ename like 'A%'

--查询员工姓名中第二个字母为A的员工信息

select * from emp where ename like '_A%'

insert into emp(empno,ename,sal) values(1000,'t_%test',8989)

insert into emp(empno,ename,sal) values(1200,'t_tes%t',8000)

--escape('单个字符')指定转义符

--查询员工姓名中包含字符%的员工信息

select * from emp where ename like '%B%%' escape('B')

--当执行插入数据,删除数据,修改的时候,默认开启事务

--可提交  commit 

--可回滚  rollback

--多个人中任意一个值就可以

select * from emp where sal=1600 or sal=3000 or sal=1500

select * from emp where sal in(1500,1600,3000)

--select 字段.. from 结果集 where 行过滤条件 order by 排序字段 desc降序|asc升序(默认)..

--执行流程: from-->where-->select-->排序

select empno,ename,sal from emp order by sal desc,empno asc

--按照奖金升序排序,如果存在null值,所有的奖金null值的数据最先显示

select empno,ename,sal,comm from emp where deptno in (10,30) order by comm asc nulls first


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10075775.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存