您的位置:首页 > 数据库

对SQL语句的基础知识总结三(SQL语句的进阶)

2017-12-24 23:29 519 查看
前两篇总结了基本的SQL语句,但正如其名,这只是基本的SQL语句,在实际运用中,是需要和进阶的语句一起使用。这一篇就主要总结一下,这些进阶的SQL的语句。

1.Top

TOP主要是用来规定需要返回的记录数目。但是,注意一点的是,不是所有的数据库都有TOP这个语句,但相应的功能一般都有。
SELECT column_name(s) FROM table_name LIMIT number  --MySQL版
SELECT * FROM Persons LIMIT 5
其他的数据库中的相应的用法如下:
SELECT TOP number|percent column_name(s) FROM table_name --SQL server版
SELECT TOP 2% * FROM Persons  --可以设置百分比
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number  --Oracle版
SELECT * FROM Persons WHERE ROWNUM <= 5

2.Like

模糊搜索。LIKE表示是通过部分的关键字来搜索所有的值,对应的NOT LIKE,就是排除搜索对应的字符。其中,这里用到了通配符。具体的通配符见下。
SELECT * FROM Persons WHERE City LIKE '%lon%'  --通配符可以组合使用
SELECT * FROM Persons WHERE City NOT LIKE '%lon%'  --关键字NOT,就是排除这个搜索
通配符描述
%替代任意个字符
_仅替代一个字符
[charlist]字符列中的任何单一字符。如[ANL],就是字符中包括A或N或L的,都会被搜索出来。
[^charlist] 或 [!charlist]不在字符中的。
SELECT * FROM Persons WHERE City LIKE '[AL]%'  --选取居住的城市 以 "A" 或 "L" 开头 的人
SELECT * FROM Persons WHERE City LIKE '[!BC]%'  --选取居住的城市 不以 "B" 或 "C" 开头 的人

3.IN

允许我们在 WHERE 子句中规定多个值。
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')  --例子01

4.Alias

为列名称和表名称指定别名,AS 别名。
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'    --为表设置别名,用法一般为:别名后点列名。
SELECT LastName AS Family, FirstName AS Name
FROM Persons                                       --为列设置别名,用法为:查询后的结果的头部显示为别名。

5.Join

有时为了得到完整的结果,我们需要从两个或更多的表中获取结果,这时就需要执行 join。而数据库中的表,又可通过主键将彼此联系起来。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P                     --原始的写法,引用两个表并关联起来
Inner Join(等同于Join):如果表中至少有一个匹配,就返回行。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName      --INNER JOIN时,只要有一个匹配就会重复返回,所以单独的join很容易出现重复数据
LastNameFirstNameOrderNo
AdamsJohn22456
AdamsJohn24562
CarterThomas77895
CarterThomas44678
Left Join:只要左边的这个表里有数据就会返回。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName      --LEFT JOIN时,只要左边的表有就会返回,所以可能出现,右边的值为空。
LastNameFirstNameOrderNo
AdamsJohn22456
AdamsJohn24562
CarterThomas77895
CarterThomas44678
BushGeorge 
Right Join:同理,返回右边有的数据。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName                      --RIGHT JOIN时,一直返回右边的数据。
LastNameFirstNameOrderNo
AdamsJohn22456
AdamsJohn24562
CarterThomas77895
CarterThomas44678
  34764
Full Join:全连接,只要任何一个表里有值,就会返回,会有很多的数据只有一部分。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName                      --FULL JOIN时,只要任意一个表有相应的值,就会返回。
LastNameFirstNameOrderNo
AdamsJohn22456
AdamsJohn24562
CarterThomas77895
CarterThomas44678
BushGeorge 
  34764

6.Union

Union主要是用来查询拥有相同列的表之间的所有数据。Union:返回不同的值。
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas                  返回的值:因为有两个相同的人员值,但只会返回一个重复的值。
Yang, Ming
Adams, John
Bush, George
Gates, Bill
Union All:返回表中的所有值。
SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas         --两个相同的值都被查询出来了
Gates, Bill

7.Constraints

约束,主要用来限制加入表的数据的类型。可以在创建表的时候加约束,或者之后重新修改约束。NOT NULL:不接受空值,必须要有值。在利用SQL语句创建表时,特别需要注意,后面一定要加上insert into语句。
PRIMARY KEY:主键。必须不能为空,且必须是唯一确定的值。每张表应该要有且只有一个主键。
UNIQUE:唯一标识。每个表可以有多个unique约束。
FOREIGN KEY:外键。一个表的键,指向另一个表的主键,那么这就是外键。这是用于预防破坏表之间连接的动作。

CHECK:约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
DEFAULT:用于向列中插入默认值。使用:default getdate() 可以结合函数使用。

8.Auto-increment

用来在新记录中,自动插入一个唯一的数字。MySQL:默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。如果想修改每次递增的大小,那AUTO_INCREMENT=10。
SQL server:默认地,IDENTITY 的开始值是 1,每条新记录递增 1。如果想修改递增大小,那IDENTITY(20,10)--从20开始,每次递增10。
ORACLE:使用sequence。使用时,要先要create sequence,然后在新建表格时,需要结合.nextval使用。
CREATE SEQUENCE seq_person    --seq_名字
MINVALUE 1                    --最小值
START WITH 1                  --从该值开始
INCREMENT BY 1                --递增值
CACHE 10                      --为了提高访问速度,多存储的序列值

INSERT INTO Persons (P_Id,FirstName,LastName) VALUES (seq_person.nextval,'Lars','Monsen')
--结合nextval来实现自动递增

9.Date

当我们处理日期时,一定要确保所插入的日期的格式,与数据库中日期列的格式相匹配。MySQL
函数描述
NOW()返回当前的日期和时间(自动获取系统里的:2008-12-26 16:23:55)
CURDATE()返回当前的日期(自动获取系统日期:2008-12-26)
CURTIME()返回当前的时间(自动获取系统时间:16:23:55)
DATE()提取日期部分(把给定的值里面的日期提取出来:2008-12-26 16:23:55-->2008-12-26)
EXTRACT()返回日期/时间按的单独部分
DATE_ADD()给日期添加指定的时间间隔
DATE_SUB()从日期减去指定的时间间隔
DATEDIFF()返回两个日期之间的天数
DATE_FORMAT()用不同的格式显示日期/时间
SQL server
函数描述
GETDATE()返回当前日期和时间(获取系统日期 时间)
DATEPART()返回日期/时间的单独部分(获取规定的数据:DATEPART(想要的部分,需要被修剪的数据))
DATEADD()在日期中添加或减去指定的时间间隔
DATEDIFF()返回两个日期之间的时间
CONVERT()用不同的格式显示日期/时间

10.NULL

NULL只是用作未知的或不适用的值的一个占位符,所以NULL值的处理方式与其他值不同。
注释:无法比较 NULL 和 0;它们是不等价的。
SELECT * WHERE Address IS NOT NULL
isnull()属于函数,在下一篇进行总结。
另,数据类型:http://www.w3school.com.cn/sql/sql_datatypes.asp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: