https://www.w3cschool.cn/mysql/
MySQL
开始:mysql -u root -p;
列出数据库管理系统的数据库列表:SHOW DATABASES;
使用mysqladmin 创建数据库:mysqladmin -u root -p create W3CSCHOOL;
选择数据库:use W3CSCHOOL;
在Mac终端导入.sql文件:http://www.cnblogs.com/zhengbin/p/4749938.html
"mysql -u root -p
create database name;
use name;
source 『将.sql文件直接拖拽至终端,自动补全其文件目录』
在Mac终端导出.sql文件:
"cd 『打开要将.sql文件生成的文件位置』
mysqldump -u root -p database_name>sql_name.sql"
创建数据表:
创建MySQL数据表需要以下信息:表名、表字段名、定义每个表字段
CREATE TABLE table_name (column_name column_type);
eg:CREATE TABLE w3cschool_tbl(
-> w3cschool_id INT NOT NULL AUTO_INCREMENT,
-> w3cschool_title VARCHAR(100) NOT NULL,
-> w3cschool_author VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( w3cschool_id )
-> );
注意:MySQL命令终止符为分号(;)
https://github.com/CyC2018/Interview-Notebook/blob/master/notes/SQL%20语法.md
http://www.w3school.com.cn/sql/index.asp
SQL
SQL语句不区分大小写,但是数据库表名、列名和值是否区分依赖于具体的DBMS 以及配置。
SQL DML 和DDL
可以把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 语法
注意如果有两个以上的表,select from前后列和表的顺序要对应,题目输出的列顺序也要对应
SELECT 列名称 FROM 表名称 #提取某一列
以及
SELECT * FROM 表名称 #提取所有列
SQL SELECT DISTINCT 语句
SELECT DISTINCT 列名称 FROM 表名称 #删去了重复值
Eg:
SELECT DISTINCT Company FROM Orders
WHERE子句
有条件地从表中选取数据
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
Eg:如果只希望选取居住在城市"Beijing" 中的人,我们需要向SELECT 语句添加WHERE 子句:
SELECT * FROM Persons WHERE City='Beijing'
下面的运算符可在WHERE 子句中使用:
= 等于
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
注释:在某些版本的SQL 中,操作符<> 可以写为!=。
AND和OR 运算符
使用AND 来显示所有姓为"Carter" 并且名为"Thomas" 的人:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
使用OR 来显示所有姓为"Carter" 或者名为"Thomas" 的人:
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
ORDER BY 语句
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用DESC 关键字。
Eg:
以字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
以逆字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
INSERT INTO 语句
向表格中插入新的行。
INSERT INTO 表名称 VALUES (值1, 值2,....)
Eg:
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
指定所要插入数据的列:
INSERT INTO表名称(列1, 列2,...) VALUES (值1, 值2,....)
Eg:
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
Update 语句
修改表中的数据。
UPDATE 表名称SET 列名称= 新值WHERE 列名称= 某值
Eg:更新某一行中的若干列。修改地址(address),并添加城市名称(city):
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'
DELETE语句
删除表中的行。
DELETE FROM 表名称 WHERE 列名称 = 值
删除所有行
DELETE FROM表名称
或者:
DELETE * FROM表名称
TOP & limit子句
TOP子句用于规定要返回的记录的数目。
注释:并非所有的数据库系统都支持TOP 子句。
SQL Server 的语法:
SELECT TOP number|percent 列名称(s) FROM 表名称
Eg:从"Persons" 表中选取头两条记录
SELECT TOP 2 * FROM Persons
MySQL 语法:用limit这个!limit放order后
LIMIT m,n : 表示从第m+1条开始,取n条数据;
LIMIT n :表示从第0条开始,取n条数据,是limit(0,n)的缩写。
SELECT column_name(s)
FROM table_name
LIMIT number
Eg:
SELECT *
FROM Persons
LIMIT 5
LIKE操作符
LIKE 操作符用于在WHERE 子句中搜索列中的指定模式。
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern
Eg:选取居住在以"N" 开始的城市里的人:
SELECT * FROM Persons
WHERE City LIKE 'N%'
注:"%"可用于定义通配符(模式中缺少的字母)。
包含N: ‘%N%’
SQL通配符
通配符可以替代一个或多个字符,必须与LIKE 运算符一起使用。
% 替代一个或多个字符
_ 仅替代一个字符
[字符] 字符列中的任何单一字符
[^字符] 或者[!字符] 不在字符列中的任何单一字符
IN操作符
允许在 WHERE 子句中规定多个值。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
还有not in,not exist
IN和EXISTS用法比较
IN:确定给定的值是否与子查询或列表中的值相匹配。
EXISTS:指定一个子查询,检测行的存在。存在则返回true,否则返回false。
EXISTS 的語法是:
SELECT "欄位1" FROM "表格1"
WHERE EXISTS (SELECT * FROM "表格2"WHERE "條件");
MySQL 目前還不支持EXISTS。
CASE when:SQL 用來作为IF-THEN-ELSE 之类逻辑的关键字
https://www.1keydata.com/tw/sql/sql-case.html
SELECT CASE ("栏位名")
WHEN "條件1" THEN "結果1"
WHEN "條件2" THEN "結果2"
...
[ELSE "結果N"]
END
FROM "表格名";
Eg:將'Los Angeles' 的Sales 數值乘以2,以及將'San Diego' 的Sales 數值乘以1.5,我們就鍵入以下的SQL:
SELECT Store_Name, CASE Store_Name
WHEN 'Los Angeles' THEN Sales * 2
WHEN 'San Diego' THEN Sales * 1.5
ELSE Sales
END
"New Sales",
Txn_Date
FROM Store_Information;
Eg: 转换:如性别在表中存的是数字1、2,但是希望查询出来男、女时,可以这样:
select (case Gender when 1 then '男' when 2 then '女' else '其他' end) as Gender from Table1
Eg: 将sum与case结合使用,可以实现分段统计。如果现在希望将上表中各种性别的人数进行统计,sql语句如下:https://www.cnblogs.com/Richardzhu/p/3571670.html
select
sum(case u.sex when 1 then 1 else 0 end) as 男性,
sum(case u.sex when 2 then 1 else 0 end) as女性,
sum(case when u.sex <>1 and u.sex<>2 then 1 else 0 end)as性别为空
from users u; #<>表示不等于,也可写为!=
男性 女性 性别为空
---------- ---------- ----------
3 2 0
BETWEEN操作符
操作符BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2 #包括value1不包括value2
SQL AS:为列名称和表名称指定别名(Alias)
表的SQL Alias 语法
SELECT column_name(s)
FROM table_name
AS alias_name #可省略as但强烈建议写上
列的SQL Alias 语法
SELECT column_name AS alias_name
FROM table_name
Eg: 表的as:
假设我们有两个表分别是:"Persons" 和"Product_Orders"。我们分别为它们指定别名"p" 和"po"。现在,我们希望列出"John Adams" 的所有定单。我们可以使用下面的SELECT 语句:
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
Eg: 列的as
SELECT LastName AS Family, FirstName AS Name
FROM Persons
SQL join:
根据两个或多个表中的列之间的关系,从两个或更多的表中获取结果.
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
Eg:引用两个表,从两个表中获取数据:谁订购了产品,并且他们订购了什么产品?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo #注意不同表的列名用’表*.列名’区分
FROM Persons #表1
INNER JOIN Orders #表2
ON Persons.Id_P = Orders.Id_P #主键(Primary Key)
ORDER BY Persons.LastName #列名,由某一列排序
下面列出了您可以使用的JOIN 类型,以及它们之间的差异。
- INNER JOIN: 如果表中全部匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
INNER JOIN 两边表同时有对应的数据,即任何一边缺失数据就不显示。
LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据。
在使用left jion时,on和where条件的区别如下:
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
inner join on 比直接where的查询效率要高
inner join on 后面的条件已经把结果过滤了一遍,而where 则是把限制条件放到最后,执行最后一次查询前结果里值变多了,查询起来变慢了,效率自然变低了。
然而,对于一般的内联接来说,就是没用例如上面的b.state=1这类的多一层限制,它和where的效率是一样的。而且where在写法上简单,因此对单表的查询一般都用where即可。
https://my.oschina.net/jun24bryant/blog/787375
SQL UNION 操作符
UNION 操作符用于合并两个或多个SELECT 语句的结果集。
请注意,UNION 内部的SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT 语句中的列的顺序必须相同。
SQL UNION 语法:删去重复值
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
SQL UNION ALL 语法:返回所有值,保留重复值
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于UNION 中第一个SELECT 语句中的列名。
SELECT INTO 语句
从一个表中选取数据,然后把数据插入另一个表中。
常用于创建表的备份复件或者用于对记录进行存档。
SQL SELECT INTO 语法
您可以把所有的列插入新表:
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
或者只把希望的列插入新表:
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
CREATE DATABASE 语句
创建数据库。
CREATE DATABASE database_name
CREATE TABLE 语句
创建数据库中的表。
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
eg:本例演示如何创建名为"Person" 的表。该表包含5 个列,列名分别是:"Id_P"、"LastName"、"FirstName"、"Address" 以及"City":
CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
SQL约束
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过CREATE TABLE 语句),或者在表创建之后也可以(通过ALTER TABLE 语句)。
我们将主要探讨以下几种约束:
· NOT NULL:强制字段始终包含值
· UNIQUE、PRIMARY KEY主健:UNIQUE 和PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。PRIMARY KEY 拥有自动定义的UNIQUE 约束。每个表可以有多个UNIQUE 约束,但是每个表只能有一个PRIMARY KEY 约束。
· FOREIGN KEY外健:用于预防破坏表之间连接的动作。也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
· CHECK:用于限制列中的值的范围。如果对单个列定义CHECK 约束,那么该列只允许特定的值。如果对一个表定义CHECK 约束,那么此约束会在特定的列中对值进行限制。
· DEFAULT:用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。
索引index
您可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
SQL CREATE INDEX 语法
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name)
注释:"column_name"规定需要索引的列。
DROP
删除索引、表和数据库。
ALTER TABLE 语句
在已有的表中添加、修改或删除列。
Auto-increment
新记录插入表中时生成一个唯一的数字
SQL CREATE VIEW 语句
什么是视图?
在SQL 中,视图是基于SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及JOIN语句,我们也可以提交数据,就像这些来自于某个单一的表。
注释:数据库的设计和结构不会受到视图中的函数、where 或join 语句的影响。
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用SQL 语句来重建数据。
SQL日期
MySQL 中最重要的内建日期函数:
| 函数 | 描述 |
| 返回当前的日期和时间 | |
| 返回当前的日期 | |
| 返回当前的时间 | |
| 提取日期或日期/时间表达式的日期部分 | |
| 返回日期/时间按的单独部分 | |
| 给日期添加指定的时间间隔 | |
| 从日期减去指定的时间间隔 | |
| 返回两个日期之间的天数 | |
| 用不同的格式显示日期/时间 |
SQL Server 中最重要的内建日期函数:
| 函数 | 描述 |
| 返回当前日期和时间 | |
| 返回日期/时间的单独部分 | |
| 在日期中添加或减去指定的时间间隔 | |
| 返回两个日期之间的时间 | |
| 用不同的格式显示日期/时间 |
SQL Date 数据类型
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式YYYY-MM-DD
- DATETIME - 格式: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
- YEAR - 格式YYYY 或YY
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式YYYY-MM-DD
- DATETIME - 格式: YYYY-MM-DD HH:MM:SS
- SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式: 唯一的数字
SQL函数
内建SQL 函数的语法是:
SELECT function(列) FROM 表
函数的类型
在SQL 中,基本的函数类型和种类有若干种。函数的基本类型是:
- Aggregate 函数
- Scalar 函数
合计函数(Aggregate functions)
Aggregate 函数的操作面向一系列的值,并返回一个单一的值。
注释:如果在SELECT 语句的项目列表中的众多其它表达式中使用SELECT 语句,则这个SELECT 必须使用GROUP BY 语句!
MS Access 中的合计函数
| 函数 | 描述 |
| 返回某列的平均值 | |
| 返回某列的行数(不包括 NULL 值) | |
| 返回被选行数 | |
| FIRST(column) | 返回在指定的域中第一个记录的值 |
| LAST(column) | 返回在指定的域中最后一个记录的值 |
| 返回某列的最高值 | |
| 返回某列的最低值 | |
| STDEV(column) |
|
| STDEVP(column) |
|
| 返回某列的总和 | |
| VAR(column) |
|
| VARP(column) |
|
在SQL Server 中的合计函数
| 函数 | 描述 |
| 返回某列的平均值 | |
| BINARY_CHECKSUM |
|
| CHECKSUM |
|
| CHECKSUM_AGG |
|
| 返回某列的行数(不包括NULL值) | |
| 返回被选行数 | |
| 返回相异结果的数目 | |
| 返回在指定的域中第一个记录的值(SQLServer2000 不支持) | |
| 返回在指定的域中最后一个记录的值(SQLServer2000 不支持) | |
| 返回某列的最高值 | |
| 返回某列的最低值 | |
| STDEV(column) |
|
| STDEVP(column) |
|
| 返回某列的总和 | |
| VAR(column) |
|
| VARP(column) |
|
Scalar函数
Scalar 函数的操作面向某个单一的值,并返回基于输入值的一个单一的值。
MS Access 中的Scalar 函数
| 函数 | 描述 |
| UCASE(c) | 将某个域转换为大写 |
| LCASE(c) | 将某个域转换为小写 |
| MID(c,start[,end]) | 从某个文本域提取字符 |
| LEN(c) | 返回某个文本域的长度 |
| INSTR(c,char) | 返回在某个文本域中指定字符的数值位置 |
| LEFT(c,number_of_char) | 返回某个被请求的文本域的左侧部分 |
| RIGHT(c,number_of_char) | 返回某个被请求的文本域的右侧部分 |
| ROUND(c,decimals) | 对某个数值域进行指定小数位数的四舍五入 |
| MOD(x,y) | 返回除法操作的余数 |
| NOW() | 返回当前的系统日期 |
| FORMAT(c,format) | 改变某个域的显示方式 |
| DATEDIFF(d,date1,date2) | 用于执行日期计算 |
SUM()函数
SUM 函数返回数值列的总数(总额),返回的是一个数。
Eg: 查找"OrderPrice" 字段的总数。
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders
结果集类似这样:
| OrderTotal |
| 5700 |
GROUP BY 语句
http://www.w3school.com.cn/sql/sql_groupby.asp
用于结合合计sum函数,根据一个或多个列对结果集进行分组。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
Eg:查找每个客户的总金额(总订单)。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer #group by删去了Customer列中的重复值
也可以对一个以上的列应用GROUP BY 语句,就像这样:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate
HAVING子句
在SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数group by一起使用。
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。
HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
Eg:查找订单总金额少于2000 的客户。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
Eg:查找客户"Bush" 或"Adams" 拥有超过1500 的订单总金额。
在SQL 语句中增加了一个普通的WHERE 子句:
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
https://blog.youkuaiyun.com/autofei/article/details/5634359
如何判断mysql中数据表中两个列之间的相同记录和不同记录
两个列的交集,采用union all(组合包含重复值)和group by:
SELECT name
FROM
(SELECT firstname as name FROM table1
union all
SELECT username as name FROM table2) #组合两个表,包含重复值
as alltable
group by name having count(*) > 1;#提取组合表中重复值大于1的name
两个列的交集的补集:
SELECT name
FROM (SELECT firstname as name FROM table1 union all SELECT username as name FROM table2) as alltable
group by name having count(*) = 1; #提取组合表中无重复值的name
第一个列和第二个列的差集:
SELECT * FROM table1 #找第一个表中不在交集中的部分
WHERE firstname not in
(SELECT name
FROM (SELECT firstname as name FROM table1 union all SELECT username as name FROM table2) as alltable
group by name having count(*) > 1) #交集
类似的可以求第二个列和第一个列的差集。如果一个集合是另一个集合的子集,情况会简单一点。如果希望去除重复的记录,使用union
SQL快速参考
| 语句 | 语法 |
| AND / OR | SELECT column_name(s) |
| ALTER TABLE (add column) | ALTER TABLE table_name |
| ALTER TABLE (drop column) | ALTER TABLE table_name |
| AS (alias for column) | SELECT column_name AS column_alias |
| AS (alias for table) | SELECT column_name |
| BETWEEN | SELECT column_name(s) |
| CREATE DATABASE | CREATE DATABASE database_name |
| CREATE INDEX | CREATE INDEX index_name |
| CREATE TABLE | CREATE TABLE table_name |
| CREATE UNIQUE INDEX | CREATE UNIQUE INDEX index_name |
| CREATE VIEW | CREATE VIEW view_name AS |
| DELETE FROM | DELETE FROM table_name or DELETE FROM table_name |
| DROP DATABASE | DROP DATABASE database_name |
| DROP INDEX | DROP INDEX table_name.index_name |
| DROP TABLE | DROP TABLE table_name |
| GROUP BY | SELECT column_name1,SUM(column_name2) |
| HAVING | SELECT column_name1,SUM(column_name2) |
| IN | SELECT column_name(s) |
| INSERT INTO | INSERT INTO table_name or INSERT INTO table_name |
| LIKE | SELECT column_name(s) |
| ORDER BY | SELECT column_name(s) |
| SELECT | SELECT column_name(s) |
| SELECT * | SELECT * |
| SELECT DISTINCT | SELECT DISTINCT column_name(s) |
| SELECT INTO | SELECT * or SELECT column_name(s) |
| TRUNCATE TABLE | TRUNCATE TABLE table_name |
| UPDATE | UPDATE table_name |
| WHERE | SELECT column_name(s) |
https://www.jianshu.com/p/bb19b6b0fdc3
SQL Select语句完整的执行顺序:
- from子句组装来自不同数据源的数据;
- where子句基于指定的条件对记录行进行筛选;
- group by子句将数据划分为多个分组;对应select的列不能别名
- 使用聚集函数进行计算;
- 使用having子句筛选分组;
- 计算所有的表达式;
- select 的字段;
- 使用order by对结果集进行排序。对应Select的列都要别名才能用
SQL查询处理的步骤序号(按照写语句的顺序):
(8)SELECT (9)DISTINCT (11)<TOP_specification> <select_list>
(1)FROM <left_table>
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH {CUBE | ROLLUP}
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
SQL Server 中的四種排序函數比较
Row_Number(): 不可並列,排序序號連續(可支持不排序,只加一個行號,這對分頁查詢很有作用)
Rank(): 可並列,排序序號不連續
Dense_Rank(): 可並列,排序序號連續
nTitle(N): 先排序,再將結果分為N組
eg:
- select
- SNO,AGE,SEX,
- row_number() over(order by age) [row_number],
- Rank() over(order by age) [Rank],
- dense_rank() over(order by age) [dense_rank],
- ntile(5) over(order by age) [ntile]
- from S
https://blog.youkuaiyun.com/helloword4217/article/details/11715187
这篇博客详细介绍了SQL的各种操作,包括SELECT DISTINCT、WHERE子句、JOIN操作、聚合函数等,还涵盖了数据的插入、更新和删除。文章通过实例解释了SQL语句的执行顺序,帮助读者理解SQL在数据库管理中的应用。
292

被折叠的 条评论
为什么被折叠?



