SQL

详情:https://mubu.com/doc/BUafRgbzo0

SQL简介

  • SQL是结构化的查询语言,用来访问和操作数据库系统。

  • 一个数据库通常包含一个或多个表。每个表由一个名字标识(例如“客户”或者“订单”)。表包含带有数据的记录(行)。

  • 数据库:可以将数据库想象为一个文件柜。这个文件柜是一个存放数据的物理位置;保存有组织的数据的容器。

  • 表格:文件柜中创建文件,然后将相关的资料放入特定的文件中。表是一种结构化的文件,是特定类型数据的结构化清单。

  • 列:表中一个字段。所有表都是由一个或多个列组成。每个列都有对应的数据类型。

  • 行:表中的一个记录;表中的数据是按行存储的,所保存的每个记录存储在自己的行内。

  • 主键:一列,其值能够唯一标识表中的每一行。

SQL能做什么?

  • SQL 面向数据库执行查询

  • SQL 可从数据库取回数据

  • SQL 可在数据库中插入新的记录

  • SQL 可更新数据库的数据

  • SQL 可从数据库中删除记录

  • SQL 可创建新数据库

  • SQL 可在数据库中创建新的表

  • SQL 可在数据库中创建存储过程

  • SQL 可在数据库中创建视图

  • SQL可以设置表、存储过程和视图的

SQL 语句

  • SQL 对大小写不敏感!

  • 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。

  • SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。

  • 查询和更新指令构成了 SQL 的 DML 部分:

    • SELECT - 从数据库表中获取数据

    • UPDATE - 更新数据库表中的数据

    • DELETE - 从数据库表中删除数据

    • INSERT INTO - 向数据库表中插入数据

    • SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。

  • SQL 中最重要的 DDL 语句:

    • CREATE DATABASE - 创建新数据库

    • ALTER DATABASE - 修改数据库

    • CREATE TABLE - 创建新表

    • ALTER TABLE - 变更(改变)数据库表

    • DROP TABLE - 删除表

    • CREATE INDEX - 创建索引(搜索键)

    • DROP INDEX - 删除索引

SQL SELECT (*、distinct,limit,top)

  • SELECT 语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。

  • 检查单列或多列:SELECT 列名称 FROM 表名称。

    • select prod_name from products;

    • select prod_id,prod_name,prod_price from products;

  • 检查所有列:SELECT * FROM 表名称;星号(*)是选取所有列的快捷方式。

    • select * from products;

  • 一般表格如果存在重复值,希望仅仅列出不同(distinct)的值,关键词DISTINCT用于返回唯一不同的值

    • SELECT DISTINCT 列名称 FROM 表名称

    • select distinct vend_id from products;

    • SELECT DISTINCT Company FROM Orders ;

  • TOP 子句用于规定要返回的记录的数目(TOP ,LIMIT,OFFSET)

    • SQL SEVER 语法:SELECT TOP number|percent column_name(s) FROM table_name

    • MYSQL 语法:SELECT * FROM Persons LIMIT 5;

      • select prod_name from products limit 5 offset 5;
      • 第一个被检索的行是第0行,而不是第1行。因此,LIMIT 1 OFFSET 1会检索第2行,而不是第1行。  

SQL 筛选(where)

  • 在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤  
  • 语法:SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
  • 运算符:等于(=),不等于(<>;!=),在某个范围内(between)
  • AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。
    • 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
    • 如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
    • 在组合使用时,and 的级别要比or 的级别高,需要用圆括号把OR与and使用。

