MySQL整理(三)
一、简单单表操作
(1)简单CRUD
|
插入查询结果 |
insert into table1(id,name,age) select id,name,age from table2 where id=1 |
|
更新操作 |
update 表名 set 字段名=’abc’where id=xxx; |
|
避免重复数据查询-distinct |
Select distinct 去重字段名 from 表名 |
|
数学运算 |
select id*10 from表名 |
|
字符串拼接 |
select concat(name,’的工资是:’,salary) |
|
范围查询 |
select name from 表名 where id between 5 and 10 |
|
去除范围查询 |
select name from 表名 where id not between 5 and 10 |
|
为空查询 |
select * from 表名 where field is NULL; |
|
不为空查询 |
select * from 表名 where field is not NULL; |
|
带in关键字集合查询 |
select name from表名 where id in (1,2,3) |
|
带in关键字排除查询 |
select name from表名 where id not in (1,2,3) |
|
备注:关于带in的集合查询,当集合中存在null值时,如Select name from表名 where id in (1,2,3,null),不会影响查询结果。 |
|
|
模糊匹配like |
select name from 表名 where name like ‘XXX%’ |
|
备注:匹配以“xx”开头的字符以%结尾,以“xx”结尾的字符以%开头 |
|
|
占位符_ |
1、 select name from xuanjie where name like ‘_c%’;(第二个字符为c) 2、 select name from xuanjie where name like ‘__c%;(第三个字符为c) |
|
备注:“_”通配符能匹配单个字符,“%”通配符可以匹配任意长度的字符串。Like匹配“%%”则表示查询所有数据记录。非匹配关键字可用not like 表示。 |
|
|
升序 |
select * from 表名 order by 字段名 asc; |
|
降序 |
select * from 表名 order by 字段名 desc; |
|
多字段升序,降序 |
select * from 表名 order by 字段名1 asc,字段名2 desc; |
|
Limit关键字 |
select * from 表名 where id < 8 order by id desc limit 3 |
|
Limit A,B |
A从第几开始,显示B条 |
|
不等于表达式 |
select age from 表名where not name=’cc’; |
(2)统计函数和分组查询
|
统计表中记录的条数count()函数 |
select count(字段名) from 表名 where id < xxx |
|
统计平均值avg()函数 |
select avg(字段名) as xxx from 表名 |
|
统计计算求和sum()函数 |
select sum(字段名) as xxx from 表名 |
|
统计最大值max()函数 |
select max(字段名),min(字段名) from 表名 |
|
统计最大值min()函数 |
|
|
备注:对于MySQL支持的统计函数,如果所操作的表中没有任何记录,则count()函数返回0,其他函数则返回NULL。 |
|
|
简单分组查询group by |
select * from 表名 group by 字段名 |
|
group_concat()函数用以指定显示每个分组中的指定字段值 |
select age,group_concat(字段名),count(字段名) from 表名 group by 分组字段名 |
|
多个字段分组查询 |
group by 字段名1,字段名2 |
|
Having字句限定分组查询 |
select id as uid,group_concat(name) as uname,count(name),avg(age) from xuanjie group by id,age having age > 20; |
|
备注:在MySQL中,如果想实现对分组进行条件限制,不能通过where来实现,因为该关键字主要用来实现条件限制数据记录。MySQL提供了专门的关键字having来实现条件限制分组数据记录。同时,分组查询必须为操作表中有重复的数据,否则没有任何意义。 |
|
二、多表操作原理
MySQL支持通过连接查询来进行多表的操作,具体操作时,首先将两个或两个以上的表按照某个条件进行连接后,再按要求查询目标数据,连接查询包括内连接和外连接。但在实际应用中,一般不使用连接查询,因为笛卡尔乘积的缘故,该操作的效率比较低,所以又出现了同样适合多表查询的子查询。
以下介绍,均围绕以下班级和学生信息表来展开


