# 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