---
# System prepended metadata

title: sql
tags: [PHP]

---

# 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把来自两个或多个表的行结合起来
![](https://i.imgur.com/WgdLFRJ.png)
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 表中存在至少一个匹配时返回行
如果表中有至少一个匹配，则返回行
![](https://i.imgur.com/laQJGB7.png)
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即使右表中没有匹配，也从左表返回所有的行
![](https://i.imgur.com/U6fRwkl.png)
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;
![](https://i.imgur.com/M7FdrWF.png)
### FULL JOIN：只要其中一个表中存在匹配，则返回行
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
![](https://i.imgur.com/MlxDHnv.png)




### 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