SQL 通配符(like,_,[],^,%)

  • LIKE 可以理解为一种模糊查找,结合通配符使用
  • % 表示任何字符出现的任意次数(一个或多个字符)。
    • 为了找出所有以词fish起头的产品:(select prod_id,prod_price,prod_name  from products where prod_name like 'Fish%';)
    • 为了找出包含bean bag 的 词:(select prod_id,prod_price,prod_name  from products where prod_name like '%bean bag%';)
  • - 仅替代一个字符
    • 我们希望从上面的 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人。(SELECT * FROM Persons WHERE FirstName LIKE '_eorge')
  • [] 用来指定一个字符集
    • 我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:(SELECT * FROM Persons WHERE City LIKE '[ALN]%')
    • 现在,我们希望从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人:(SELECT * FROM Persons WHERE City LIKE '[!ALN]%')
  • ^ 不在字符列中的任何单一字符
    • 查询匹配不以J或M起头的任意联系人:(select cust_contact from customers where cust_contact like '[^JM]%' order by cust_contact;)

SQL 操作符(in not between)

  • IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。  (SELECT * FROM Persons WHERE LastName IN ('Adams','Carter';))
  • 否定其后所跟的任何条件。因为NOT从不单独使用(它总是与其他操作符一起使用)NOT关键字可以用在要过滤的列前,而不仅是在其后。  (select cust_contact from customers where  not cust_contact like '[JM]%' order by cust_contact;)
  • BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围。

SQL 数据分组(group by)

  • 合计函数常常需要添加 group by 语句 (count ,sum,max,min)
  • group by 子句列出的每一列必须是检索列或有效表达式(但不能是聚集函数)
  • group by 语句一般出现在where 子句之后,order by 语句之前
  • 分组的过滤条件 having: 在数据分组后进行过滤
    • 列出具有两个以上产品且其价格大于等于4的供应商
    • select vend_id,count(*) as num_prods from products where prod_price >=4 group by vend_id having count(*) >=2;

SQL 排序(order by)

  • order by 语句用于对结果集进行排序;默认按照升序进行排序(asc)
  • 进行降序排序,需要用关键字(DESC)
  • ORDER BY 子句是select 语句中的最后一条子句。
  • 升序:select prod_name from products order by prod_name;
  • 降序:select prod_id,prod_price,prod_name  from products order by prod_price desc;
  • 按列进行分次排序:select prod_id,prod_price,prod_name from products order by prod_price,prod_name;
  • 按照需求进行排序:select prod_id,prod_price,prod_name  from products order by prod_price desc,prod_name;

