详情: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 连接表
- 自然连接:自然联结要求你只能选择那些唯一的列,一般通过对一个表使用通配符(SELECT *),而对其他表的列使用明确的子集来完成。
- SELECT C.*, O.order_num, O.order_date,OI.prod_id, OI.quantity, OI.item_priceFROM Customers AS C, Orders AS O, OrderItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'RGAN01';
- INNER JOIN :如果表中至少一个匹配,则返回行
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
- LEFT JOIN : 即使右表中没有匹配,也可从左表返回所有的行
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
- RIGHT JOIN: 即使左表中没有匹配,也可从右表中返回所有的行
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
- FULL JOIN:只要其中一个表中存在匹配,就返回所有的行
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
- UNION
- UNION 操作符用于合并两个或多个SELECT语句的结果集
- UNION 内部的SELECT语句必须拥有相同数量的列。列也必须拥有相类似的数据类型,同时SELECT 语句中的列的顺序必须相同
- 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
- UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。