(1)笛卡尔积:没有连接表关系返回的结果。如select * from class,student,出现如下结果,笛卡尔积的结果集数为前一个表的数据总和 x 后一个表的数据总和,中间只是单纯的连接两个表,并没有做数据的匹配等操作。
(2)连接:所谓连接,其实就是在表关系的笛卡尔积中,按照某个条件生成的一个新的关系,连接可分为内连接和外连接。
(3)内连接(INNER JOIN):所谓内连接,就是在表关系的笛卡尔积中,保留表关系中匹配的记录,舍弃不匹配的数据记录,按照匹配的条件可以分为自然连接,等值连接和不等值连接。
(4)自然连接(NATURAL JOIN):所谓自然连接,就是表关系的笛卡尔积,根据表关系中相同名称的字段自动进行数据匹配,然后去掉重复字段。
select * from class natural join student;

(5)等值连接:所谓等值连接,就是表关系的笛卡尔积,选择所匹配字段值相等的数据。如下执行结果,发现与自然连接相比,等值连接会去匹配"="条件,并且在新关系中不会去掉重复字段,如class_id。

(6)不等连接:所谓不等连接,就是在表关系的笛卡尔积中,选择所匹配字段不等于的条件。如下执行结果,会在笛卡尔积中获取"!="不等于条件中的数据,并且不会去掉重复字段,如class_id。

(7)外连接(OUTER JOIN):就是在表关系的笛卡尔积中,不仅会保留部分不匹配的记录,还会保留部分不匹配的记录。外连接包括左外连接(LEFT OUTER JOIN),右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN),以下基于此两张表讲解外连接:

(8)左外连接(LEFT OUTER JOIN):所谓左外连接,就是表关系的笛卡尔积中除了选择匹配的数据记录,还包含左边表中不匹配的数据记录,如下:

(9)右外连接(RIGHT OUTER JOIN):所谓右外连接,就是表关系的笛卡尔积中除了选择匹配的数据记录,还包含右边表中不匹配的数据记录,如下:

(10)全外连接(FULL OUTER JOIN):所谓全外连接,就是表关系的笛卡尔积中,除了选择相匹配的记录,还包含左右两边表中不匹配的数据记录。
三、子查询
为什么使用子查询:在平常的多表连接查询中,由于会对表进行笛卡尔积操作,如果多张表的数据记录大,或字段多,则进行笛卡尔积的时候就会出现死机,对于有经验的SQL开发者,会首先通过统计函数count(*)统计多表的数据记录数,然后才决定是否使用多表查询。
但如果通过统计函数得到的数据记录数过大,则不适合使用多表查询,此时便推荐使用子查询,所谓子查询,即在一个主查询中嵌套了其他的若干查询,如在select xxx from where xxx中嵌套多select,此时,外层的select被称为主查询,内层的则称为子查询。
以下使用该student表作为示例:

示例1:子查询为单行多列

示例2:子查询为单行多列

示例3:子查询为多行单列
当子查询返回结果是多行单列数据时,通常会包含in,any,all,exists关键字。
(1)in关键字

(2)any关键字
=any:功能与in一样
>any:比子查询中返回的最小数据还要大的记录
<any:比子查询中返回的最大数据还要小的记录

(3)all关键字
>all:比子查询中返回的最大的记录数还要大的数据
<all:比子查询中返回的最小的记录数还要小的数据

(4)exists关键字
exists查询时会对外表进行遍历逐条查询,然后将结果传到子查询中。
示例4:多行多列子查询

