sql高级进阶

SQL TOP 子句
TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
注释:并非所有的数据库系统都支持 TOP 子句。
SQL Server 的语法:
SELECT TOP number|percent column_name(s)
FROM table_name
MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的
MySQL 语法

SELECT column_name(s)
FROM table_name
LIMIT number   

Oracle语法

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

查看person表中的数据

select * from person 

`

   id	lastname	firstname	address	city
1	adams	john	oxford street	london
2	Bush	George	Fifth Avenue	New York
3	Carter	Thomas	Changan Street	Beijing
4	Carter		William	Xuanwumen 10	Beijing
5	Gates	Bill	Xuanwumen 10	Beijing   
SELECT * FROM Person LIMIT 2 ; 
     id	lastname	firstname	address	city
1	adams	john	oxford street	london
2	Bush	George	Fifth Avenue	New York    

只显示了表的前两行数据
SQL LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
like语法

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern       

现在,我们希望从上面的 “Persons” 表中选取居住在以 “N” 开始的城市里的人:
我们可以使用下面的 SELECT 语句:

SELECT * FROM Person
WHERE City LIKE 'N%'

查询结果

id	lastname	firstname	address	city
2	Bush	George	Fifth Avenue	New York

接下来,我们希望从 “Persons” 表中选取居住在以 “g” 结尾的城市里的人:
我们可以使用下面的 SELECT 语句:

SELECT * FROM Person
WHERE City LIKE '%g'
查询结果
    id	lastname	firstname	address	city
3	Carter	Thomas	Changan Street	Beijing
4	Carter		William	Xuanwumen 10	Beijing
5	Gates	Bill	Xuanwumen 10	Beijing  

接下来,我们希望从 “Persons” 表中选取居住在包含 “lon” 的城市里的人:
我们可以使用下面的 SELECT 语句:

SELECT * FROM Person
WHERE City LIKE '%lon%'
查询结果
id	lastname	firstname	address	city
1	adams	john	oxford street	london                                                                

通过使用 NOT 关键字,我们可以从 “Persons” 表中选取居住在不包含 “lon” 的城市里的人:
我们可以使用下面的 SELECT 语句:

SELECT * FROM Person
WHERE City NOT LIKE '%lon%'
结果
id	lastname	firstname	address	city
2	Bush	George	Fifth Avenue	New York
3	Carter	Thomas	Changan Street	Beijing
4	Carter		William	Xuanwumen 10	Beijing
5	Gates	Bill	Xuanwumen 10	Beijing

SQL 通配符
在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。
SQL 通配符必须与 LIKE 运算符一起使用。
% 代表一个或多个字符
– 代表一个字符
[charlist] 字符列中的任何单一字符
[!charlist] 不在字符列中的任何单一字符
person表

  id	lastname	firstname	address	city
1	adams	john	oxford street	london
2	Bush	George	Fifth Avenue	New York
3	Carter	Thomas	Changan Street	Beijing
4	Carter		William	Xuanwumen 10	Beijing
5	Gates	Bill	Xuanwumen 10	Beijing 

现在,我们希望从上面的 “Persons” 表中选取居住在以 “Ne” 开始的城市里的人:
我们可以使用下面的 SELECT 语句:

SELECT * FROM Person
WHERE City LIKE 'Ne%'
查询结果
id	lastname	firstname	address	city
2	Bush	George	Fifth Avenue	New York

接下来,我们希望从 “Persons” 表中选取居住在包含 “lond” 的城市里的人:
我们可以使用下面的 SELECT 语句:

SELECT * FROM Person
WHERE City LIKE '%lond%'
查询结果
id	lastname	firstname	address	city
1	adams	john	oxford street	london

现在,我们希望从上面的 “Persons” 表中选取名字的第一个字符之后是 “eorge” 的人:
我们可以使用下面的 SELECT 语句:

SELECT * FROM Person
WHERE FirstName LIKE '_eorge'
查询结果
id	lastname	firstname	address	city
2	Bush	George	Fifth Avenue	New York

接下来,我们希望从 “Persons” 表中选取的这条记录的姓氏以 “C” 开头,然后是一个任意字符,然后是 “r”,然后是任意字符,然后是 “er”:
我们可以使用下面的 SELECT 语句:

SELECT * FROM Person
WHERE LastName LIKE 'C_r_er'
id	lastname	firstname	address	city
3	Carter	Thomas	Changan Street	Beijing
4	Carter		William	Xuanwumen 10	Beijing

SQL IN 操作符
IN 操作符允许我们在 WHERE 子句中规定多个值。
原始表

mysql> select * from person;
+------+----------+-----------+----------------+----------+
| id   | lastname | firstname | address        | city     |
+------+----------+-----------+----------------+----------+
|    1 | adams    | john      | oxford street  | london   |
|    2 | Bush     | George    | Fifth Avenue   | New York |
|    3 | Carter   | Thomas    | Changan Street | Beijing  |
|    4 | Carter   |     William  | Xuanwumen 10   | Beijing  |
|    5 | Gates    | Bill      | Xuanwumen 10   | Beijing  |
+------+----------+-----------+----------------+----------+

现在,我们希望从上表中选取姓氏为 Adams 和 Carter 的人:
我们可以使用下面的 SELECT 语句

mysql> select * from person where lastname in("adams","carter");
+------+----------+-----------+----------------+---------+
| id   | lastname | firstname | address        | city    |
+------+----------+-----------+----------------+---------+
|    1 | adams    | john      | oxford street  | london  |
|    3 | Carter   | Thomas    | Changan Street | Beijing |
|    4 | Carter   |     William  | Xuanwumen 10   | Beijing |
+------+----------+-----------+----------------+---------+
3 rows in set (0.00 sec)

SQL BETWEEN 操作符
操作符 BETWEEN … AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
语法

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

原始表

mysql> select * from person;
+------+----------+-----------+----------------+----------+
| id   | lastname | firstname | address        | city     |
+------+----------+-----------+----------------+----------+
|    1 | adams    | john      | oxford street  | london   |
|    2 | Bush     | George    | Fifth Avenue   | New York |
|    3 | Carter   | Thomas    | Changan Street | Beijing  |
|    4 | Carter   |     William  | Xuanwumen 10   | Beijing  |
|    5 | Gates    | Bill      | Xuanwumen 10   | Beijing  |
+------+----------+-----------+----------------+----------+
5 rows in set (0.00 sec)

如需以字母顺序显示介于 “Adams”(包括)和 “Carter”(不包括)之间的人,请使用下面的 SQL:

mysql> select * from person where lastname between "adams" and "carter";
+------+----------+-----------+----------------+----------+
| id   | lastname | firstname | address        | city     |
+------+----------+-----------+----------------+----------+
|    1 | adams    | john      | oxford street  | london   |
|    2 | Bush     | George    | Fifth Avenue   | New York |
|    3 | Carter   | Thomas    | Changan Street | Beijing  |
|    4 | Carter   |     William  | Xuanwumen 10   | Beijing  |
+------+----------+-----------+----------------+----------+
4 rows in set (0.00 sec)

**重要事项:**不同的数据库对 BETWEEN…AND 操作符的处理方式是有差异的。某些数据库会列出介于 “Adams” 和 “Carter” 之间的人,但不包括 “Adams” 和 “Carter” ;某些数据库会列出介于 “Adams” 和 “Carter” 之间并包括 “Adams” 和 “Carter” 的人;而另一些数据库会列出介于 “Adams” 和 “Carter” 之间的人,包括 “Adams” ,但不包括 “Carter” 。

所以,请检查你的数据库是如何处理 BETWEEN…AND 操作符的!

如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:

mysql> select * from person where lastname not between "adams" and "carter";
+------+----------+-----------+--------------+---------+
| id   | lastname | firstname | address      | city    |
+------+----------+-----------+--------------+---------+
|    5 | Gates    | Bill      | Xuanwumen 10 | Beijing |
+------+----------+-----------+--------------+---------+
1 row in set (0.00 sec)

SQL Alias(别名)
通过使用 SQL,可以为列名称和表名称指定别名(Alias)
表的 SQL Alias 语法

SELECT column_name(s)
FROM table_name
AS alias_name

列的SQL 语法

SELECT column_name AS alias_name
FROM table_name

原始表

mysql> select * from person;
+------+----------+-----------+----------------+----------+
| id   | lastname | firstname | address        | city     |
+------+----------+-----------+----------------+----------+
|    1 | adams    | john      | oxford street  | london   |
|    2 | Bush     | George    | Fifth Avenue   | New York |
|    3 | Carter   | Thomas    | Changan Street | Beijing  |
|    4 | Carter   |     William  | Xuanwumen 10   | Beijing  |
|    5 | Gates    | Bill      | Xuanwumen 10   | Beijing  |
+------+----------+-----------+----------------+----------+
5 rows in set (0.00 sec)

一个例子
m

ysql> select lastname a ,firstname b from person;
+--------+----------+
| a      | b        |
+--------+----------+
| adams  | john     |
| Bush   | George   |
| Carter | Thomas   |
| Carter |      William |
| Gates  | Bill     |
+--------+----------+
5 rows in set (0.00 sec)

SQL JOIN
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
两张表
person

mysql> select * from person;
+------+----------+-----------+----------------+----------+
| id   | lastname | firstname | address        | city     |
+------+----------+-----------+----------------+----------+
|    1 | adams    | john      | oxford street  | london   |
|    2 | Bush     | George    | Fifth Avenue   | New York |
|    3 | Carter   | Thomas    | Changan Street | Beijing  |
|    4 | Carter   |     William  | Xuanwumen 10   | Beijing  |
|    5 | Gates    | Bill      | Xuanwumen 10   | Beijing  |
+------+----------+-----------+----------------+----------+
5 rows in set (0.00 sec)

city

mysql> select * from city;
+------+----------+
| id   | city     |
+------+----------+
|    1 | beijing  |
|    2 | newyork  |
|    3 | shanghai |
+------+----------+

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

mysql> select a.id,a.lastname,b.city from person a join city b on a.id = b.id;
+------+----------+----------+
| id   | lastname | city     |
+------+----------+----------+
|    1 | adams    | beijing  |
|    2 | Bush     | newyork  |
|    3 | Carter   | shanghai |
+------+----------+----------+
3 rows in set (0.00 sec)

注:join 和 inner join 是一样的
LEFT JOIN 关键字语法
LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name
mysql> select a.id,a.lastname,b.city from person a left join city b on a.id = b.id;
+------+----------+----------+
| id   | lastname | city     |
+------+----------+----------+
|    1 | adams    | beijing  |
|    2 | Bush     | newyork  |
|    3 | Carter   | shanghai |
|    4 | Carter   | NULL     |
|    5 | Gates    | NULL     |
+------+----------+----------+
5 rows in set (0.00 sec)

right join
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

mysql> select a.id,a.lastname,b.city from person a right join city b on a.id = b.id;
+------+----------+----------+
| id   | lastname | city     |
+------+----------+----------+
|    1 | adams    | beijing  |
|    2 | Bush     | newyork  |
|    3 | Carter   | shanghai |
+------+----------+----------+
3 rows in set (0.00 sec)

SQL SELECT INTO 语句

SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
您可以把所有的列插入新表:

SELECT *
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

或者只把希望的列插入新表:

SELECT column_name(s)
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

下面的例子会制作 “Persons” 表的备份复件

SELECT *
INTO Persons_backup
FROM Persons

IN 子句可用于向另一个数据库中拷贝表:

SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons

如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:

SELECT LastName,FirstName
INTO Persons_backup
FROM Persons

我们也可以添加 WHERE 子句。
下面的例子通过从 “Persons” 表中提取居住在 “Beijing” 的人的信息,创建了一个带有两个列的名为 “Persons_backup” 的表:

SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing

从一个以上的表中选取数据也是可以做到的。
下面的例子会创建一个名为 “Persons_Order_Backup” 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:

SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P

CREATE DATABASE 语句
CREATE DATABASE 用于创建数据库
CREATE DATABASE database_name
CREATE TABLE 语句
SQL CREATE TABLE 语法

CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)

创建名为 “Person” 的表。
该表包含 5 个列,列名分别是:“Id_P”、“LastName”、“FirstName”、“Address” 以及 “City”:

CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

可使用 INSERT INTO 语句向空表写入数据。
SQL 约束 (Constraints)

主键 primary key   PRIMARY KEY 约束唯一标识数据库表中的每条记录  --唯一非空
唯一 unique          UNIQUE 约束唯一标识数据库表中的每条记录。
非空 not null         NOT NULL 约束强制列不接受 NULL 值。
外键 foreign key   一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
检查约束 check   CHECK 约束用于限制列中的值的范围。
DEFAULT  默认值 DEFAULT 约束用于向列中插入默认值。

SQL CREATE INDEX 语句
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
语法

CREATE INDEX index_name
ON table_name (column_name

SQL CREATE UNIQUE INDEX 语法

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

SQL 撤销索引、表以及数据库
通过使用 DROP 语句,可以轻松地删除索引、表和数据库。

DROP INDEX index_name ON table_name
DROP TABLE 表名称
DROP DATABASE 数据库名称

如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?
请使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据)

TRUNCATE TABLE 表名称
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值