本文用于记录酸菜鱼博主的知识盲区,如要学习全面的SQL教程,请前往菜鸟教程学习,谢谢大家。

1.INSERT INTO 语句可以有两种编写形式。
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:

INSERT INTO table_name
VALUES (value1,value2,value3,...);

第二种形式需要指定列名及被插入的值:

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

2.insert into select 和select into from 的区别

-- 插入一行,要求表scorebak存在
insert into scorebak select score where neza = 'neza';
-- 也是插入一行,要求表scorebak 不存在,相当于复制score表到scorebak
select * into scorebak from score where neza = 'neza';

3.执行update语句如果没有加where条件则会更新表中所有数据,所以要慎重!
在 MySQL 中可以通过设置 sql_safe_updates 这个自带的参数来解决,当该参数开启的情况下,你必须在update 语句后携带 where 条件,否则就会报错。

set sql_safe_updates=1; --  表示开启该参数

4.SQL SELECT TOP 子句
SELECT TOP 子句用于规定要返回的记录的数目。
SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。

注意:并非所有的数据库系统都支持 SELECT TOP 语句。 MySQL 支持 LIMIT 语句来选取指定的条数数据,Oracle 可以使用 ROWNUM 来选取。

SQL Server / MS Access 语法

SELECT TOP number|percent column_name(s)
FROM table_name;

MySQL 语法

SELECT column_name(s)
FROM table_name
LIMIT number;

Oracle 语法

SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;

5.LIKE 操作符

SELECT * FROM Websites WHERE name LIKE '%oo%'; 
SELECT * FROM Websites
WHERE name NOT LIKE '%oo%'; 

说明:"%" 符号用于在模式的前后定义通配符(默认字母)。
6.通配符
通配符可用于替代字符串中的任何其他字符。

SQL 中,可使用以下通配符:
% 	替代 0 个或多个字符
_ 	替代一个字符
[charlist] 	字符列中的任何单一字符
[^charlist][!charlist] 不在字符列中的任何单一字符

7.使用 SQL [charlist] 通配符
MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。

-- 选取 name 以 "G"、"F" 或 "s" 开始的所有网站:
SELECT * FROM Websites WHERE name REGEXP '^[GFs]'; 
-- 选取 name 以 A 到 H 字母开头的网站:
SELECT * FROM Websites WHERE name REGEXP '^[A-H]'; 
-- 选取 name 不以 A 到 H 字母开头的网站:
SELECT * FROM Websites WHERE name REGEXP '^[^A-H]'; 

8.IN 与 = 的异同

  • 相同点:均在WHERE中使用作为筛选条件之一、均是等于的含义
  • 不同点:IN可以规定多个值,等于规定一个值
  • 转换:IN的多个值可以用=和or连接来代替。

9.between and 或 not between and 不仅可以用于比较数字,也可以用于比较字符串,对于字符串的比较,一定是从首字母开始比较,相当于比较ASCII码。

-- 选取 name 以介于 'A' 和 'H' 之间字母开始的所有网站:
SELECT * FROM Websites WHERE name BETWEEN 'A' AND 'H'; 

请注意,在不同的数据库中,BETWEEN 操作符会产生不同的结果!

  • 在某些数据库中,BETWEEN 选取介于两个值之间但不包括两个测试值的字段。
  • 在某些数据库中,BETWEEN选取介于两个值之间且包括两个测试值的字段。
  • 在某些数据库中,BETWEEN选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。

10.最好使用别名的场景

  • 在查询中涉及超过一个表
  • 在查询中使用了函数
  • 列名称很长或者可读性差
  • 需要把两个列或者多个列结合在一起
    11.SQL连接(JOINS)
  • INNER JOIN:如果表中有至少一个匹配,则返回行(注:INNER JOIN 与 JOIN 是相同的。)
  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行(注:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。)
  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行(注:在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。)
  • FULL JOIN:只要其中一个表中存在匹配,则返回行

首先,连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。
左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。
外连接就好像是为非基准表添加了一行全为空值的万能行,用来与基准表中找不到匹配的行进行匹配。假设两个没有空值的表进行左连接,左表是基准表,左表的所有行都出现在结果中,右表则可能因为无法与基准表匹配而出现是空值的字段。
12.在使用 join 时,on 和 where 条件的区别如下:

1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

13.SQL UNION 操作符合并两个或多个 SELECT 语句的结果。

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
-- 注:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT语句中的列的顺序必须相同。

14.复制表

Create table 新表
AS
Select * from 原表

我们可以复制所有的列插入到新表中:

SELECT *
INTO newtable [IN externaldb]
FROM table1;

或者只复制希望的列插入到新表中:

SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1; 

复制多个表中的数据插入到新表中:

SELECT Websites.name, access_log.count, access_log.date
INTO WebsitesBackup2016
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id;

提示:SELECT INTO 语句可用于通过另一种模式创建一个新的空表。只需要添加促使查询没有数据返回的 WHERE 子句即可:

SELECT *
INTO newtable
FROM table1
WHERE 1=0;

注:INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。

15.约束
约束可通过创建表或修改表进行添加。
在 SQL 中,我们有如下约束:

NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOT NULLUNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
DEFAULT - 规定没有给列赋值时的默认值。

例如:

CREATE TABLE Persons
(
    Id_P int NOT NULL PRIMARY KEY,   //PRIMARY KEY约束
    LastName varchar(255) NOT NULL
)

更多推荐

Sql菜鸟学习笔记