MySQL整理(三)的更多相关文章
- .NetCore中EFCore for MySql整理(三)之Pomelo.EntityFrameworkCore.MySql
一.Pomelo.EntityFrameworkCore.MySql简介 Git源代码地址:https://github.com/PomeloFoundation/Pomelo.EntityFrame ...
- {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句
MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...
- .NetCore中EFCore for MySql整理(二)
一.简介 EF Core for MySql的官方版本MySql.Data.EntityFrameworkCore 目前正是版已经可用当前版本v6.10,对于以前的预览版参考:http://www.c ...
- PHP的学习--连接MySQL的三种方式
记录一下PHP连接MySQL的三种方式. 先mock一下数据,可以执行一下sql. /*创建数据库*/ CREATE DATABASE IF NOT EXISTS `test`; /*选择数据库*/ ...
- MYSQL整理的语法
MYSQL整理的语法 http://www.cnblogs.com/suoning/p/5744849.html
- (转载)MySQL默认INFORMATION_SCHEMA,MySQL,TEST三个数据库用途
(转载)http://www.45it.com/database/201204/29390.htm 本文简要说明了MySQL数据库安装好后自带的INFORMATION_SCHEMA,MySQL,TES ...
- MySQL默认INFORMATION_SCHEMA,MySQL,TEST三个数据库用途
本文简要说明了MySQL数据库安装好后自带的INFORMATION_SCHEMA,MySQL,TEST三个数据库的用途. 第一个数据库INFORMATION_SCHEMA:提供了访问数据库元数据的方式 ...
- MySQL优化三(InnoDB优化)
body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...
- 使用zabbix监控mysql的三种方式
使用zabbix监控mysql的三种方式 1.只是安装agent 2.启用模板监控 3.启用自定义脚本的模板监控 zabbix中默认有mysql的监控模板.默认已经在zabbix2.2及以上的版本中. ...
- php 链接mysql的三种方式对比
PHP连接Mysql的三种方式: 1.原生的连接方式 原生的连接方式是面向过程的写法 <?php $host = 'localhost'; $database = 'test'; $usern ...
随机推荐
- 修改Apache访问权限
You don't have permission to access / on this server.错误,居然说我此台服务器上无权限,ok解决办法如下: 找到:apache文件,进入conf文件 ...
- 详谈JavaScript 匿名函数及闭包
1.匿名函数函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种:这 ...
- WTL:下载、安装、初见
简介 WTL: Windows Template Library 基于ATL对Win32 API的封装 C++库,用于开发Windows应用程序和UI组件 WTL功能不如MFC完善,但比MFC更小巧更 ...
- Matplotlib植入PyQt5 + QT5的UI呈现
实现matplotlib图形通过PyQt5+Qt5在GUI中呈现步骤: 第一步,通过matplotlib.backends.backend_qt5agg类来连接PyQt5: import matplo ...
- [转]ASP.NET MVC 5 学习教程:快速入门
本教程将使用Visual Studio 2013手把手教你构建一个入门的ASP.NET MVC5 Web应用程序.本教程配套的C#源码工程可通过如下网址下载:C#版本源码链接.同时,请查阅 Build ...
- 剑指 offer set 22 数组中的逆序数
总结 1. 题目为归并排序的变形, 不过我完全没想到 2. 在归并排序进行字符组 merge 时, 统计逆序数. merge 后, 两个子数组是有序的了, 下次再 merge 的时候就能以 o(n) ...
- 第二十一篇:Linux 操作系统中的进程结构
前言 在 Linux 中,一个正在执行的程序往往由各种各样的进程组成,这些进程除了父子关系,还有其他的关系.依赖于这些关系,所有进程构成一个整体,给用户提供完整的服务( 考虑到了终端,即与用户的交互 ...
- Git-fatal: unable to access 'xxx' : Could not resolve host: xxx
解决办法:(在知乎上找到 确实好用) 1.查询代理 git config --global http.proxy 2.取消代理设置 git config --global --unset http.p ...
- POJ3272 Cow Traffic
题目链接:http://poj.org/problem?id=3272 题目意思:n个点m条边的有向图,从所有入度为0的点出发到达n,问所有可能路径中,经过的某条路的最大次数是多少.边全是由标号小的到 ...
- 基于spring的quartz定时框架,实现简单的定时任务功能
在项目中,经常会用到定时任务,这就需要使用quartz框架去进行操作. 今天就把我最近做的个人主页项目里面的定时刷新功能分享一下,很简单. 首先需要配置一个配置文件,因为我是基于spring框架的,所 ...