SQL

先说点废话,很久没发文了,整理了下自己当时入门 SQL 的笔记,无论用于入门,回顾,参考查询,应该都是有一定价值的,可以按照目录各取所需。SQL数据库有很多,MySQL是一种,本文基本都是SQL通用标准,有些标准很不统一的地方就用MySQL的写法了。希望本文帮你快速了解SQL的基本操作和概念。
文章格式上有些问题,可以点击这里获得更加的阅读体验

目录

  • 检索
  • 过滤检索结果
  • 数据汇总处理
  • 分组
  • 给检索结果排序
  • 表操作
  • 插入数据
  • 更新删除数据
  • 子查询-迭代查询
  • 联结-关联多个表
  • 组合查询
  • 视图
  • 其它

检索

  • 检索某表中单个列:
    SELECT 列名
    FROM 表名;
  • 检索某表中多个列:
    SELECT 列名,列名,列名
    FROM 表名;
  • 检索某表中所有列:(尽量不用)
    SELECT *
    FROM 表名;
  • 只检索某表中某列里不重复的项:
    SELECT DISTINCT 列名 (如果有两列或以上,需要这些列组合起来是不重复的)
    FROM 表名;
  • 检索指定行数:
    SELECT 列名
    FROM 表名
    LIMIT 5 OFFSET n; (mySQL中,选第n行后的五行。 OFFSET n 可不填写默认为0,其它 SQL 数据库中有不同写法)

过滤检索结果

  • 寻找指定行:(举例)
    SELECT prod_name, prod_price  FROM Products  WHERE prod_price = 3.49;(和字符串比较加单引号,数值不用)
查找列名为prod_name和列名为prod_price的两列,检索其中prod_price = 3.49; 的所有行。
= 可以替换为其它操作符,如下表| 操作符 | 描述 |
| --- | --- |
| = | 等于 |
| <> | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| BETWEEN | 在某个范围内 |
| LIKE | 搜索某种模式 |
  • 组合WHERE子句:
    SELECT prod_id, prod_price, prod_nameFROM ProductsWHERE vend_id = 'DLL01' AND prod_price <= 4;
AND 连接同时需要满足的两个条件,OR即满足一个条件即可,NOT 找到与后边条件不匹配的行。
且not,and和or可以组合使用,用小括号声明逻辑循序。
`WHERE vend_id IN ( 'DLL01', 'BRS01' ) `
IN 起到作用类似于or,速度更快,逻辑更清晰。
  • 通配符搜索:
    SELECT prod_id, prod_nameFROM ProductsWHERE prod_name LIKE '%bean bag%';
%表示任意字符出现任意次数。也可以出现在中间位置。
_ 表示一个字符。
[charlist] 表示包含在里面的任意字符,[^charlist]不包含在里面的任意字符。
少使用通配符,搜索速度较慢。  

数据汇总处理

  • 算术计算:
    SELECT prod_id,quantity,item_price,quantity * item_price AS expanded_priceFROM OrderItemsWHERE order_num = 20008;
`expanded_price`成为计算出来的新列。
  • 字符串拼接:
    不同数据库有差异,MySQL中:
    SELECT concat(vend_name , vend_country)AS vend_titleFROM VendorsORDER BY vend_name;
concat_ws( ':' , vend_name , vend_country) 形式第一个参数为分隔符。
其他数据库用+或者||拼接字符串。
  • 日期时间处理不同数据库差异较大。
  • 内置方法:
    • 求平均值:
      SELECT AVG(prod_price) AS avg_price
      FROM Products;
      表Products中prod_price的平均值。返回给 avg_price。
      可以配合WHERE语句计算指定行的平均值。
    • 求最大值:MAX(prod_price)
    • 求最小值:MIN(prod_price)
    • 求和:SUM(prod_price)
    • 近似的小数点后几位:ROUND(column_name,decimals)
    • 当前日期: Now()
    • 求行数:
      SELECT COUNT(*) AS num_cust
      FROM Customers;
      求表Customers有几行。返回给num_cust。
      *可以换成指定列如:cust_email。计算所得行数不包括该列值为null的行。
      DISTINCT 列名,求不重复的列。
  • 组合:
    SELECT COUNT(*) AS num_items,MIN(prod_price) AS price_min,MAX(prod_price) AS price_max,AVG(prod_price) AS price_avgFROM Products;

