文档章节

【SQL】- 高级用法

ZeroneLove
 ZeroneLove
发布于 02/23 12:38
字数 1341
阅读 17
收藏 0

数值和字符范围比较: between

select *from books where price>=23.5 and price<=35; 

-- 等价于
select *from books where price between 23.5 and 35; 
-- between包含边界的比较>= / <=:注意小的值在前面

-- 字符比较
select *from books where bookName between '水浒传' and '西游记'; 

模糊查询:% 通配符

  • _ 下划线:单个字符 [charlist]
  • 排除单个字符: [^charlist] / [!charlist]

注意: like 模糊查询时如开头出现 % 形式,部分数据库可能不会走索引查询,降低查询效率,因此尽量开头使用确定的部分数值

-- 价格以2开头的记录
select *from books where price like '2%';

-- 价格以5结尾的记录
select *from books where price like '%5';

-- 价格包含2的记录
select *from books where price like '%2%'; 

--  价格为23.5记录,等价于 price = 23.5
select *from books where price like '23.5';

-- sql的通配符的使用
>select *from books where price like '2_.5';
select *from books where price like '2%5';
select *from books where price like '[23]%';
select *from books where price like '[^23]%';

修改数据表字段

-- 添加aspect字段:格式:alter table 表名add 字段名 字段类型
alter table books add aspect varchar(10); 

-- aspect 字段在prize字段后(调整表字段顺序,默认加在最后)
alter table books add aspect varchar(10) after prize; 

-- 删除aspect字段:格式:alter table 表名 drop 字段名
alter table books drop column aspect; 

 -- 修改字段类型:modify
alter table books modify  column aspect int;

-- 修改字段名和字段类型:change
alter table books change column aspect newAspect int; 

-- 修改表名
alter table book rename books;  

查询完全不同的数据记录

-- bookName唯一记录:会降低查询速度:不走索引
select distinct(bookName) from books;

约束处理

-- 添加unique约束
alter table books add unique key(id);

-- 添加主键约束
alter table books add constraint PK_books primary key books(id); 

-- 添加外键:级联更新、级联删除
alter table books add constraint FR_books_vendors foreign key (vendorId) references vendors(id) on delete cascade on update cascade;

-- 删除主键约束
alter table books drop primary key;

-- 删除外键:指明外键约束名:可能存在多个外键
alter table books drop foreign key FR_books_vendors; 

多表查询

-- 查询书籍信息及出版商信息
select *from books,vendors where books.vendorId=vendors.id;  

-- 等价于内连接:inner join:两个表都匹配才返回:join(缺省写法)
select *from books inner join vendors on books.vendorId=vendors.id; 

-- 左外连接left join:左表数据完全输出,右表如匹配则输出,无匹配则输出NULL
select *from books left join vendors on books.vendorId=vendors.id;

-- 右外连接 right join:右表数据完全输出,左表如果匹配则输出,无匹配则输出null
select *from books right join vendors on books.vendorId=vendors.id;

-- mysql不支持全链接:full join:只要两个表存在数据就显示输出,没有匹配就使用null值填充输出:可通过左连接和右链接,用union聚合实现效果
select *from books full join vendors on books.vendorId=vendors.id;

结果聚合union:需确保聚合的子结果集结构和类型(或可转换)一致

-- union: 聚合结构并去重
select *from books join vendors on books.vendorId=vendors.id where books.id=1
union
select *from books join vendors on books.vendorId=vendors.id where books.id=2;

-- union: 聚合结构不去重,效率更高
select *from books join vendors on books.vendorId=vendors.id where books.id=1
union all
select *from books join vendors on books.vendorId=vendors.id where books.id=2;

表复制

  • select into : 从其他表查询数据插入到另外1张表里面:一般用来生成测试数据(指数增长)或者备份数据
-- 格式:slect 字段名 into 新表名 from 原始数据表: mysql不支持
select id,name,tele,manager into vendorBak from vendors; 

-- mysql替代做法:表内自复制
insert into vendors(name,tele,manager) select name,tele,manager from vendors; 

-- mysql新表备份原始表数据
create table vendorsBak(select *from vendors); 

exist 用法

-- 查找公司工资高于1500的同事
select * from employee where deptid not in(select deptid from employee where salary < 1500)

