# sql
###### tags:`PHP`
### SELECT - 顯示数据
从数据库中选取数据
```
SELECT column_name,column_name
FROM table_name;
SELECT * FROM table_name;
```
### SELECT DISTINCT - 顯示数据不重複的"值"
```
SELECT DISTINCT column_name,column_name
FROM table_name;
```
### SELECT TOP, LIMIT, ROWNUM顯示数据選取範圍
SELECT TOP 50 PERCENT * FROM Websites;
选取前面百分之 50 的记录
SELECT * FROM Websites LIMIT 2;选取头两条记录
select top 5 * from table--前5行
select top 5 * from table order by id desc --后5行
==desc 表示降序排列 asc 表示升序==
---
### INSERT INTO - 新增数据
INSERT INTO Websites (name, url, alexa, country)
VALUES ('百度','https://www.baidu.com/','4','CN');
### UPDATE - 更新数据
UPDATE Websites
SET alexa='5000', country='USA'
WHERE name='菜鸟教程';
把 "菜鸟教程" 的 alexa 排名更新为 5000,country 改为 USA
如果我们==省略了 WHERE 子句,会将 Websites 表中所有数据的 alexa 改为 5000,country 改为 USA==。执行没有 WHERE 子句的 UPDATE 要慎重,再慎重。
### DELETE - 删除数据
DELETE FROM table_name
WHERE some_column=some_value;
如果您==省略了 WHERE 子句,所有的记录都将被删除==!
---
insert into select 和select into from 的区别???
insert into scorebak select * from socre where neza='neza' --插入一行,要求表scorebak 必须存在
select * into scorebak from score where neza='neza' --也是插入一行,要求表scorebak 不存在
### SELECT INTO - 从一个表复制数据,然后把数据插入到另一个新表中
### INSERT INTO SELECT - 从一个表复制数据,然后把数据插入到一个已存在的表中
---
### CREATE DATABASE - 创建新数据库
CREATE DATABASE my_db;创建一个名为 "my_db" 的数据库
### ALTER DATABASE - 修改数据库
### DROP DATABASE - 修改数据库
DROP DATABASE database_name
---
### CREATE TABLE - 创建新表
CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
column_name1表中列的名称
data_type数据类型(例如 varchar、integer、decimal、date 等等)
size列的最大长度
### ALTER TABLE - 变更(改变)数据库表
### DROP TABLE - 删除表
DROP TABLE table_name
---
### CREATE INDEX - 创建索引(搜索键)
### DROP INDEX - 删除索引
ALTER TABLE table_name DROP INDEX index_name
---
### WHERE - 篩選條件
```
SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;
```
* 等于
Select * from emp where empno=7900;
* And:與 同时满足两个条件
Select * from emp where sal > 2000 and sal < 3000;
* Or:或 满足其中一个条件
Select * from emp where sal > 2000 or comm > 500;
* Not:非 满足不包含该条件的值
select * from emp where not sal > 1500;
逻辑运算的优先级:() not and or
* 空值判断: is null
Select * from emp where comm is null;
* between and (在 之间的值)
Select * from emp where sal between 1500 and 3000;
* In允许您在 WHERE 子句中规定多个值
Select * from emp where sal in (5000,3000,1500);
* ==like模糊查询在 WHERE 子句中搜索==
% 表示多个字值,_ 下划线表示一个字符;
'%a' //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
'_a_' //三位且中间字母是a的
'_a' //两位且结尾字母是a的
'a_' //两位且开头字母是a的
'%M_' //表示查询以M在倒数第二位的所有内容
SELECT * FROM Websites
WHERE name LIKE 'G%';
选取 name 以字母 "G" 开始的所有客户
SELECT * FROM Websites
WHERE name LIKE '%k';
选取 name 以字母 "k" 结尾的所有客户
SELECT * FROM Websites
WHERE name LIKE '%oo%';
选取 name 包含模式 "oo" 的所有客户
SELECT * FROM Websites
WHERE name NOT LIKE '%oo%';
选取 name 不包含模式 "oo" 的所有客户
* 通配符
[charlist] 字符列中的任何单一字符
[^charlist]或者[!charlist] 不在字符列中的任何单一字符
LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
LIKE'[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。
LIKE'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';
name 以 "G"、"F" 或 "s" 开始的所有网站
SELECT * FROM Websites
WHERE name REGEXP '^[A-H]'
选取 name 以 A 到 H 字母开头的网站
SELECT * FROM Websites
WHERE name REGEXP '^[^A-H]';
选取 name 不以 A 到 H 字母开头的网站
* ORDER BY 进行排序
==desc降序== 或者 ==asc升序(默认)== 只对它紧跟着的第一个列名有效
ORDER BY 排列时,不写明ASC DESC的时候,默认是ASC
order by A,B 这个时候都是默认按升序排列
order by A desc,B 这个时候 A 降序,B 升序排列
order by A ,B desc 这个时候 A 升序,B 降序排列
* ==LIMIT 和 OFFSET 分页==
select* from article LIMIT 3
当 LIMIT 后面跟一个参数的时候,该参数表示==要取的数据的数量==
当 LIMIT 后面跟两个参数的时候,第一个数表示==要跳过的数量==,后一位表示==要取的数量==
select* from article LIMIT 1,3
LIMIT 1,3 就是跳过 1 条数据,从第 2 条数据开始取,取 3 条数据,也就是取 2、3、4 三条数据。
当 LIMIT 和 OFFSET 组合使用的时候,LIMIT 后面只能有一个参数,表示==要取的的数量==,OFFSET表示==要跳过的数量==
select * from article LIMIT 3 OFFSET 1
表示跳过 1 条数据,从第 2 条数据开始取,取3条数据,也就是取 2、3、4 三条数据。
---
## JOIN把来自两个或多个表的行结合起来