分组

  • 创建分组:
    SELECT vend_idFROM ProductsGROUP BY vend_id;
根据 vend_id列中内容对 vend_id分组,
第一行换成 `SELECT vend_id, COUNT(*) AS num_prods` 即对每一个组计算行数。
注意:多行NULL会分为一组,GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
可以对一个以上的列进行 GROUP BY
  • 过滤分组:
    HAVING:类似于WHERE。唯一的差别是,WHERE过滤行,而HAVING过滤分组。
    SELECT vend_id, COUNT(*) AS num_prodsFROM ProductsWHERE prod_price >= 4GROUP BY vend_idHAVING num_prods >= 2;
过滤出有(两个价格大与4的产品)的供应商

给检索结果排序

SELECT Company, OrderNumber
FROM Orders
ORDER BY Company DESC, OrderNumber ASC  

可以 ORDER BY 列名1,列名2; 先按列名1内容排序,排序结果相同的按列名2内容排序。
列名后接 DESC 按该列内容倒序排列,ASC 正序(默认)。
ORDER BY 命令放在查询、分组等语句的最后。

表操作

  • 创建表:
    CREATE  TABLE  newProducts(prod_id         CHAR(10)           NOT NULL,vend_id         CHAR(10)           NOT NULL,prod_name       CHAR(254)          NOT NULL,prod_price      DECIMAL(8,2)       NOT NULL,prod_desc       VARCHAR(1000)      NULL);
NOT NULL 非空约束,不允许列中有NULL值下面介绍其他约束。
列的设置可以加上默认值,如NOT NULL后边接 DEFAULT  CURRENT_DATE() ,默认值为当前日期。(每个数据库获取当前日期语句不同。)
后面接 PRIMARY KEY 即设置改列为主键。
后面接  AUTO_INCREMENT 即设置为自增,只有int型可以设置。
  • 约束:
    每个列可以有一种或几种约束。

    • NOT NULL 非空约束.
    • UNIQUE 唯一约束,可唯一标识数据库表中的每条记录。
    • PRIMARY KEY 主键约束,唯一标识数据库表中的每条记录,唯一且非空。
    • FOREIGN KEY 外键约束,一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
    • CHECK 检查约束,用于限制列中的值的范围。
    • DEFAULT 默认约束,用于向列中插入默认值
      每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
      每种约束可以创建表时设置好,也可以后期增删.
  • 索引:
    在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
    CREATE INDEX 索引名ON Person (列名[,列名])  
  • 复制表或表中部分列:
    CREATE  TABLE CustCopy ASSELECT * FROM Customers;
创建Customers表的复制,CustCopy。
  • 修改表:
    ALTER TABLE VendorsADD vend_phone CHAR(20);ALTER TABLE VendorsDROP COLUMN vend_phone;
各数据库有不兼容现象,复杂表操作列可能要新建表删除旧表。
ALTER 还可以用来添加删除约束,删除索引等。
  • 删除表:
    DROP TABLE CustCopy;
  • 重命名表:
    RENAME Table oldTable TO newTable;

插入数据

  • 插入整行或部分行:
    INSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country,cust_contact,cust_email)VALUES('1000000007','Toy Land','123 Any Street','New York','NY','11111','USA',NULL,NULL);
插入整行时,可省略 Customers 括号内的内容,即按照列的顺序,分别插入数据(不推荐)。省略 Customers 括号内的内容时,无内容的列必须用NULL占位。
插入部分行时,把要插入的列填入 Customers 括号内,与VALUES内容一一对应,没有提到的列默认NULL或其他默认值。
  • 插入查询到的值:
    INSERT INTO Customers(cust_id,cust_contact,cust_email,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country)SELECT cust_id,cust_contact,cust_email,cust_name,cust_address,cust_city,cust_city,cust_state,cust_zip,cust_countryFROM CustNew;
把从CustNew表中查到的内容插入 Customers表中。一次插入多行的方式。

更新和删除数据:

  • 更新数据:
    UPDATE CustomersSET cust_email = 'kim@thetoystore.com'WHERE cust_id = '1000000005';