-- sql优化:not in不经过索引, not exists 使用索引,提高效率, 相当于拿主表数据一条一条匹配exist条件
select * from employee as emp where not exists(select 1 from employee where salary < 1500 and emp.deptid = deptid);
select * from employee as emp where exists(select 1 from employee where salary > 1500 and emp.deptid = deptid);

IFNULL函数: 如果字段为null值则返回设定的默认值

select bookName,author,price,IFNULL(vendorId,0) from books;
select *from books where vendorId is not null;
select *from books where vendorId is null;

行传列:group_concat

-- 分别统计性别男、女的学生名
select stuGender, group_concat(stuName,",") from student group by stuGender

创建视图:从sql语句语义可看出来视图本质就是特定sql语句查询结果的映射(别名),方便直接使用过滤之后的数据

-- 创建视图
create or replace view booksView as select *from books where vendorId is not null;

 -- 如果存在则删除视图,避免删除不存在的试图导致异常
drop view if exists booksView; 

-- 注意:
视图中关联的数据表如果数据发生改变,视图的筛选出来的数据也会在满足条件的基础上同步更新数据

数据去重

-- 注意去重的表必须存在唯一约束的字段,否则无法去重
delete from employee where id not in(select *from (select min(id) from employee group by name) emp)

-- sql优化
delete from employee where
not exists(select * from (select min(id) as id from employee group by name) em where em.id=employee.id);

BLOB类型数据插入

insert into test values (UNHEX(HEX('Hello Python World!')));

© 著作权归作者所有

共有 人打赏支持
ZeroneLove
粉丝 3
博文 156
码字总数 124333
作品 0
深圳
高级程序员
私信 提问
【SQL】结构化查询语言--数据库语言全解析【系列2】

前言:连载系列; 【SQL】结构化查询语言--数据库语言全解析【系列1】 【SQL】结构化查询语言--数据库语言全解析【系列2】 【SQL】结构化查询语言--数据库语言全解析【系列3】 一、数据操作语...

散人lins
2018/07/15
0
0
【SQL】"IS NULL" and "= NULL" 在 sql server 中的区别

当我们在 sql server 中用 DECLARE 申明一个变量时, sql server 将会把变量存储在SQLs 内存空间的变量列表区域(variable table),变量列表中包含了变量的名称和存储地址。然而如果我们在创...

Sandy_wu
2013/08/09
0
0
我是电音之王!FLStudio学习路线图

初步认识水果音乐软件 初步认识水果音乐 终结篇 水果音乐的安装 基本面板的认识与控制 编辑菜单基本操作的认识 通道菜单的认识及基本操作 view浏览器的基本操作 控制面板的基本操作 option菜...

棋帅小七
2017/12/01
0
0
scala字符串插入

scala的字符串插入,与java语言的有类似之处,都是最终用字符串变量去替代字符串中的。Scala中主要有,,三种字符串插值用法,另外还有一些高级用法,本文主要参考官网字符串插入。 s用法 f用法...

high_m
2017/11/05
0
0
『SQL』GROUP BY语句梳理

GROUP BY是SQL中用来进行数据分组的语句,这个语句使用时稍有不慎就会报错。 GROUP BY 作用 GROUP BY语句是将查询到的数据进行分组,分成各个区域,再对每个区域的数据进行处理。 使用 比如有...

dejunz
2017/08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如果让你写一个消息队列,该如何进行架构设计?

面试题 如果让你写一个消息队列,该如何进行架构设计?说一下你的思路。 面试官心理分析 其实聊到这个问题,一般面试官要考察两块: 你有没有对某一个消息队列做过较为深入的原理的了解,或者...

李红欧巴
今天
4
0
错题

无知的小狼
今天
2
0
PowerShell因为在此系统中禁止执行脚本的解决方法

参考:window系统包管理工具--chocolatey 报错提示: & : 无法加载文件 C:\Users\liuzidong\AppData\Local\Temp\chocolatey\chocInstall\tools\chocolateyInstall.ps1,因为在此系统上禁止运...

近在咫尺远在天涯
今天
3
0
TP5 跨域请求处理

https://blog.csdn.net/a593706205/article/details/81774987 https://blog.csdn.net/wyk9916/article/details/82315700...

15834278076
今天
3
0
深入理解java虚拟机-Java内存区域与内存溢出异常

深入理解java虚拟机 Java内存区域与内存溢出异常 运行时数据区域 程序计数器 线程私有,内存小,是当前线程执行的字节码行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行...

须臾之余
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部