A inner join B 取交集。
A left join B 取 A 全部,B 没有对应的值为 null。
A right join B 取 B 全部 A 没有对应的值为 null。
A full outer join B 取并集,彼此没有对应的值为 null。
### INNER JOIN 表中存在至少一个匹配时返回行
如果表中有至少一个匹配,则返回行

SELECT column_name(s)
FROM table1
(INNER JOIN/JOIN) table2
ON table1.column_name=table2.column_name;
範例
SELECT Websites.name, access_log.count, access_log.date(顯示的表格)
FROM Websites(資料表)
INNER JOIN access_log(資料表)
ON Websites.id=access_log.site_id(重複的地方)
ORDER BY access_log.count;(照順序排列)
### LEFT JOIN即使右表中没有匹配,也从左表返回所有的行

SELECT column_name(s)
FROM table1
(LEFT JOIN/LEFT OUTER JOIN) table2
ON table1.column_name=table2.column_name;
### RIGHT JOIN即使左表中没有匹配,也从右表返回所有的行
SELECT column_name(s)
FROM table1
(RIGHT JOIN/RIGHT OUTER JOIN) table2
ON table1.column_name=table2.column_name;

### FULL JOIN:只要其中一个表中存在匹配,则返回行
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

### OUTER JOIN
---
SQL JOIN 中 on 与 where 的区别
1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
---
### UNION合并两个或多个 SELECT 语句的结果集
UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table1
(UNION每个国家只会列出一次/UNION ALL列出所有重複的國家)
SELECT column_name(s) FROM table2;
---
在 SQL 中,我们有如下约束:
### NOT NULL - 指示某列不能存储 NULL 值。
### UNIQUE - 保证某列的每行必须有唯一的值。
### PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
### FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
### CHECK - 保证列中的值符合指定的条件。
### DEFAULT - 规定没有给列赋值时的默认值。
CREATE INDEX 创建索引
DROP INDEX删除表中的索引
ALTER TABLE 在已有的表中添加、删除或修改列
---
Aggregate 函数:
AVG() - 返回平均值
COUNT() - 返回行数
FIRST() - 返回第一个记录的值
LAST() - 返回最后一个记录的值
MAX() - 返回最大值
MIN() - 返回最小值
SUM() - 返回总和
---
Scalar 函数:
UCASE() - 将某个字段转换为大写
LCASE() - 将某个字段转换为小写
MID() - 从某个文本字段提取字符,MySql 中使用
SubString(字段,1,end) - 从某个文本字段提取字符
LEN() - 返回某个文本字段的长度
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
NOW() - 返回当前的系统日期和时间
FORMAT() - 格式化某个字段的显示方式
[SQL教程](https://www.runoob.com/sql/sql-tutorial.html)
新增
INSERT INTO article (article_name, added_by, upload_date, content, category, photos) VALUES (?,?,?,?,?,?)";
修改
UPDATE article SET article_name=?, added_by=?, upload_date=?, content=?, category=? WHERE id=?
刪除
$sql="DELETE FROM article WHERE id=?";//hard delete
$sql="UPDATE article SET valid=0 WHERE id=?";//soft delete