步骤为,要更新的表,要更新的列,要更新的行。一个SET可以跟多个列用逗号隔开。
删除某个值,即设置他为NULL。
  • 删除数据:
    DELETE FROM CustomersWHERE cust_id = '1000000008';
删除表中指定整行,删除部分列用UPDATE
在UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。如果不写WHERE会更新或删除所有行内容。

子查询-迭代查询

  • 一种形式:
    SELECT cust_name, cust_contactFROM CustomersWHERE cust_id IN (SELECT cust_idFROM OrdersWHERE order_num IN (SELECT order_numFROM OrderItemsWHERE prod_id = 'RGAN01'));
先从第二个括号选择符合条件的order_num,成为第二个括号内容,再向上找到第一个括号,查到符合条件的cust_id返回给第一个括号,最后根据第一个括号内容执行主查询语句。性能问题不要嵌套太多层。
也就是对Customers表的查询要用到Orders表查询后返回的内容,对Orders表的查询要用到OrderItems表查询后返回的内容。
  • 另一种形式:
    SELECT cust_name,cust_state,(SELECT COUNT(*)FROM OrdersWHERE Orders.cust_id = Customers.cust_id) AS ordersFROM Customers
根据Customers 表中的cust_id,去Orders表中取得计算后的数据。  
  • 同一个表迭代查询:
    SELECT cust_id, cust_name, cust_contactFROM CustomersWHERE cust_name = (SELECT cust_nameFROM CustomersWHERE cust_contact = 'Jim Jones');

联结-关联多个表

  • 两个表:

    • 内联结
          SELECT vend_name, prod_name, prod_priceFROM Vendors, ProductsWHERE Vendors.vend_id = Products.vend_id;
      根据两个表共同的列vend_id把Vendors, Products关联起来。与
          SELECT vend_name, prod_name, prod_priceFROM Vendors INNER JOIN ProductsON Vendors.vend_id = Products.vend_id;
      结果相同。都是内联结,前一种是后一种的简写。  INNER 可省略。
    • 外联结:
          SELECT Customers.cust_id, Orders.order_numFROM Customers LEFT OUTER JOIN OrdersON Orders.cust_id = Customers.cust_id;
      LEFT OUTER JOIN 把Customers表中没有被匹配到的 cust_id 也联结进去(会显示在结果里)。  RIGHT OUTER JOIN 是把Orders表中没有被匹配到的 cust_id 也联结进去(会显示在结果里)。  FULL OUTER JOIN 会把两张表中没有匹配到的列也显示出来(mysql 不支持,可通过 UNION 实现)OUTER 可省略。
  • 多个表:
    SELECT cust_name, cust_contactFROM Customers, Orders, OrderItemsWHERE Customers.cust_id = Orders.cust_idAND OrderItems.order_num = Orders.order_numAND prod_id = 'RGAN01';
作用同子查询中a。同样不要关联太多,有性能问题。其中表名可以使用别名,如:  
    SELECT cust_name, cust_contactFROM Customers AS C, Orders AS O, OrderItems AS OIWHERE C.cust_id = O.cust_idAND OI.order_num = O.order_numAND prod_id = 'RGAN01';

组合查询

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

UNION ALL 链接两句查询语句,统一返回结果,包含重复结果。
去掉ALL以后,去掉重复结果。
此处(从同一个表中查询)可以用WHERE , OR代替。
常用作从不同表中查询时,只要列数相同就可以拼接到一起,列名按照第一句中查询的列名。

视图

对已存在的表,进行筛选,数据处理,联结等操作后返回的数据,创建的虚拟表。视图是为了重用和简化常用的查询。对视图的查询同表。
视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。

  • 创建视图:
    CREATE  VIEW ProductCustomers AS                SELECT cust_name, cust_contact, prod_idFROM Customers, Orders, OrderItemsWHERE Customers.cust_id = Orders.cust_idAND OrderItems.order_num = Orders.order_num;
对OrderItems, Orders和Customers三个表进行联结,联结后结果形成 ProductCustomers 视图,可以把它当一张表来查询。
  • 删除视图:
    DROP VIEW ProductCustomers;

    其它

  • 存储过程:为以后的使用保存一条或多条SQL语句,用于简化操作。每个数据库不同,见数据库具体介绍。
  • 事务处理:事务处理模块中的语句,或者全部执行,或者全部不执行。可以设立保留点,执行失败时回到保留点。
  • 创建数据库: CREATE DATABASE database_name
  • 删除数据库:DROP DATABASE 数据库名称

SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )相关推荐

  1. mysql item_MySQL源代码:关于MySQL的Item对象

    前篇介绍了MySQL如何从SQL语句转换成一个内部对象.本文是前篇的延续,将更加详细的介绍WHERE语句对应的Item对象. 1. Item对象@MySQL Internal MySQL Intern ...

  2. MySQL基础入门【3】

    文章目录 13 补充知识,查询结果的去重 14 连接查询 14.1 什么是连接查询? 14.2 连接查询的分类? 14.3 基础知识 补充,表的别名 14.4 内连接 等值连接 非等值连接 自连接 1 ...

  3. MySql的入门到入坟

    系列文章目录 本章讲述Mysql的入门和使用. 文章目录 系列文章目录 前言 一.数据库设计分析 1. 软件开发周期 2. 设计数据库的步骤 3. 绘制E-R图 4. 数据库设计范式 二.MySql的 ...

  4. linux启动mysql_【数据库】MySQL数据库入门学习

    Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一. ...

  5. MySQL从入门到精通

    一.配置 MySQL服务启动 手动 cmd --> services.msc 打开服务的窗口 使用管理员打开cmd net start mysql:启动mysql的服务 net stop mys ...

  6. [MySQL光速入门]020 事务

    TCL 事务控制语言 SQL的四种语言 DDL(Data Definition Language)数据库定义语言 建表, 建库, 修改表结构 DML(Data Manipulation Languag ...

  7. mac mysql docker_Mac上使用Docker如何快速启动MySQL测试

    本文主要讨论使用docker快速启动 MySQL 测试的方法,包括Mac环境.一起看看吧! 近来业界有很多对Docker的讨论,其生态系统发展得很快,然而,从简单的"入门"或&qu ...

  8. [MySQL光速入门]004 作业解答

    创建数据库library create database library character set utf8; use library; 复制代码 创建数据表 图书类别表(booktype) 序号 ...

  9. [MySQL光速入门]003 留点作业...

    创建数据库library 创建数据表 图书类别表(booktype) 序号 属性名称 含义 数据类型 是否为空 备注 1 typeid 类别编号 int not null 主键 2 typename ...

  10. [MySQL光速入门]007 作业解答

    创建数据库library 创建数据表 图书类别表(booktype) 序号 属性名称 含义 数据类型 是否为空 备注 1 typeid 类别编号 int not null 主键 2 typename ...

最新文章

  1. 计算机再带word打不开,word打不开,详细教您怎么解决word打不开
  2. linux下字符编码转换
  3. c语言第四章作业,大学C语言第四章作业答案
  4. vi/vim粘贴代码自动缩进导致全乱了
  5. 基于Boost::beast模块的同步HTTP客户端
  6. MySQL千万数据量深分页优化
  7. Django REST framework 版本
  8. pku 1511 Invitation Cards
  9. js 获取html文字颜色,js获得网页背景色和字体色的方法
  10. C语言宏定义,内置宏的用法
  11. 数据分析最难的就是怎样读懂数据!
  12. python 帮助 help
  13. Springboot发送美观的HTML邮件
  14. Java集成Outlook邮件操作
  15. Golang 数组的一些自问自答
  16. 干草堆——acwing算法题第二天
  17. 仿泡团影视网源码 苹果cmsV8版本 电脑端+影视模块
  18. Java核心技术读书笔记01
  19. 步步「动」心,人-机器人渐进式交互研究——百度人工智能交互设计院
  20. html页面漏斗图,漏斗图的详细解读

热门文章

  1. swoole实现数据库连接池
  2. 启用CORS实现Ajax跨域请求
  3. rpcgen的简单讲解及例子程序
  4. silverlight 无法发布 如何灵活配置IP
  5. [翻译]Joomla 1.5架构(十一) model 包
  6. swift语言的Block
  7. Vue.js slots: 为什么你需要它们?
  8. RecyclerView的使用(1)之HelloWorld
  9. SQLServer On Linux Package List on CentOS
  10. log4j2配置实例[按小时记录日志文件]