最近在复习数据库相关的知识,主要是以“SQL必知必会”这本书为参考,结合网上相关博客,记录学习的要点。本篇博客会持续更新,便于以后复习。

参考博客:http://blog4jimmy.com/2017/11/256.html

1.SQL外连接

在SQL中外连接包括左连接(left join)和右连接(right join),全外连接(full join),等值连接(inner join)又叫内连接。

left join(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。

right join(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。

inner join(等值连接或者叫内连接):只返回两个表中连接字段相等的行。

full join(全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。

2.SQL查询

1)SQL语句是不区分大小写的,在一个语句中,你使用全部大写、全部小写或者大小写混合【select、Select】,结果都是一样的。

2)DISTINCT(去重)关键字放在需要查询的列名前。

3)LIMIT和OFFSET关键字:

LIMIT关键字:表示限制SELECT返回的行数,例如LIMIT 5表示SELECT结果最多只能返回5行。

OFFSET关键字表示SELECT返回的数据从第几行开始输出显示,例如offset 4表示OFFSET的查询会从第4行开始显示,前面的3行的数据就跳过了。

注意注意!!offset是不能单独使用的,需要和limit一同使用

举例:SELECT num FROM Alpha LIMIT 2 OFFSET 3;

4) 数据排序ORDER BY后面跟需要排序的列名(默认是升序)。其可以按照多个列进行排序,只需在ORDER BY后用逗号分隔多个列就好了,多个列排序的规则是:对第一顺位的列进行排序,如果该列存在相同的内容,在按照第二顺位的列进行排序,依次类推。

SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price, prod_name;

// 下面这一句和上面一句的功能一样,取前面字段的23进行排序

SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2,3;

5) 过滤数据

Where关键字:注意and 和 or 的使用。and是指既符合条件A又符合条件B。or是指条件A或条件B有1个满足即可。

注意注意!!and和or的求值顺序判断:SQL在处理 OR操作符 之前会优先处理 AND操作符

IN操作符:用来指定要匹配值的清单的关键字,功能与OR相当。

NOT操作符:其和不等于是类似的,只是NOT操作符是跟在where后面的。

SELECT prod_name, prod_price FROM Products WHERE NOT vend_id = 'DLL01';

6) 通配符

百分号(%)通配符:表示任何字符出现的任意次数

下划线(_)通配符:匹配一个字符

方括号([])通配符:匹配指定位置(通配符的位置)的一个字符

举例:找出J或M开头的cust_contact行

SELECT cuts_contact FROM Customers WHERE cust_contact LIKE '[JM]%';

 

7) 拼接字段(CONCAT

含义:将值联结到一起(将一个值附加到另一个值)构造单个值,举例:

SELECT CONCAT(vend_name, ' (' , vend_country, ')') AS vend_title FROM Vendors ORDER BY vend_name;

 

8)计算字段

有时候我们在一个表里面存储了一张订单的货物数量和货物单价,但是没有存储该订单的总价,这时候我们可以通过计算字段,让数据库帮我们计算总价并返回给我们。

SELECT prod_id, quantity, item_price, quantity*item_price AS total_price FROM OrderItems WHERE order_num = 20008;

 

 

9) 分组数据

通过COUNT(*)可以检索出某一列包含的数量,但是却不能将相同的行合并在一起。所以,COUNT(*)统计出来的行数就包括了相同的行数了。但是不可以通过DISTINCT来合并相同的数据行,DISTINCT是不能用于COUNT(*),但是我们可以通过GROUP BY进行合并。

SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id;

 

上面语句还有下列的改写形式。(注意:与group by搭配使用的过滤关键字用having

SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id HAVING COUNT(*) > 2;

 

10) 子查询

案例:现在有3个表

  • 订单的编号、客户的ID和订单日期在表Orders中存储为一行
  • 各个订单包含的物品存储在OrderItems表中
  • 而顾客的详细信息存储在Customers表中

现需查询有哪些顾客订购了'RGAN01'这个上商品,按照上面的表结构,分析如下:

  • 首先需要查看表OrderItems中,包含这个物品的订单编号是多少;
  • 然后根据这个订单编号查询Orders表,获得对应客户的ID;
  • 最后再根据这个客户ID来查询Customers表,来获取具体的客户信息

SELECT cust_name, cust_contact FROM Customers WHERE cust_id IN

