最近在复习数据库相关的知识,主要是以“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. Codeforces 1187 G - Gang Up

    G - Gang Up 思路: 每个点按时间拆点建边,然后跑最小费用流 一次走的人不能太多,假设每次走的人为k (k*k-(k-1)*(k-1))*d <= c+d k <= 24 代码: ...

  2. Linux下批量修改文件编码

    假设需要将所有afish目录下的php文件,编码从gb2312转到utf8 cd afish find ./ -type f -name “*.php”|while read line;do echo ...

  3. SpiderMan成长记(爬虫之路)

    第一章 爬虫基础 1.1 爬虫基本原理 1.2 请求库 -- urllib库的使用 1.3 请求库 -- requests库的使用 1.4 数据解析 -- 正则基础 1.5 数据解析 -- lxml与 ...

  4. 技术学到多厉害,才能顺利进入BAT?

    简介 本科的时候对 Linux 特别感兴趣,心中向往成为一名运维工程师,就开始没日没夜的看相关的书籍,到了大约2013年前后的时候发现 DevOps 开始流行起来了,就开始学习 Python 希望成为 ...

  5. pip报错以及指向错误

    在终端中输入无论是pip3 -V或是pip -V都指向python3 如下图所示: 然后在卸载或更新pip 时都出现了报错: 就是卸载也卸不了更新也更不了 解决报错: Traceback (most ...

  6. 第一节:python读取excel文件

    写在前面: (1)Excel中数字格式int(1),读出的是float(1.0)类型,导致传参时造成不同,强制转换时,int(str(1.0))在2.7版本又会报错ValueError: invali ...

  7. centos 7 + Net Core 3.0 + Docker 配置说明(不含https)

    1.新建Core3.0项目 1.1 使用visual studio 2019 创建一个名为core3.web.httpapi 的"ASP.NET Core Web应用程序" 1.2 ...

  8. Error creating bean with name 'documentationPluginsBootstrapper' defined in URL

    启动报错 Error starting ApplicationContext. To display the auto-configuration report re-run your applica ...

  9. 01_初识redis

    1.redis和mysql mysql是一个软件,帮助开发者对一台机器的硬盘进行操作. redis是一个软件,帮助开发者对一台机器的内存进行操作 汽车之家,如果硬盘挂掉了,页面还能访问1个月 关键字: ...

  10. 头条编程题 万万没想到之抓捕孔连顺 JavaScript

    [编程题] 万万没想到之抓捕孔连顺 时间限制:1秒 空间限制:131072K 我叫王大锤,是一名特工.我刚刚接到任务:在字节跳动大街进行埋伏,抓捕恐怖分子孔连顺.和我一起行动的还有另外两名特工,我提议 ...