收藏文章 楼主

mysql高级语句,增删改查

版块:mysql 数据库通用基础大全   类型:精华/置顶   作者:小绿叶技术博客   查看:3594   回复:1   获赞:1   时间:2019-08-19 15:21:49

基础-查询-修改-对表链接


对列的内容进行排序

select top 1000 * from Chay_Temp A

where A.field03 between '2019-05-27' and '2019-05-28'

order by convert(int,field02) desc

 

--top1000* 显示这个表的所有内容后筛选前1000行,A是表别名,方便选择字段

--between and 和(and)什么之间(between [bɪˈtwiːn] 之间)

--order by [ˈɔːdə(r)] ......排序

--convert(int,field02)将字符串转为( convert [kənˈːt ] 转换)int类型进行倒序(大到小)排序

--desc 倒序;asc 正序se

--order by A.field03 desc 将时间列进行倒序排列




SELECT name,zong,guocheng FROM jisuan ORDER BY CONVERT(zong,SIGNED) DESC limit 50


找不重复的数据

select distinct field05 from Chay_Temp

--distinct [dɪˈstɪŋkt] 不同的

 



表达式,条件语句与运算

条件匹配查询

select top 10 *  from Chay_Temp A

where A.field01='贴合'

--选择所有内容后显示顶部10行内容,并定义表别名为A,

--where 在哪里,条件匹配A.field01='贴合' 字段的内容


列的数据:减,除,乘,加

select top 10

A.Qty,A.OriginalQty,

(A.Qty-A.OriginalQty) www

from Lot A

 

--选择顶部10行

--在表别名A的两个字段

--将两个字段进行减法运算,并新建一个www的列

--从lot表里面,并建立表别名A

 

--除法运算将符号 - 更改为 /

--乘法运算将符号 - 更改为 *   

--将某个字段的数据下调10%(1为100%,0.1为10%,* 乘以结果为0.9,第三行改为):Qty * (1-0.1) www

--乘法运算将符号 - 更改为 +

 

--将某个字段加上指定数值(第三行代码更改为):(Qty+123) www

 

 

--逻辑运算

计算假期

--create table eisc(name varchar(20),td int,years int,leavet int)

--insert into eisc (name,td,years,leavet) values('aaaa','101','2','4'),

--创建表并赋值

 

select name,(years * 12)-leavet www

from eisc

where name like 'a%'

and (years *12)-leavet>50

 

--选择name,years(工作了两年)* 12(每年12天假期)减去剩余休假时间,新建一个www列(已休息时间)

--从eisc表里

--在name字段里像a的名字的

--休假时间超过50天的,and(和)当两个表达式为真的时候才会返回为真

 

在公司不超过5年和剩余休假时间超过10天的的员工名字

select name from eisc

where years <=5

and leavet>10

--选择name字段,从eisc表中找

--在years字段(工作年数)里面找<=5 years

--和leavet(剩余休假) >10天的

 

在公司工作5年以上休假时间不足已有假期50%的员工

select name www

from eisc

where years >=5

and ((years * 12) - leavet)/(years * 12) < 0.5

--选择name字段,并新建一个www列名

--where 在years 找大于5年的

--和 (总休假时间-剩余休假时间)/(总休假时间) < 百分之50的


--将and (交集合)换成 or (并集合)变成,OR:满足其中一个条件就输出结果(前面条件范围加上后面条件范围)



--第四天 函数 对数据的进一步处理

统计函数 SUM AVG MAX MIN 命令

select sum(td) www from eisc 

--sum求和td字段的数字(数据),输出到新建的一个字段www

--avg(td) 求td的平均值

--max(td)求td列最大值

--min(td)求td列最小值


-----------------日期时间函数---------------

select  GETDATE()+60

--将当前时间增加60天


---------------数学函数-------------------

select abs(td) www from eisc

--abs(td) 将td列中的数值加绝对值,并输出到新增列www

--ceil(td) 将列中的数值取整数

--sqrt(td) 平凡根


函数计算 COS COSH SIN SINH TAN TANH

--将其转换成弧度(转换成数学三角函数)来计算: cos(A.Qty*0.01745)

select top 10 A.Qty,

cos(A.Qty)

from Lot A

--求Qty列中所有数字的cos值

--从lot表中,并建立表别名A


--exp(A.qty) 以 e 为底的幂值


字符函数

select top 10 

