[DB] SQL 必知必会
整体架构
数据类型
- 文本类:CHAR、VARCHAR(可变长度字符,多使用)、TEXT、LONGTEXT(文本较大时使用)
- 数字类:TINYINT、INT、BIGINT、FLOAT、DOUBLE
- 日期类:DATE、DATETIME(常用)、TIME、YEAR
保留字
- SELECT:选择列
- WHERE:过滤行
- AS:起别名
- HAVING:过滤分组
- GROUP BY:分组说明
- ORDER BY:排序顺序
常用操作
- 查看当前有哪些DB:show databases;
- 添加DB:create database gc;
- 删除DB:drop database gc;
- 进入DB:use gc;
- 创建数据表:create table gc(...);
- 增加列:alter talbe account add c1 int
- 查看表:show tables;
- 显示表内容:select * from table;
案例
- 供应商表:Vendors
- 商品表:Products
- 顾客表:Customers
- 订单表:Orders
- 订单物品表:OrderItems
检索数据
- 检索一列
- SELECT col1,col2 FROM table;
- 检索所有列
- SELECT * FROM table;
- 检索一列(显示不同值)
- SELECT DISTINCT col FROM table;
- 检索一列(显示前3行)
- SELECT col FROM table LIMIT 3;
排序
- 对选定的列以字母顺序排序
- SELECT col FROM table ORDER BY col
过滤
- 检索两个列,返回特定值的行
- SELECT col1, col2 FROM table WHERE col = 1;
- 检索两个列,返回不等于特定值的行
- SELECT col1, col2 FROM table WHERE col <> 1;
- 检索两个列,返回特定范围值的行
- SELECT col1, col2 FROM table WHERE col BETWEEN 5 AND 10;
函数
- 使用函数
- UPPER():将字符串转为大写
- LTRIM():去掉字符串左边空格
- LENGTH():返回字符串的长度
- 聚集函数
- ABS(col):返回某列数的绝对值
- AVG(col):返回某列的平均值
- COUNT(col):返回某列有值的行的个数
- MAX(col)/MIN(col):返回某列最大/最小值
- SUM(col):返回某列值之和
分组
- 使用BROUP BY子句,指示DBMS按某字段排序并分组数据
- 返回供应商1001提供的产品数目
- SELECT COUNT(*) AS num_prods FROM Products
- WHERE vend_id = '1001';
- 统计所有供应商的产品数目
- SELECT vend_id, COUNT(*) AS num_prods FROM Products
- GROUP BY vend_id;
- 统计所有产品数目>2的供应商
- SELECT vend_id, COUNT(*) AS num_prods FROM Products
- GROUP BY vend_id HAVING mum_prods > 2;
子查询
- 列出订购物品FB的所有顾客
- SELECT cust_id FROM Orders WHERE order_num IN
- (SELECT order_num FROM OrderItems WHERE prod_id = 'FB');
- 思路:先到订单物品表中找出包含FB的所有订单号,然后再到订单表中找出是谁下的单,返回用户id
- 显示Customers表中每个顾客的订单总数
- SELECT cust_name, cust_state, (SELECT COUNT(*) FROM Orders
- WHERE Orders.cust_id = Customers.cust_id) AS orders
- FROM Customers ORDER BY Cust_name;
- 思路:从Customers表中检索顾客列表,对于检索出的每个顾客,统计其在Orders表中的订单数目
- 原理:在子查询中,对于Orders表中cust_id等于Customers表中cust_id的行,统计其行数,并将该列命名为orders返回
...
联结表
- 联结的三种形式
- 内联结(inner join):联结具有相同字段的另一个表,可基于两个表之间的等值条件做过滤
- 自联结(self join):同一个表联结自己的副本,用于表内信息筛选,比子查询效率高
- 外联结(outer join):联结具有相同字段的另一个表,可基于两个表之间的等值条件做过滤,返回包括在相关表中没有关联行的行
- 联结的原理
- 关系数据库数据表的设计原则是相同的数据不出现多次,这样可以保证较强的可伸缩性(scale,即适应不断增加的数据量)
- 故数据常存储在多个表中,这时就需要使用联结机制将结果输出
- 联结两个表时,会将第一个表中的每一行与第二个表中的每一行配对,即返回笛卡尔积,而不管逻辑上是否匹配
- 加上WHERE作为过滤条件,会删除不符合逻辑的行,只返回包含匹配给定条件(联结条件)的行
- 例1(内连接):返回包含vend_name、prod_name、prod_price的新表(即把产品表中的vend_id换成vend_name,看起来更加直观)
- 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 Vendors INNER JOIN Products
- ON Vendors.vend_id = Products.vend_id;
- 例2(自联结):找出和Y Sam在同一个公司的所有顾客,并返回相关信息(显示某一cust_name下的所有cust_contact)
- SELECT c1.cust_id, c1.cust_name, c1.cust_contact
- FROM Customers AS c1, Customers As c2
- WHERE c1.cust_name = c2.cust_name
- AND c2.cust_name = 'Y Sam';
- 例3(外联结):对每个顾客下的订单进行统计,包括未下单的顾客(返回cust_id和order_num两列,)
- select customers.cust_id,orders.order_num
- from customers left outer join orders
- on customers.cust_id = orders.cust_id;
- 例4(带内联函数的联结):检索所有顾客及每个顾客下的订单数
- select customers.cust_id , count(orders.order_num) as num_ord
- from customers inner join orders on customers.cust_id = orders.cust_id
- group by customers.cust_id;
- 其中,count(orders.order_num) 实现了对每个顾客的订单计数
组合查询
- 利用UNION,将多个SELECT语句组成一个结果集
- UNION中的每个查询必须包含相同的列、表达式或聚集函数
- UNION从查询结果中自动去除了重复的行(不去重就用UNION ALL)
插入数据
- INSERT
- 插入所有行
- INSERT INTO Customers VALUES(
- '1000006', 'TONY', ... , NULL) ;
- 插入部分行
- INSERT INTO Customers (cust_id,cust_name)
- VALUES('1000006', 'TONY');
- 插入索引出的数据
- INSERT INTO Customers (cust_id,cust_name,...)
- SELECT cust_id,cust_name,... FROM CustNew;
- 从一个表复制到另一个表(创建新表CustCopy,将Customers内容复制进去)
- SELECT TABLE CustCopy AS SELECT * FROM Customers;
更新删除
- UPDATE:更新表中的行
- 例:将 cust_id = 1000005 行的邮箱信息更新为 kim@thetoystore.com
- UPDATE Customers SET cust_email = 'kim@thetoystore.com'
- WHERE cust_id = '1000005';
- 注:SET后可设置多个字段的值,不加WHERE将更新素有行
- DELETE:删除某行
- 例:将 cust_id = 1000006 行删除
- DELETE FROM Customers
- WHERE cust_id = '1000006';
- 注:不加WHERE将删除所有行
创建表
- CREATE:创建新表
- CREATE TABLE Products(
- prod_id CHAR(10) NOT NULL,
- vend_id CHAR(10) NOT NULL,
- prod_name CHAR(254) NOT NULL,
- );
- ALERT:更新表
- 增加一列
- ALERT TABLE Vendors
- ADD vend_phone CHAR(20);
- DROP:删除表
- DROP TABLE CustCopy;
工具
- MySQL-Front:一款数据库管理工具
参考
Hive和Mysql的区别
https://blog.csdn.net/qq_39597203/article/details/89481867?
https://blog.csdn.net/qq_28652401/article/details/83509636?
partition
https://www.cnblogs.com/tfiremeteor/p/6296599.html
https://www.cnblogs.com/SmileIven/p/9133548.html
开窗函数
https://www.cnblogs.com/lihaoyang/p/6756956.html
SQL50题
https://www.cnblogs.com/imsoft/p/10182126.html
[DB] SQL 必知必会的更多相关文章
- 读书笔记--SQL必知必会--建立练习环境
书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL in 10 Minutes - Fourth Edition> MyS ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会12--联结表
12.1 联结 联结(join),利用SQL的SELECT在数据查询的执行中联结表. 12.1.1 关系表 关系数据库中,关系表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联 ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《SQL必知必会》学习笔记(一)
这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...
- SQL 必知必会
本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...
- 0005 《SQL必知必会》笔记01-SELECT语句
1.SELECT基本语句: SELECT 字段名1,···,字段名n FROM 表名 2.检索所有字段,用"*"替换字段名,这会导致效率低下 SELECT * FROM 表名; 3 ...
- 你必知必会的SQL面试题
写在前面的话 本文参考原博<走向面试之数据库基础:一.你必知必会的SQL语句练习-Part 1>和<走向面试之数据库基础:一.你必知必会的SQL语句练习-Part 2>进行练习 ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- 图灵程序设计丛书(SQL必知必会)笔记
SQL必知必会 第二课:检索数据 1.分页 (1).SQL Server 栗子 : select top 2 columns from tableName (2).Oracle 栗子 :select ...
随机推荐
- Springboot进行Http接口交互实现邮件告警
本项目采用idea编辑器,依赖maven环境,相关搭建请自行百度一.引入相关依赖 本文Http接口交互使用hutool工具类与阿里FastJson解析报文. <dependencies&g ...
- tasker支持的shell 命令大全
参考 http://www.notenoughtech.com/tasker/tasker-run-shell-commands/ 罗列所有系统配置项 settings list system s ...
- 梳理一下最近准备蓝桥杯时学习DP问题的想法
学习时间不长,记录的只是学习过程的思路和想法,不能保证正确,代码可以在acwing上AC. 01背包问题: 1.首先是简单的01背包问题 2.先确定状态,f[i][j]表示有第i件物品,时间为j的最大 ...
- 使用python制作大数据词云
1 from wordcloud import WordCloud 2 import PIL.Image as image 3 import numpy as np 4 import jieba 5 ...
- oo第四单元——UML图解析
本单元是在理解UML图的基础上实现对图的解析和检查.UML图是新接触的一种建模工具,一开始接触UML的时候觉得理解起来比较困难,并不能单纯从代码的角度按照类.方法这样来理解,这只是从类图的角度,还有从 ...
- Spring Boot 实现配置文件加解密原理
Spring Boot 配置文件加解密原理就这么简单 背景 接上文<失踪人口回归,mybatis-plus 3.3.2 发布>[1] ,提供了一个非常实用的功能 「数据安全保护」 功能,不 ...
- Github Pages+Gridea搭建个人博客
1 概述 Github Pages可以用来托管个人网站,静态的,便于用来实现博客,可以在一个仓库的settings中开启: Gridea是一个静态博客写作客户端,所有文件都在本地,没有数据库,实现简单 ...
- ISODateTimeFormat 转换2019-08-15T00:36:49.366456463Z 日期格式
import java.text.*; import java.text.SimpleDateFormat; import java.util.*; import org.joda.time.Date ...
- Puzzle UVA - 227 PE代码求大佬指点
A children's puzzle that was popular 30 years ago consisted of a 5×5 frame which contained 24 smal ...
- TLS Poison - When TLS Hack you
0x00 前言 本次学习的是2020 Blackhat 的一篇文章When TLS Hacks you,简单来说,作者提出了一种新的SSRF攻击思路:利用DNS重绑定和TLS协议的会话恢复进行攻击.具 ...