SQL 函数

  • SQL 合计函数(Aggregate):函数的操作面向一系列的值,并返回一个单一的值。
  • SQL AVG()
    • 找到orderprice 值高于orderprice 平均值的客户 :SELECT Customer FROM Orders WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
  • SQL COUNT()
    • 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。(SELECT COUNT(*) AS NumberOfOrders FROM Orders)
    • 使用COUNT(column) 对特定列中具有值的行进行计数,忽略NULL值。(SELECT COUNT(Customer) AS CustomerNilsen FROM Orders WHERE Customer='Carter')
    • 使用COUNT( DISTINCT COLUMN) 返回指定列的不同值的数目。(SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders)
  • SQL FIRST()
    • FIRST() 函数 返回指定的字段的第一个记录的值(可使用ORDER BY 语句对记录进行排序)
    • SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders;
  • SQL LAST()
    • LAST()函数返回指定的字段中最后一个记录的值。
    • SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders
  • SQL MAX()
    • MAX函数返回一列中最大的值。NULL值不包括在计算中
    • select max(prod_price) as max_price from products;
  • SQL MIN()
    • MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
    • select min(prod_price) as min_price from products;
  • SQL SUM()
    • 函数SUM()返回订单中所有物品价钱之和,WHERE子句同样保证只统计某个物品订单中的物品。  
    • select sum(quantity) as sum_quantity from orderitems;
    • select sum(quantity) as sum_quantity from orderitems where order_num = 20005;
  • Scalar 函数:函数的操作面向某个单一的值,并返回基于输入值的一个单一的值。
  • SQL CONCAT()
    • 拼接字段函数:concat(separator,str1,str2,...) 代表 concat with separator ,是concat()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
    • select  concat(vend_name,' (',vend_country,')') as vend_title from vendors order by vend_Name;
    • SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'FROM VendorsORDER BY vend_name;  
  • SQL TRIM()
    • RTRIM()(去掉字符串右边的空格)、LTRIM()(去掉字符串左边的空格)以及TRIM()(去掉字符串左右两边的空格)。  
    • SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'AS vend_titleFROM VendorsORDER BY vend_name;  
  • SQL LEFT()
    • SELECT LEFT(column_name,[,length]) FROM table_name
  • SQL LENGTH()
    • SELECT LEN(column_name) FROM table_name
  • SQL MID()
    • SELECT LEFT(column_name,[,length]) FROM table_name
  • SQL RIGTH()
    • SELECT RIGTH(column_name,LENGTH) FROM table_name
  • SQL UPEER/UCASE()
    • 函数把字段的值转换为大写。
    • SELECT UCASE(column_name) FROM table_name
  • SQL LOWER/LCASE()
    •  函数把字段的值转换为小写。
    • SELECT LCASE(column_name) FROM table_name
  • SQL SOUNDEX()
    • 使用SOUNDEX()函数进行搜索,它匹配所有发音类似于Michael Green的联系名:  
    • SELECT cust_name, cust_contact FROM CustomersWHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
  • SQL YEAR/MONTH/DAY()
    • 从使用名为year()函数从日期中提取年份
    • SELECT order_numFROM OrdersWHERE YEAR(order_date) = 2012;  
  • SQL ROUND()
    • ROUND 函数用于把数值字段舍入为指定的小数位数。
    • SELECT ROUND(column_name,decimals) FROM table_name
  • SQL NOW/GETDATE()
    • NOW函数返回当前的日期和时间
    • SELECT NOW() FROM table_name
  • SQL FORMAT()
    • FORMAT()函数用于对字段的显示进行格式化
    • SELECT FORMAT(column_name,format) FROM table_name
    • SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate FROM Products
  • SQL MOD(x,y)
    • 返回除法操作的余数
  • SQL DATEDIFF(d,date1,date2)
    • 用于执行日期计算

SQL 子查询

  • 每个步骤都可以单独作为一个查询来执行。可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句。  
  • SELECT cust_name, cust_contactFROM CustomersWHERE cust_id IN (SELECT cust_idFROM OrderWHERE order_num IN (SELECT order_numFROM OrderItemsWHERE prod_id = 'RGAN01'));  
  • SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
  • SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
  • SELECT * INTO NEW_TABLE_NAME FROM OLD_TABLENAME
  • SELECT COLUMN_NAME(S) INTO NEW_TABLE_NAME FROM OLD_TABLE
  • SELECT COLUMN_NAME(S) INTO NEW_TABLE_NAME FROM OLD_TABLE INNER JOIN OLD_TABLE2 ON OLD_TABLE_ID = OLD_TABLE2_ID
  • SELECT LastName,Firstname INTO Persons_backup FROM Persons WHERE City='Beijing'

SQL AIias (别名)

  • 表的 SQL Alias 语法:SELECT column_name(s) FROM table_name AS alias_name
  • 列的 SQL AIias 语法:SELECT column_name AS alias_name FROM table_name
  • SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'

SQL 连接表

    • UNION 操作符用于合并两个或多个SELECT语句的结果集
    • UNION 内部的SELECT语句必须拥有相同数量的列。列也必须拥有相类似的数据类型,同时SELECT 语句中的列的顺序必须相同
    • 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
    • UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

SQL 创建高级联结

SQL 组合查询

SQL 数据的插入

SQL 更新和删除数据

SQL 创建和更改表

SQL 创建视图

SQL 存储过程

SQL 事务管理

SQL 游标

SQL 约束

SQL 索引

SQL 快速参考

SQL 教程总结

原文地址:https://www.cnblogs.com/wangchenghua/p/11857797.html