( SELECT cust_id FROM Orders WHERE order_num IN

( SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01'));

11)联结

如果数据存储在多个表中,想要用一条SELECT语句检索出数据的话,就需要用到联结了。简单说,联结是一种机制,用来在一条SELECT语句中关联表,一次称为联结。

创建联结很简单,指定需要联结的所有表以及关联它们的方式即可。例如:

SELECT vend_name, prod_name, prod_price FROM Vendors, Products WHERE Vendors.vend_id = Products.vend_id;

跟上面语句具有相同效果的语句:

SELECT vend_name, prod_name, prod_price FROM Venders INNERJOIN Products ON Vendors.vend_id = Products.vend_id;

上面的语句中,两个表的关系是通过INNER JOIN指定的部分FROM子句,在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句来指出。

注:联结的表不宜过多,否则数据库的性能下降的很快

 

12)组合

UNIONUNION指示数据库执行这两条SELECT语句,并把输出组合成一个查询结果集。另外UNION从查询结果集中自动删除重复的行;换句话说,它的行为和一条SELECT语句中使用多个WHERE子句条件一样。

UNION ALL返回所有的匹配的行,包括返回重复的行

SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IN ('IL', 'IN', 'MI') UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_name = 'Fun4All';

 

13)将一个表复制到另一个表

CREATE TABLE CustCopy AS SELECT * FROM Customers;

 

14)update操作语法记录

UPDATE Customers SET cust_contact = 'Sam Roberts', cust_email = 'sam@toyland.com' WHERE cust_id = '1000000006';

 

15)修改表语法记录

更新表,添加列举例:

ALTER TABLE Vendors ADD vend_phone CHAR(20);

更新表,删除列

ALTER TABLE Vendors DROP COLUMN vend_phone;

 

MYSQL理论学习的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  4. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  5. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

随机推荐

  1. Python&Selenium智能等待方法封装

    摘要:本篇博文用几行代码展示Python和Selenium做自动化测试时常见的显示等待和封装 # 用于实现智能等待页面元素的出现 # encoding = utf-8 ""&quo ...

  2. Spring实战(第4版)

    第1部分 Spring的核心 Spring的两个核心:依赖注入(dependency injection,DI)和面向切面编程(aspec-oriented programming,AOP) POJO ...

  3. CodeForces - 1202F You Are Given Some Letters... (整除分块)

    题意:一个字符串包含a个A和b个B,求这个字符串所有可能的循环节长度(末尾可能存在不完整的循环节) 好题,但思路不是很好想. 首先由于循环节长度可以任意取,而循环次数最多只有$O(\sqrt n)$个 ...

  4. CF666E Forensic Examination——SAM+线段树合并+倍增

    RemoteJudge 题目大意 给你一个串\(S\)以及一个字符串数组\(T[1...m]\),\(q\)次询问,每次问\(S\)的子串\(S[p_l...p_r]\)在\(T[l...r]\)中的 ...

  5. 小米oj 数组差(挺好的题)

     数组差 序号:#46难度:困难时间限制:1000ms内存限制:10M 描述 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组元素和的差的绝对值 |SUM(A) - SUM(B)| 最大. ...

  6. 【luoguP2675】《瞿葩的数字游戏》T3-三角圣地

    题目背景 国王1带大家到了数字王国的中心:三角圣地. 题目描述 不是说三角形是最稳定的图形嘛,数字王国的中心便是由一个倒三角构成.这个倒三角的顶端有一排数字,分别是1~N.1~N可以交换位置.之后的每 ...

  7. Flask-特殊的装饰器

    视图函数中的装饰器 -----------------------视图中的装饰器---------------------- 1.如果使用的是函数视图,那么自己定义的装饰器必须放在`app.route ...

  8. [Alg] 二叉树的非递归遍历

    1. 非递归遍历二叉树算法 (使用stack) 以非递归方式对二叉树进行遍历的算法需要借助一个栈来存放访问过得节点. (1) 前序遍历 从整棵树的根节点开始,对于任意节点V,访问节点V并将节点V入栈, ...

  9. Raspberry Pi 4B基本设置

    目录 一.SSH登录Raspberry Pi 二.开启VNC服务 三.将SD卡分区扩展 四.修改软件源 一.SSH登录Raspberry Pi 完成系统烧录后,就需要登录Raspberry Pi,此时 ...

  10. 19.顺时针打印矩阵 Java

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...