SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )
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快速回顾 )相关推荐
- mysql item_MySQL源代码:关于MySQL的Item对象
前篇介绍了MySQL如何从SQL语句转换成一个内部对象.本文是前篇的延续,将更加详细的介绍WHERE语句对应的Item对象. 1. Item对象@MySQL Internal MySQL Intern ...
- MySQL基础入门【3】
文章目录 13 补充知识,查询结果的去重 14 连接查询 14.1 什么是连接查询? 14.2 连接查询的分类? 14.3 基础知识 补充,表的别名 14.4 内连接 等值连接 非等值连接 自连接 1 ...
- MySql的入门到入坟
系列文章目录 本章讲述Mysql的入门和使用. 文章目录 系列文章目录 前言 一.数据库设计分析 1. 软件开发周期 2. 设计数据库的步骤 3. 绘制E-R图 4. 数据库设计范式 二.MySql的 ...
- linux启动mysql_【数据库】MySQL数据库入门学习
Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一. ...
- MySQL从入门到精通
一.配置 MySQL服务启动 手动 cmd --> services.msc 打开服务的窗口 使用管理员打开cmd net start mysql:启动mysql的服务 net stop mys ...
- [MySQL光速入门]020 事务
TCL 事务控制语言 SQL的四种语言 DDL(Data Definition Language)数据库定义语言 建表, 建库, 修改表结构 DML(Data Manipulation Languag ...
- mac mysql docker_Mac上使用Docker如何快速启动MySQL测试
本文主要讨论使用docker快速启动 MySQL 测试的方法,包括Mac环境.一起看看吧! 近来业界有很多对Docker的讨论,其生态系统发展得很快,然而,从简单的"入门"或&qu ...
- [MySQL光速入门]004 作业解答
创建数据库library create database library character set utf8; use library; 复制代码 创建数据表 图书类别表(booktype) 序号 ...
- [MySQL光速入门]003 留点作业...
创建数据库library 创建数据表 图书类别表(booktype) 序号 属性名称 含义 数据类型 是否为空 备注 1 typeid 类别编号 int not null 主键 2 typename ...
- [MySQL光速入门]007 作业解答
创建数据库library 创建数据表 图书类别表(booktype) 序号 属性名称 含义 数据类型 是否为空 备注 1 typeid 类别编号 int not null 主键 2 typename ...
最新文章
- 计算机再带word打不开,word打不开,详细教您怎么解决word打不开
- linux下字符编码转换
- c语言第四章作业,大学C语言第四章作业答案
- vi/vim粘贴代码自动缩进导致全乱了
- 基于Boost::beast模块的同步HTTP客户端
- MySQL千万数据量深分页优化
- Django REST framework 版本
- pku 1511 Invitation Cards
- js 获取html文字颜色,js获得网页背景色和字体色的方法
- C语言宏定义,内置宏的用法
- 数据分析最难的就是怎样读懂数据!
- python 帮助 help
- Springboot发送美观的HTML邮件
- Java集成Outlook邮件操作
- Golang 数组的一些自问自答
- 干草堆——acwing算法题第二天
- 仿泡团影视网源码 苹果cmsV8版本 电脑端+影视模块
- Java核心技术读书笔记01
- 步步「动」心,人-机器人渐进式交互研究——百度人工智能交互设计院
- html页面漏斗图,漏斗图的详细解读