mysql sql高级应用程序_mysql-sql高级应用
sql语言进阶
典型操作order by
- select * from play_list order bycreatetime;- select * from play_list order by bookedcount desc,createtime asc;order by语句用于根据指定的列对结果集进行排序order by语句默认按照升序对记录排序,使用desc则降序排序order by也可以多个字段排序,而desc只作用于一个字段;distinct
select distinct userid fromplay_list;select distinct userid,play_name fromplay_list;
(userid,play_named都相同时去重)distinct用于去重,可以返回多列的唯一组合;distinct在后台做排序,所以很消耗CUP的;group by having场景:统计云音乐创建歌单的用户列表和每人创建歌单的数量
mysql> select userid,count(*) AS play_num from play_list group by userid having count(*)>=2;
分组关键字userid,需要在查询中出现,且一般查询分组关键字后要加聚合函数;like
select * from play_list where play_name like ‘%男孩%‘;
通配符
描述%代替一个或多个字符
_
替代单个字符[charlist]中括号中的任何单一字符[^charlist]或者[!charlist]不在中括号中的任何单一字符
大表慎用like;
除了%号在最右边以外,会对表中所有记录进行查询匹配;
limit offset
场景4:查询一个月内创建的歌单(从第6行开始显示10条记录)select * from play_list where (createtime between 1427701323 and 1430383307) limit 10 offset 6注意:offset 后面的值不要太大,假设offset1000,那它会扫描前1000条记录,这样IO开销会很大case when
case when 实现类似编程语言的 if else功能,可以对SQL的输出结果进行选择判断;
场景5:对于未录入的歌单(trackcount= null),输出结果时歌曲数返回0
mysql> select play_name,case when trackcount is null then 0 else trackcount end fromplay_list;
连接-join用一个SQL 语句把多个表中相互关联的数据查询出来;
场景6:查询收藏“老男孩”歌单的用户列表
mysql> SELECT play_fav.userid FROM play_fav INNER JOIN play_list ON play_fav.play_id = play_list.id where play_list.play_name = ‘老男孩‘;
另一种写法:
mysql> select f.userid from play_list lst,play_fav f where lst.id = f.play_id and lst.play_name = ‘老男孩‘子查询及问题
子查询的写法:select userid from play_fav where play_id=(select id from play_list where play_name = ‘老男孩‘);
别名 可以不用使用AS 关键字,直接空格加别名就可以了;
子查询在性能上有一定劣势,不利于mysql性能优化器进行优化;
因为内层表和驱动表用户自己定死了,而联结的驱动表和内层表 性能优化器 会根据实际情况 来定;
子查询为什么不利于优化:
联结是嵌套循环查询实现;
如select* from play_list,play_fav where play_list.id =play_fav.play_id;
play_list驱动表(where等号左边);内层表play_fav(where等号右边);
遍历去东北play_list.id,找到一个id后再去play_fav.play_id中找;依次循环下去;
内层表此时可以查询一次或者几次索引,便可以得到;
所以基本的优化就是将表量比较小的作为驱动表,这样减少了循环的次数;union作用:把不同表中相同的字段聚合在一个结果集中返回给用户
场景8:老板想看创建和收藏歌单的所有用户,查询play_list和play_fav两表中所有的userid;
mysql> select userid fromplay_list-> union
-> select userid fromplay_fav;
默认的union 会对结果集进行去重处理,不想去重使用union all;
DML进阶语法
多值插入:insert into table values(.....),(.....)
覆盖插入:replace into table values(...)
忽略插入:insert ignore into table values(...)
查询插入:insert into table_a select * fromtable_b
多值插入:减少数据库访问次数,提高效率;
覆盖插入,忽略插入:简化业务逻辑的判断;避免主键重复;
查询插入:导表结构中;
insert主键重复则update:insert into table tb1 values(id,col1,col2)on duplicate key update col2=....;
mysql> insert into a values(1,100) on duplicate key update age=100;
如果id=1存在,则键age 更改为100;
注意得是主键噢,如何表中没有设置主键,则会新增加一条记录;
而给表a增加主键则是:
mysql> alter table order add primary key(id);
连表update
用B表中的age 更新到 A 表中的age :
复制代码
mysql> select * froma;+----+------+
| id | age |
+----+------+
| 1 | 100 |
| 2 | 34 |
| 3 | 23 |
| 4 | 29 |
+----+------+
mysql> select * fromb;+------+------+------+
| id | name | age |
+------+------+------+
| 1 | pw | 20 |
| 2 | ljb | 30 |
+------+------+------+
mysql> update a,b set a.age=b.age where a.id =b.id;
mysql> select * froma;+----+------+
| id | age |
+----+------+
| 1 | 20 |
| 2 | 30 |
| 3 | 23 |
| 4 | 29 |
+----+------+
复制代码
连表delete
用B表中的条件去删除A表中数据;
复制代码
mysql> select * froma;+----+------+
| id | age |
+----+------+
| 1 | 20 |
| 2 | 30 |
| 3 | 23 |
| 4 | 29 |
+----+------+
mysql> select * fromb;+------+------+------+
| id | name | age |
+------+------+------+
| 1 | pw | 20 |
| 2 | ljb | 30 |
+------+------+------+
mysql> delete a from a,b where a.id=b.id and b.name=‘pw‘;
mysql> select * froma;+----+------+
| id | age |
+----+------+
| 2 | 30 |
| 3 | 23 |
| 4 | 29 |
+----+------+
复制代码
删除语法:DELETE FROMCustomersWHERE cust_id = ‘1000000006‘;
连表在delete之后还要将需要删除的表放在delete后面;
内置函数
目标:掌握常用的mysql聚合函数,预定义函数
在SQL查询语句中运用上述函数结构groupby,orderby等语法完成各种统计功能
聚合函数
聚合函数面向一组数据,对数据进行聚合运算后返回单一的值
mysql聚合函数基本语法:select function(列) from表
常用聚合函数:
场景:查询播放次数最多的歌曲
复制代码
mysql> select song_name,max(playcount) from song_list; //错误查法
#selectsong_name,没有对应 playcount;
#注意聚合函数是对返回列来做处理的,此中放回列是所有歌曲;
mysql> select song_name,playcount from song_list order by playcount desc limit1;//正确
子查询方法:select song_name from song_list where playcount=(select max(playcount) fromsong_list);
复制代码
场景:显示每张专辑的歌曲列表。例如:
复制代码
mysql> select album,group_concat(song_name) from song_list group byalbum;+------------------+-------------------------------------------------+
| album | group_concat(song_name) |
+------------------+-------------------------------------------------+
| 1701 | 大象,定西 |
| Straight Shooter | Good Lovin‘Gone Bad,Weep No More,Shooting Star |
| 作品李宗盛 | 风柜来的人 |
| 红雪莲 | 红雪莲 |
+------------------+-------------------------------------------------+
复制代码
group_concat 连接的最长字符是1024,可以通过参数调整;
使用聚合函数做数据库行列转换:
预定义函数:
预定义函数面向单一值数据,返回一对一的处理结果(聚合函数可以理解成多对一)
预定义函数基本语法:select function(列) from 表;select * from 表 where 列 = function(value)
时间处理函数:
总结
order by
distinct
limit offset:
case when then else end
连接-join两种写法
子查询为什么不利于优化:优化器不能改变,驱动表,内层表;从而不能优化;驱动表一般表量较小,因其需要全表id;内层表,仅需要查找一个或几个索引;这就是jion后优化器工作
union:把不同表中相同字段聚合在一个结果集中
连表update,根据B表age值更新A表age:update a,b set a.age=b.age where a.id = b.id;
连表delete,根据B表name删除A表的数据:delete a from a,b where a.id=b.id and b.name=‘pw‘;
聚合函数:AVG(),COUNT(),COUNT(DISTNCT),MAX(),MIN(),SUM()常与 group by,order by连用;
group_concat()mysql特有
预定义函数
mysql sql高级应用程序_mysql-sql高级应用相关推荐
- SQL Server应用程序中的高级SQL注入[转]
SQL Server应用程序中的高级SQL注入[从A.Z的POST里转载,经过整理] 作者:Chris Anley[chris@ngssoftware.com] An NGSSoftware Insi ...
- 程序员的mysql金典pdf_《程序员sql金典》pdf(完整)
[实例简介] [实例截图] [核心代码] 第 1 章 数据库入门 1 1.1 数据库概述 1 1.1.1 数据库与数据库管理系统 1 1.1.2 数据库能做什么 2 1.1.3 主流数据库管理系统介绍 ...
- 高级php程序员,php高级程序员该学什么
高级PHP程序员 重点:除了基本的LNMP程序,还能够在某个方向或领域有深入学习.(纵深维度发展) (推荐学习:PHP视频教程) 目标:除了能够完成基本的PHP业务开发,还能够解决大部分深入复杂的技术 ...
- SQL Server应用程序中的高级SQL注入
作者:不详 来源:techtarget http://www.csai.cn 2006年5月11日 摘要:这份文档是详细讨论SQL注入技术,它适应于比较流行的IIS+ASP+SQLSERVER平台.它 ...
- mysql自定义函数多参数_MySQL数据库高级(二)——自定义函数
MySQL数据库高级(二)--自定义函数 一.自定义函数简介 自定义函数 (user-defined function UDF)是一种对MySQL扩展的途径,其用法和内置函数相同. 自定义函数的两个必 ...
- mysql sql 连接查询语句_Mysql——sql数据库中的连接查询
1.1.1 交叉连接(CROSS JOIN) 交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. ...
- mysql替换sql中rank函数_MySQL sql Rank()函数实现
一字符串类 Ø Concat函数:连接字符串 Ø Instr函数:返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) Ø 字符串大小写转换[upper().u ...
- mysql定义条件和处理_mysql sql存储过程条件定义与处理
一.条件定义 DECLARE condition_name CONDITION FOR condition_vale condition_value: sqlstate[value] sqldata_ ...
- mysql的sql优化工具下载_MySQL SQL查询优化工具EverSQL
概述 一般来说,SQL查询优化器分析给定查询的许多选项,预估每个选项的成本,最后选择成本最低的选项.如果查询优化器选择了错误的计划,则性能差异可能从几毫秒到几分钟.幸运的是,现在有许多第三方SQL查询 ...
- mysql 隐式转换 索引_MySQL SQL优化之字符串索引隐式转换
之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结 ...
最新文章
- QLabel设置文字大小和颜色
- 思卡乐科技发布SR3系列RFID产品
- 云原生和ServiceMesh主要组件--理解K8s/Istio/Envoy
- css按钮大小固定,在CSS中创建一个固定宽度的按钮
- java只有值传递_为什么说java中只有值传递
- ASP.NET Web API 提升性能的方法实践
- PERMUTATION
- vue+django实现下载文件
- 天才绅士少女助手克里斯蒂娜 [数学+树状数组]
- 翠竹林 Java 实现对Sql语句解析
- info There appears to be trouble with your network connection. Retrying
- 基于HC-05蓝牙模块的STM32无线控制智能系统硬件开发
- 哈达玛矩阵 matlab,哈达玛变换矩阵.ppt
- 5.2 主机扫描:主机探测
- 考考你的基础知识:C++ 文件操作ofstream、ifstream使用
- 《C++Primer》第二章-变量和基本类型-学习笔记(1)
- 对接塔吉特Target DVS EDI流程
- ArcGis辅助编号功能的插件式实现
- 20个最好的在线网站 Fav 图标生成工具
- 同程旅游火车票部门面经
热门文章
- 学java交学费包分配_java 学生缴学费案例:
- java 反射泛型方法_java基础之反射和泛型以及注解
- 差分放大电路差模共模公式_差分放大电路对差模信号和共模信号有什么影响?...
- python自动寻路模板_Python实现的简单模板引擎功能示例
- mysql semisync 恢复_mysql半同步复制(semi_sync_replication)搭建及使用
- ll微信2下载安装_【兰苑文学】:陈振 ll黄金槐
- docker mysql配置 丢失_Ubuntu16.04服务器环境配置 – Docker、MySQL、Redis
- nhinx php 调优,高流量站点NGINX与PHP-fpm配置优化
- Apache 和 Tomcat 服务器的区别
- 【java8新特性】——lambda表达式与函数式接口详解(一)