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;
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';
Like模糊查询,通常和通配符百分号 % 和 下划线 _ 联合使用
Select * from user where name like 'X%';
查询 user 表中 name 列中有 'X' 的值,X' 为要查询内容中的模糊信息。
百分号%:匹配任意多个字符;下划线 _:任意一个字符(%是一个特殊的符号,_ 也是一个特殊符号)
'X% ':为能配符,正则表达式,表示的意思为模糊查询信息为 X 开头的
'%X ':为能配符,正则表达式,表示的意思为模糊查询信息为 X 结尾的
'%X%' : 表示查询包含X的所有内容
'%X_': 表示查询以X在倒数第二位的所有内容
'_X%':查询第二个字母为 X
'__X%':查询第三个字母为 X
'%\_%':\ 转义字符;查询带有 下划线 _ 的
【】查询名字中含有O
select name from user where name like '%O%';
【】查询名字以O结尾
select name from user where name like '%O';
【】查询名字以O开始
select name from user where name like 'O%';
【】查询第二个字每是O
select name from user where name like '_O%';
【】查询第三个字母是O
select name from user where name like '__O%';
【】查询名字中有下划线“_”
select name from user where name like '%\_%'; // \转义字符
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 字母开头的网站
IN 操作符允许在 WHERE 子句中规定多个值
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
in 包含,相当于多个 or (not in 表示不在这几个值当中的数据)
注:in不是一个区间。in后面跟的是具体的值
BETWEEN 操作符用于选取介于两个值之间的数据范围内的值;这些值可以是数值、文本或者日期
between … and …. 两个值之间, 等同于 >= and <=
使用between and的时候,必须遵循左小右大
between and是闭区间,包括两端的值
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
通过使用 SQL,可以为表名称或列名称指定别名
(1)表的 SQL 别名语法
SELECT column_name(s)
FROM table_name AS alias_name;
(2)列的 SQL 别名语法
SELECT column_name AS alias_name
FROM table_name;
如:
select dname as deptname from dept;
//可以省略空格
select dname deptname from dept;
as关键字可以省略,但是不能出现多个字段、空格,如别名 dept name,可以修改为 'dept name'
select dname dept name from dept;
上述是错误的, DBMS看到上述SQL语句,进行SQL语句的编译,不符合语法,编译报错
可以使用单引号' ' 或者 双引号 " "括起来(在所有的数据库当中,字符串统一使用单引号括起来,单引号是标准,双引号在oracle数据库中用不了。但是在mysql中可以使用)
//加单引号
select dname 'dept name' from dept;
//加双引号
select dname "dept name" from dept;
别名是中文,用单引号括起来
//别名是中文,用单引号括起来
select dname '部门名称' from dept;
注:
【1】as关键字只是将显示的查询结果列名显示为alias_name,原表列名还是叫:column_name
(select语句是永远都不会进行修改操作,只负责查询)
【2】别名中间有空格,需要使用单引号' ' 或者 双引号 " "括起来;(在所有的数据库当中,字符串统一使用单引号括起来,单引号是标准,双引号在oracle数据库中用不了。但是在mysql中可以使用)
【3】别名是中文,用单引号括起来
UNION 操作符用于合并两个或多个 SELECT 语句的结果集
注:
UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型
同时,每个 SELECT 语句中的列的顺序必须相同
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
如下,都会报错
列数不同
select empname,job from emp where job = 'salesman' union select empname from emp where job='manager';
ERROR 1222 (21000): The used SELECT statements have a different number of columns
字段类型不同;MYSQL中可以不会报错,但是Oracle语法严格 ,会报错
select
empname,job
from
emp
where
job = 'salesman'
union
select
empname,sal
from
emp
where
job='manager';
UNION 操作符默认选取不同的值。如果允许重复的值,使用 UNION ALL
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名
(2)union 和 join 选择
union的效率要高一些
join表连接,每连接一次新表,则匹配的次数满足笛卡尔积,是两张表行数的乘积
union可以减少匹配的次数;还可以完成两个结果集的拼接
如下:a 连接 b;连接 c
a表10条记录;b表 10条记录;c表 10条记录;join匹配次数:10*10*10 = 1000
a 连接 b一个结果:10 * 10 = 100; a 连接 c一个结果:10 * 10 = 100次;union匹配次数:100 + 100 = 200次
(union把乘法变成了加法运算)
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 ;
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