concat(A.Qty,A.OriginalQty) "串接字段内容"

from Lot A


--将int类型转换成字符串类型进行合并

--转换成字符串案例 select 1+2  或  select concat(1,2)

--使用concat() 将两个字段串接起来

-- P 83


LTRIM RTRIM replace  裁剪,删除,指定字符替换 translate 匹配对应字符替换

select top 10 

A.field01,rtrim(field03)

from  Chay_Temp A

-- 使用rtrim() 删除列中字符串右边的空格

-- 使用 LTRIM (A.field05, 'S') 删除列中指定字符S

-- A.field01,replace(A.field05, 'SU','qq') ;使用replace(),替换列中的字符,括号里面第一个参数是列,第二个是匹配的字符,第三个是需要替换后的字符

-- A.field01,translate(A.field04, 'LOT','ABC');使用 translate() 匹配对应字符替换,括号里面第一个是列,第二个是列中的字符,第三个是将列中字符一一对应替换成ABC的字符:L换成A,O换成B,T换成C; translate变换


select user from eisc

-- 使用user查询当前数据库下用户名称,eisc为表,任意存在的表




--第五天 SQL 中的子句


group by [ɡruːp baɪ] 分组查询

order by [ˈɔːdə(r) baɪ] 排序依据

union all [ˈjuːniən ɔːl] 进行合并

intersect [ˌɪntəˈsekt] 相交

minus  [ˈmaɪnəs] 减去

查找列里像什么字符的字段

select top 10 

A.field01

from Chay_Temp A

where A.field01 like ('贴%')


--在A.filed01列找像 贴 的字符


order by 排序

select  top 90000 *

from Chay_Temp A

order by A.field02 asc


-- 默认 asc 升序排列,倒序排列:desc


group by 分组子句,同名称为一组

select 

name,

sum (td),

count (name)

from eisc

group by name


-- 选择 name,

-- td 列数据的总和

-- count() 统计选中列有几行数据 

-- group by name 将name中相同的名字进行分组(以什么列中像似名字进行分组)


-- 当前是交集合语句:求name中每组数据的和,并且显示组内行数(相同的有几个名字)



分组后,显示每组的最大值

select 

name,

max(td),min(td)

from eisc

group by name


-- 选出最大和最小的

-- group by name 将同名分组


-- 也可以平均值 avg 等等

HAVING 子句

select name,

avg(td)

from eisc

group by name

having avg(td)<130


-- 选择name , 求 td 列的平均数,在eisc表里

-- group by 在 name 列里找相同名字作为一组,进行分组

-- having avg(td)<130 使用having 子句进行增加条件语句


-- 以 name 分组显示:组平均值小于130的数据

-- having avg(td)<130 and avg(years)<10 表示子句增加条件,td<130 且 years<10 的条件(需要在第二行代码后添加 avg(years) )



--第六天 表的联合 

p 120

模糊联合

select top 10 * from eisc,Chay_Temp

-- 用逗号直接联合两张表


列求和后联合成新表 

select sum(eisc.td * www.qc) wwweisc from www,eisc

where www.name='ede' and eisc.name='bbb'

-- sum()求和两个表里面两列中的两个数字,由where来选定,并新建一个wwweisc的列,从www和eisc的两个表里去找

-- 在,www 中的 name列中名为 ede 对应的 qc 数值(与第一行代码 SUM 联系)

-- 和,在eisc表那么列中的名为 ede 对应 qc 的数值 和 eisc 表中 name 列中名为 bbb 名字对应的 td 数值

两张表合并成一张大表,需要两表列和列里的名字相同

select www.id,www.name,www.qb,www.qc * eisc.td www

from www,eisc

where www.name = eisc.name


-- 选择要显示的列,两表中的两个字段分别相乘后输出到www新列

-- 两表中两列的字段name 想等,进行合并


select * 

from www,eisc

where www.name=eisc.name

-- 不加任何计算的两表合并成一张大表

-- 以name相同的来对应排序


表的联接:左右联接,全联接表

select * from www left join eisc on www.td = eisc.td

-- left join [left dʒɔɪn] 左联接

-- 使用 left join on 函数进行左联接,

-- 显示左表全部行在输出结果的左边,右边:右表与左表相同的才显示数据,否则显示 NULL 为空


-- right join [raɪt dʒɔɪn] 右联接

-- 使用 right join on 函数进行表的右联接

