SQL-高级命令语句:like通配符,as别名,join连接

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL-高级命令语句:like通配符,as别名,join连接相关的知识,希望对你有一定的参考价值。

1、SQL SELECT TOP, LIMIT, ROWNUM 子句

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;

2、SQL LIKE

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;

"%" 符号用于在模式的前后定义通配符(默认字母)

下面的 SQL 语句选取 name 以字母 "X" 开始的所有用户

SELECT * FROM user
WHERE name LIKE 'X%';

下面的 SQL 语句选取 name 以字母 "X" 结尾的所有用户

SELECT * FROM user
WHERE name LIKE '%X';

3、SQL通配符

通配符可用于替代字符串中的任何其他字符;在 SQL 中,通配符与 SQL LIKE 操作符一起使用

通配符描述
%替代 0 个或多个字符
_替代一个字符
[charlist]字符列中的任何单一字符
[^charlist]

[!charlist]
不在字符列中的任何单一字符

mysql 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式

SELECT * FROM user
WHERE name REGEXP '^[A-G]'; -- 选取 name 以 A 到 G 字母开头的用户

SELECT * FROM user
WHERE name REGEXP '^[^A-G]'; -- 选取 name 不以 A 到 G 字母开头的网站

 4、SQL IN

IN 操作符允许在 WHERE 子句中规定多个值

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);

5、SQL BETWEEN

BETWEEN 操作符用于选取介于两个值之间的数据范围内的值;这些值可以是数值、文本或者日期

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

6、SQL 别名 AS

通过使用 SQL,可以为表名称或列名称指定别名

表的 SQL 别名语法

SELECT column_name(s)
FROM table_name AS alias_name;

列的 SQL 别名语法

SELECT column_name AS alias_name
FROM table_name;

7、SQL 连接(JOIN)

【1】SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段

【2】下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法

 【3】SQL JOIN 类型

INNER JOIN:内连接,又叫等值连接,返回两个表中连接字段相等的行
LEFT JOIN:左连接,即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:右连接,即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:外连接,只要其中一个表中存在匹配,则返回;即返回两个表中的行:left join + right join

CROSS JOIN : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数

【4】SQL INNER JOIN

INNER JOIN 关键字在表中存在至少一个匹配时返回行

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

或者

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

INNER JOIN 与 JOIN 是相同的

 【5】SQL LEFT JOIN

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

或

SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;

在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN

关键字 on 

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户

在使用 left jion 时,on 和 where 条件的区别如下:

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

假设有两张表:

两条 SQL:

select * from tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name='AAA'

select * from tab1 left join tab2 on (tab1.size = tab2.size and tab2.name='AAA')

 以上结果的关键原因就是 left join、right join、full join 的特殊性,不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。 而 inner jion 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。

【6】SQL RIGHT JOIN

RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;

或

SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;

在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN

【7】SQL FULL OUTER JOIN

FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行

FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果(MySQL中不支持 FULL OUTER JOIN)

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

总结如下:

A inner join B 取交集。

A left join B 取 A 全部,B 没有对应的值为 null。

A right join B 取 B 全部 A 没有对应的值为 null。

A full outer join B 取并集,彼此没有对应的值为 null

如: "user" 表中的 "deptId" 列指向 "dept" 表中的字段 "id";上面这两个表是通过 "deptId" 列联系起来的

select u.id,d.id,d.name,d.number 
from user u left join dept d 
on u.deptId = d.id;

或

select u.id,u.name,d.id,d.name,d.number 
from user u inner join dept d 
on u.deptId = d.id;

查询结果相同

8、SQL UNION

UNION 操作符用于合并两个或多个 SELECT 语句的结果集

注:

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

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

UNION 操作符默认选取不同的值。如果允许重复的值,使用 UNION ALL

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名

9、SQL SELECT INTO 

SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中

复制所有的列插入到新表

SELECT *
INTO newtable 
FROM table1;

只复制某列插入到新表

SELECT column_name(s)
INTO newtable 
FROM table1;

新表将会使用 SELECT 语句中定义的列名称和类型进行创建,可以使用 AS 子句来应用新名称

注:

MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT 

可以使用以下语句来拷贝表结构及数据

create table user11 (select * from user);
或者
CREATE TABLE user22
AS
SELECT * FROM user ;

10、SQL INSERT INTO SELECT

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中

我们可以从一个表中复制所有的列插入到另一个已存在的表中:
INSERT INTO table2
SELECT * FROM table1;

只复制某列插入到另一个已存在的表中:
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

select into from 和 insert into select 都是用来复制表

两者的主要区别为: 

select into from 要求目标表不存在,因为在插入时会自动创建;

insert into select from 要求目标表存在

1、复制表结构及其数据:

create table table_name_new as select * from table_name_old

2、只复制表结构:

create table table_name_new as select * from table_name_old where 1=2;

或者:

create table table_name_new like table_name_old

3、只复制表数据:

如果两个表结构一样:

insert into table_name_new select * from table_name_old

如果两个表结构不一样:

insert into table_name_new(column1,column2...) select column1,column2... from table_name_old

以上是关于SQL-高级命令语句:like通配符,as别名,join连接的主要内容,如果未能解决你的问题,请参考以下文章

MySQL高级语句

MySQL高级语句

MySQL数据库中的高级(进阶) SQL 语句

SQL高级语句

SQL高级语句

数据库基本操作--------高级MySQL语句