SQL基础操作
Posted 付出才有回报,敢于尝试才能成功。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL基础操作相关的知识,希望对你有一定的参考价值。
AND与or的区别
AND :可以将N多的条件下使用AND运算符。采取动作的SQL语句,无论是事务或查询,所有分离的条件,必须为True
or:可以将N多的条件下使用OR运算符。SQL语句将要采取的动作,无论是一个事务或查询,任何一个OR必须为TRUE分离的条件
--通配符
_ 匹配单个
%多字符匹配
--空值检测
查询时如果需要查某字段为空的需要使用 is null,不能使用=null
is null或者is not null
--反义运算符
反义运算符(!= !< !>)建立在同义运算符对面(= < >)
不等于<>
不大于<=
不小于>=
--多值检测
要获取23,25,28岁员工信息
select * from tableA where age=23 or age=25 or age=28或者
使用in关键字
select * from tableA where age in(23,25,28)
in在不间断的值时使用更好如果是连续的值可以使用范围查询条件
select * from tableA where age>23 and age <28 或者
使用between and获得范围这在sql2008后才有
select * from tableA where age between 23 and 28
--查询工资小于5000,年龄在25到28之间的
select * from T_Employee
where FSalary<5000
and Fage BETWEEN 25 AND 28
--分组
group by
需要分组的所有列都必须位于group by子句的列表中,不在子句的列是不能放在select语句后的列名列表中的
采用分组的查询结果集时分组形势的,所以不表示分散的其它数据,想展示其它数据需要使用聚合函数
--各个年龄段的人数
select Fage,count(*) as 数量 from T_Employee group by Fage
Having 子句
用于过滤分组后条件
--检查人数大于1的年龄段
select fage,count(*) as 数量 from T_employee group by fage having count(*)>1
注意:
having后如果使用count(*)不会有问题,但如果使用别名去查询会出现列名无效提示因为还没有被编译,此时可以使用子查询
--限制结果集行数
Row_number()
select row_number(order by FSalary) ,*from T_Employee
--抑制数据重复
DISTINCT
--字符串拼接
ms sqlserver中使用+号拼接
length计算字段长度
--联合结果集
原则:每个结果集必须有相同的猎术,②每个结果集的列必须类型相容
union
--函数
abs()绝对值,power()求指数,sqrt()平方根,rand()随机数,Ceiling()向上取整,Floor()向下取整,round()四舍五入
getDate()获取当前时间
--索引
create INDEX 索引名 ON 表名(字段1,字段3,字段2)--创建,索引名保持唯一性
DROP INDEX 索引名 ON 表名 --删除索引
--约束
非空约束NOT NULL,唯一约束 UNIQUE,
CHECK约束:检查插入数据是否满足条件
主键约束,外键约束
--表连接
内连接inner join 将几张表等值连接
select FNumber,FPrice from T_Order inner join T_Customer on FCustomerId=T_Customer.FId
where T_Customer.FName=‘TOM‘
不等值连接 在on子句后使用不等于、大于、小于等
交叉连接 没有on子句
select ... from 表名 cross join 表名
左链接left join
左表中所有的记录都会被防盗结果集中,无论是否在右表中存在匹配记录
--查询每张订单的单号、价格、对应客户的名称及年龄
select o.FNumber,o.FPrice,o.FCustomerId,c.FName,c.FAge from T_order o
left join T_Customer c
on o.FCustomerId=c.FID
右连接 right join
与左连接相反
--子查询
where语句中的标量子查询
select * from T_ReaderFavorite
where FCategoryId=(
select FID from T_Category where FName=‘story‘
)
in运算符与子查询
--查询出所有年份的读者信息
select * from T_Reader where FYearOfjoin in(
select FYearPublished from T_Book
)
any运算符与子查询
=Any等价于in运算符
<>ANY等价于not in运算符
EXISTS运算符:它不予列匹配,用来检查每一行是否匹配子查询,可以认为Exists就是用来匹配子查询结果是否为空的
Insert into. 目标表..SELECT * from 要查的表--将数据从一张表导入另外一张表
--索引
聚簇索引:索引顺序与数据表的物理顺序相同,eg字典的拼音顺序
非聚簇索引:索引孙旭与数据表的物理顺序不同,eg字典的偏旁
索引的存储是占用资源的所以创建索引也要有限度,且索引采用B树结构存储,在增删改时会产生大量存储碎片
增加字段: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数
删除字段: alter table [表名] drop 字段名
修改变长文本型字段的大小:alter table [表名] alter 字段名 varchar(N)
删除表: drop table [表名]
Insert创建表
create table #famousjaycess2 ( jc varchar (15) DEFAULT ‘‘, occupation varchar (25) DEFAULT ‘ROCK STAT‘, becamefamous int default 0 , notes text null ) GO
根据下表,编写sql语句;表A、表B的UserName进行关联找出表A有表B没有的记录,只能用一个select
假定通过id字段关联 如果查询结果要显示userName那么on时就要关联UserName
1)
select * from A where id not in (select id from B)
2)
select A.* from A LEFT JOIN B ON A.id = B.ID WHERE B.ID IS NULL
以上是关于SQL基础操作的主要内容,如果未能解决你的问题,请参考以下文章
spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference '*' is ambiguous)(代码片段