-- 显示右表的所有行在输出结果的右边显示,左边表与右表没有匹配(相同)的为 NULL 空,在输出结果的左边显示



-- full join  [fʊl dʒɔɪn] 完全联接

-- 使用 full join on 函数进行表的全联接

-- 返回左右表的所有行,若左右表没有匹配(相同)部分则显示为 NULL 空


------------交叉联接表-------------


select * from www cross join eisc 

where www.name = eisc.name


--  cross join  [krɒs dʒɔɪn] 交叉联接

-- 只能用 where 不能用 on



-- 第七天 子查询 内嵌的 SQL 子句

建立一个子查询

select * from www where name = 

(select name from eisc where qc like '1324%')


-- 两个表共有的字段是 name ,子句需要以 name 为选择 name,第一行是主句(www表),但想用另一个表中的字段来匹配

-- 用等号括号来写出子句,属于精准查找(子句表中匹配的字段只有一个数据才能匹配)


select *

from www,eisc 

where www.name=eisc.name

and www.name =

(select name from eisc

where td like '111%'

)


-- 先将表进行联合,以两表name相同字段进行合并

-- 联合后,加 and 子句 进行条件进一步赛选

-- www.name www表中的name参数由 

-- eisc 表里面 找 td 列 像111字段

-- 对应的 name 参数的那一行数据



两表关联查询

use OrBitLCE_Report // 进入数据库

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

SELECT*FROM dbo.ProductRoot where  ProductName='03-1-022-1520725'

select FirstSN,SecondSN from  SNRelationShip  where ProductId='PRD10002HN28'

and CreateDate between '2019-5-1' and '2019-6-1'

and 

SecondSN != ''

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

select top 10 * from ProductRoot

where ProductName='03-1-022-1520725'

-- 已知条件 03-1-022-1520725


select b.FirstSN,b.SecondSN 

from  ProductRoot a, SNRelationShip b  

where a.ProductName='03-1-022-1520725' 

and b.ProductId=a.DefaultProductId 

and IsCancel=0

and b.CreateDate between '2019-5-1' and '2019-6-1'

and SecondSN != ''

-- 先在a表里面查一下记录编码是哪个列,ProductRoot是管理编码的列

-- 选择b表的两个字段,这是我们要的输出结果

-- 从这两个表里,并建立别名,a表 和 b表

-- 两表关联的两个列(相同的数据进行关联),在a表中的 ProductName 字段里面找编对应一行中的 参数

-- 指定排序,初始为0开始

-- 将a表中的 ProductName 匹配字段结果中 对应的ProductRootid列中的参数,传给b表ProductId列进行下一步匹配

-- between and 在什么之间函数,

-- 字段不等于空字符



------------------- 相关子查询 ----------------------

select www.name,

sum(www.td * eisc.td),

count(www.name)

from www,eisc

where www.name=eisc.name

group by www.name

-- 选择www表中的name运用到第六行代码 group by (分组依据)函数进行分组,

-- 求和两表中选中两列的乘积,

-- 计算组数(www表中相同名字(name)为一组,组内的个数)

-- 从两个表中

-- 两表合并关系:两表中 name 列相同

-- group by 分组依据,结构:开头(第一行)和结尾(group by结尾)

having sum(www.td * eisc.td) > 

(select avg (www.td*eisc.td)

from www,eisc

where www.name=eisc.name

and www.td=eisc.td

)

-- 在上段结果(有三个数据)(联合后的表中)中显示出:求和的列数值大于平均值列的行 

-- 在两表中以name相同进行联合

-- 且两表td列的同等字段(相同的数据所对应的行)(结果两个数据,被条件进一步赛选)



-------------------- exists any all 的使用------------------------


select name, td from www 

where exists  

(select * from eisc where qc='1324')


-- exists 非空返回 TRUE (显示全部)

-- 与联合两表子查询类似,参照:建立一个子查询(当前小节第一个)


select name, td from www 

where  name=

any (select name from eisc where name='aaa' )


-- 可以将 any 换成 some

-- 与上一条类似:两表关联子查询




-- 第八天 操作数据


----------- 插入数据 -----------

insert 

提供企业建站服务,免费网防系统,提交信息登录 http://yundun.ddoss.cn 邮箱: proposal@ddoss.cn 
回复列表
默认   热门   正序   倒序

回复:mysql高级语句,增删改查

头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息