SQL语法

1、create database 数据库名称; **创建数据库
2、drop database 数据库名称; **删除数据库
3、use 数据库名称;  **进入数据库
4、show databases;  **显示所有的数据库
5、create table 表名 **创建表
   (
列名称1 数据类型;
列名称2 数据类型;
列名称3 数据类型;
................
   )
   **数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最常用的数据类型:
-----------------------------------------------------------------------------------------------------------
   数据类型                             描述
   integer(size)
   int(size)
   smallint(size)
   tinyint(size)                             仅容纳整数。在括号内规定数字的最大位数。
   ------------------------------------------------------------------------------------------------------------
   decimal(size,d)
   numeric(size,d)                     容纳带有小数的数字。 "size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。
   ------------------------------------------------------------------------------------------------------------
   char(size)                             容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。在括号中规定字符串的长度。
   ------------------------------------------------------------------------------------------------------------
   varchar(size)                     容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。在括号中规定字符串的最大长度。
   ------------------------------------------------------------------------------------------------------------
   date(yyyymmdd)             容纳日期。
**示例
CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)       !!这边没有逗号
)
**进阶用法
A、CREATE TABLE 表名1 as select a1,a2 from 表名2 definition only;    **将表名2中a1,a2列拿出来单独作为一个表
B、create table 表名1 like 表名2;                                    **使用旧表创建新表
        !!!   SQL语言对大小写不敏感
6、drop table 表名;  **删除新表
7、show tables;  **显示所有的表
8、alter table 表名 add column 列名 数据类型 ;  **增加一列,列增加后将不能删除。列名后的数据类型也不能改变,唯一能改变的是varchar类型的长度。
9、alter table 表名 add primary key a1 ; **添加主键
      alter table 表名 drop primary key a1 ; **删除主键
**主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
   外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
**关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。
比如:
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键;
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键;
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。
**定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
二、主键、外键和索引的区别
定义:
主键--唯一标识一条记录,不能有重复的,不允许为空
外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值
索引--该字段没有重复值,但可以有一个空值
作用:
主键--用来保证数据完整性
外键--用来和其他表建立联系用的
索引--是提高查询排序的速度
个数:
主键--主键只能有一个
外键--一个表可以有多个外键
索引--一个表可以有多个唯一索引
**创建SQL的主键和外键约束的方法:
create table Student --建表格式:create table 自定义的表名
( --字段名一般为有一定意义的英文
StudentName nvarchar(15), -- 格式:字段名类型()括号里面的是允许输入的长度
StudentAge int, --int型的后面不需要接长度
StudentSex nvarchar(2) --最后一个字段后面不要逗号
)
--在创建表时就可以对字段加上约束:
create table Student
(
StudentNo int PRIMARY KEY IDENTITY(1,1), --加主键约束,还有标识列属性(两者构成实体完整性)
StudentName nvarchar(15) not null, --加非空约束,不加"not null" 默认为:可以为空
StudentSchool text(20) FOREIGN KEY REFERENCES SchoolTable(SchoolName), --加外键约束,格式:FOREIGN KEY REFERENCES 关联的表名(字段名)
StudentAge int DEFAULT ((0)), --加默认值约束
StudentSex nvarchar(2) CHECK(StudentSex=N'男' or StudentSex=N'女') --加检查约束,格式:check (条件表达式)
)
**如果在表创建好了以后再加约束,则格式分别为:
主键:
alter table 表名
add constraint PK_字段名--"PK"为主键的缩写,字段名为要在其上创建主键的字段名,'PK_字段名'就为约束名
primary key (字段名) --字段名同上
唯一约束:
alter table 表名
add constraint UQ_字段名
unique (字段名)
外键约束:
alter table 表名
add constraint FK_字段名--"FK"为外键的缩写
foreign key (字段名) references 关联的表名(关联的字段名) --注意'关联的表名'和'关联的字段名'
alter table 表A add constraint FK_B foreign key (ticket_no) references 表B(ticket_no)
alter table 表A add constraint FK_C foreign key (person_no) references 表C(person_no)
alter table 成绩表 add constraint FK_StudentNo foreign key (StudentNo) references Student (StudentNo)
ON UPDATE CASCADE ON DELETE CASCADE; **级联更新,级联删除,这样在删除主表Student时,成绩表中该学生的所有成绩都会删除。
检查约束:
alter table 表名
add constraint CK_字段名
check (条件表达式) --条件表达式中的条件用关系运算符连接
默认值约束:
alter table 表名
add constraint DF_字段名
default '默认值' for 字段名--其中的'默认值'为你想要默认的值,注意'for'
删除创建的约束:
alter table 表名
drop constraint 约束名--约束名为你前面创建的如:PK_字段这样的约束名
--注意:如果约束是在创建表的时候创建的,则不能用命令删除
--只能在'企业管理器'里面删除
10、--> CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]
INDEX <index name> ON <table or view name>[column_name [ASC|DESC][,...n]]
INCLUDE (<column name> [,...n])   **后来才添加的,可以有,可以没有
[
WITH
[PAD_INDEX = {ON | OFF}]
[[,] FILLFACTOR = <fillfactor>]
[[,] IGNORE_DUR_KEY = {ON | OFF}]
[[,] DROP_EXISTING = {ON | OFF}]
[[,] STATISTICS_NORECOMPUTE = {ON | OFF}]
[[,] SORT_IN_TEMPDB = {ON | OFF}]
[[,] ONLINE = {ON | OFF}]
[[,] ALLOW_ROW_LOCKS = {ON | OFF}]
[[,] ALLOW_PAGE_LOCKS = {ON | OFF}]
[[,] MAXDOP = <maxinum degree of parallelism>
]
[ON {<filegroup> | <partition scheme name> | DEFAULT}]
**说明:UNIQUE: 建立唯一索引。
  CLUSTERED: 建立聚集索引。
  NONCLUSTERED: 建立非聚集索引。
  Index_property: 索引属性。
**UNIQUE索引既可以采用聚集索引结构,也可以采用非聚集索引的结构,如果不指明采用的索引结构,则SQL Server系统默认为采用非聚集索引结构。
--> DROP INDEX table_name.index_name[,table_name.index_name]; **删除索引
**SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间。
聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。
**聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。
**聚集索引就是在数据库被开辟一个物理空间存放他的排列的值,例如1-100,所以当插入数据时,他会重新排列整个整个物理空间,
而非聚集索引其实可以看作是一个含有聚集索引的表,他只仅包含原表中非聚集索引的列和指向实际物理表的指针。
他只记录一个指针,其实就有点和堆栈差不多的感觉了。
**建立索引的原则:
1) 定义主键的数据列一定要建立索引。
2) 定义有外键的数据列一定要建立索引。
3) 对于经常查询的数据列最好建立索引。
4) 对于需要在指定范围内的快速或频繁查询的数据列;
5) 经常用在WHERE子句中的数据列。
6) 经常出现在关键字order by、group by、distinct后面的字段,建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不                      会被使用。
7) 对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
8) 对于定义为text、image和bit的数据类型的列不要建立索引。
9) 对于经常存取的列避免建立索引
9) 限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的                        更新操作。
10) 对复合索引,按照字段在查询条件中出现的频度建立索引。在复合索引中,记录首先按照第一个字段排序。对于在第一个字段上取值相同的记录,系统再按照第二                        个字段的取值排序,以此类推。因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用,因此将应用频度高的字段,放置在复合索引的前面,会使                        系统最大可能地使用此索引,发挥索引的作用。
**http://www.cnblogs.com/kissdodog/archive/2013/06/12/3133345.html
11、-->CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition **创建视图
**示例
CREATE VIEW [Current Product List] AS SELECT ProductID,ProductName FROM Products WHERE Discontinued=No ;
SELECT * FROM [Current Product List] ; **选择这个来查询这个视图3
-->SQL [CREATE OR REPLACE] VIEW [Syntax] [CREATE OR REPLACE] VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition ;  **更新视图
**示例
CREATE VIEW [Current Product List] AS SELECT ProductID,ProductName,Category FROM Products WHERE Discontinued=No ;
-->drop view view_name ;  **删除视图
12、基本的sql语法:
选择:select*from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ 或者 select column_name from table1 ;
排序:select * from table1 order by field1,field2 [desc]
总数:select countas totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
13、UNION 运算符 :UNION 操作符用于合并两个或多个 SELECT 语句的结果集
-->SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2 ;
**UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
-->SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2 ;
**当 ALL 随 UNION 一起使用时(即 UNIONALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
14、EXCEPT 运算符 :查找两个集合之间不同的项,可以选择保留重复项。
-->select * from a except select * form b ;
    **EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPTALL),不消除重复行。
15、INTERSECT 运算符
    -->[SQL语句 1] INTERSECT [SQL语句 2];
**INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECTALL),不消除重复行。
**注:使用运算词的几个查询结果行必须是一致的。
16、MINUS 运算符 :它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。
如果第二个 SQL 语句所产生的结果并没有存在于第一个 SQL 语句所产生的结果内,那这笔资料就被抛弃。
-->[SQL 语句 1] MINUS [SQL 语句 2];
**示例:
--------------------------------------------------------------------------------------------------------
Store_Information                 Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
--------------------------------------------------------------------------------------------------------
Internet_Sales 07-Jan-1999 250
10-Jan-1999 535
11-Jan-1999 320
12-Jan-1999 750
--------------------------------------------------------------------------------------------------------
SELECT Txn_Date FROM Store_Information MINUS SELECT Txn_Date FROM Internet_Sales;
--------------------------------------------------------------------------------------------------------
结果: Txn_Date
Jan-05-1999
Jan-08-1999
--------------------------------------------------------------------------------------------------------
17、join :用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
**数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。
  在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
**示例:
--------------------------------------------------------------------------------------------------------------------------------------
Person Id_P LastName FirstName Address City
1 Adams John Oxford Street   London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
--------------------------------------------------------------------------------------------------------------------------------------
        orders           Id_O OrderNo Id_P
1  77895 3
2  44678 3
3 22456 1
4 24562 1
5 34764     65
-------------------------------------------------------------------------------------------------------------------------------------
**请注意,"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用他们的确切姓名。
     **请留意,"Id_P" 列把上面的两个表联系了起来。
-->SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P
------------------------------------------------------------------------------------------
结果集 L astName FirstName OrderNo
Adams John 22456
Adams  John  24562
Carter Thomas  77895
Carter Thomas  44678
-------------------------------------------------------------------------------------
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: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
--> SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name ;
**LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
http://www.w3school.com.cn/sql/sql_join_left.asp
--> SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name ;
**RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
http://www.w3school.com.cn/sql/sql_join_right.asp
--> SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name ;
**只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
http://www.w3school.com.cn/sql/sql_join_full.asp
18、group by :根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
**具体:http://www.cnblogs.com/rainman/archive/2013/05/01/3053703.html 。
  表1   //images0.cnblogs.com/blog/33509/201304/28234015-f1cc175bc15c439d94abf7cb1c52ab97.png
**示例1
--> select 类别, sum(数量) as 数量之和 from A group by 类别 ;
      结果://images0.cnblogs.com/blog/33509/201304/28234054-ff92ae14bfe74da98c4deb8d7c78f2f8.png
**示例2
--> select 类别, sum(数量) AS 数量之和 from A group by 类别 order by sum(数量) desc ;
      结果://images0.cnblogs.com/blog/33509/201304/28234104-2209d0664f424a2492d5935bbfb60ca4.png
    **示例3
--> select 类别, sum(数量) as 数量之和, 摘要 from A group by 类别 order by 类别 desc ;
**示例3执行后会提示下错误,如下图。
//images0.cnblogs.com/blog/33509/201304/28234141-f046e758679242e3834aacd4773740f2.png
这就是需要注意的一点,在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。
**示例4
--> select 类别, 摘要, sum(数量) as 数量之和 from A group by all 类别, 摘要 ;
      结果://images0.cnblogs.com/blog/33509/201304/28234156-7fb9d1f258ad4faaa26decfddc3723fc.png
“多列分组”实际上就是就是按照多列(类别+摘要)合并后的值进行分组,示例4中可以看到“a, a2001, 13”为“a, a2001, 11”和“a, a2001, 2”两条记录的合并。
**Group By与聚合函数:
常见的聚合函数:
函数 作用 支持性
sum(列名) 求和
max(列名) 最大值
min(列名) 最小值
avg(列名) 平均值
first(列名) 第一条记录 仅Access支持
last(列名) 最后一条记录 仅Access支持
count(列名) 统计记录数 注意和count(*)的区别
**Having与Where的区别:
where  :   子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
having :   子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。
select 类别, sum(数量) as 数量之和 from A group by 类别 having sum(数量) > 18 ;
select 类别, SUM(数量) from A where 数量 > 8 group by 类别 having SUM(数量) > 10 ;
**Compute 和 Compute By:
--> select * from A where 数量 > 8
执行结果://images0.cnblogs.com/blog/33509/201305/01222254-f994cd7563d748ce98e505099ec121af.png
--> select * from A where 数量>8 compute max(数量),min(数量),avg(数量) ;
执行结果: //images0.cnblogs.com/blog/33509/201305/01222307-2d255932d5a04974a390b1e7a23e4279.png
**compute子句能够观察“查询结果”的数据细节或统计各列数据(如例10中max、min和avg),返回结果由select列表和compute统计结果组成。
--> select * from A where 数量>8 order by 类别 compute max(数量),min(数量),avg(数量) by 类别 ;
执行结果://images0.cnblogs.com/blog/33509/201305/01222322-0729b129cb294a29aa06d041b737bb11.png
**注意:
     compute...by子句必须与order by子句用一起使用。
compute...by与group by相比,group by 只能得到各组数据的统计结果,而不能看到各组数据。
在实际开发中compute与compute by的作用并不是很大,SQL Server支持compute和compute by,而Access并不支持
19、 DISTINCT :在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 DISTINCT 用于返回唯一不同的值。
--> SELECT DISTINCT 列名称 FROM 表名称 ;
--> select distinct name, id from A ;
--> select count(distinct name) from A;  --表中name去重后的数目, SQL Server支持,而Access不支持
--> select count(distinct name, id) from A;  --SQL Server和Access都不支持
--> select id, distinct name from A;   --!!会提示错误,因为distinct必须放在开头
20、TOP :TOP 子句用于规定要返回的记录的数目。
**注意:并非所有的数据库系统都支持 TOP 子句 。
--> SELECT TOP number|percent column_name(s) FROM table_name ;  **返回number个数据,比如表里面1000个数据,将number设为50,那就只返回50条数据。
--> SELECT TOP n PERCENT <列名表> FROM <表名> [查询条件] ;  **返回结果集中指定百分比的记录数
21、LIKE :LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
--> SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern ;
**示例1:
---------------------------------------------------------------------------------------------------------------------------------------------------
  Persons 表: Id LastName FirstName Address City
1 Adams John  Oxford Street         London
2 Bush  George  Fifth Avenue New York
3 Carter Thomas  Changan Street         Beijing
---------------------------------------------------------------------------------------------------------------------------------------------------
--> SELECT * FROM Persons WHERE City LIKE 'N%' ;
---------------------------------------------------------------------------------------------------------------------------------------------------
Id   LastName   FirstName Address  City
结果: 2    Bush         George Fifth Avenue  New York
---------------------------------------------------------------------------------------------------------------------------------------------------
**说明:pattern中会使用的套式,也就是通配符。
'A_Z': 所有以 'A' 起头,另一个任何值的字原,且以 'Z' 为结尾的字串。 'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字原,而不是一个字原)。
'ABC%': 所有以 'ABC' 起头的字串。举例来说,'ABCD' 和 'ABCABC' 都符合这个套式。
'%XYZ': 所有以 'XYZ' 结尾的字串。举例来说,'WXYZ' 和 'ZZXYZ' 都符合这个套式。
'%AN%': 所有含有 'AN' 这个套式的字串。举例来说, 'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个套式。
**通配符
-----------------------------------------------------------------------------
|%           |          替代一个或多个字符          
|------------------------------------|----------------------------------------
|_           |          仅替代一个字符               
|------------------------------------|----------------------------------------
|[charlist]                           |          字符列中的任何单一字符       
|—---------------------------------|----------------------------------------
|[^charlist] 或者 [!charlist]     |          不在字符列中的任何单一字符   
-----------------------------------------------------------------------------
22、IN 操作符 : 允许我们在 WHERE 子句中规定多个值。
--> SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...) ;
**示例:
-----------------------------------------------------------------------------------------------
  Persons 表: Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush    George   Fifth Avenue         New York
3 Carter Thomas   Changan Street         Beijing
-----------------------------------------------------------------------------------------------
--> SELECT * FROM Persons WHERE LastName IN ('Adams','Carter') ;
-----------------------------------------------------------------------------------------------
结果: Id LastName    FirstName Address  City
1 Adams  John        Oxford Street London
3 Carter Thomas        Changan Street  Beijing
-----------------------------------------------------------------------------------------------
23、BETWEEN 操作符 :在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围。
--> SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2 ;
-----------------------------------------------------------------------------------------------
  Persons 表: Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street         Beijing
-----------------------------------------------------------------------------------------------
--> SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter' ;
-----------------------------------------------------------------------------------------------
结果: Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
-----------------------------------------------------------------------------------------------
**重要事项:不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。某些数据库会列出介于 "Adams" 和 "Carter" 之间的人,
但不包括 "Adams" 和 "Carter" ;某些数据库会列出介于 "Adams" 和 "Carter" 之间并包括 "Adams" 和 "Carter" 的人;
而另一些数据库会列出介于 "Adams" 和 "Carter" 之间的人,包括 "Adams" ,但不包括 "Carter" 。
所以,请检查你的数据库是如何处理 BETWEEN....AND 操作符的!
24、Alias (别名) :可以为列名称和表名称指定别名。
--> SELECT column_name(s) FROM table_name AS alias_name ;  **表的 SQL Alias 语法
--> SELECT column_name AS alias_name FROM table_name ;     **列的 SQL Alias 语法
25、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 ;  **把希望的列插入新表。
--> SELECT LastName,Firstname INTO Persons_backup FROM Persons WHERE City='Beijing' ;
--> SELECT Persons.LastName , Orders.OrderNo INTO Persons_Order_Backup FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P ;
**创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息
26、Constraints(约束) :约束用于限制加入表的数据的类型。可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
A : NOT NULL --NOT NULL 约束强制列不接受 NULL 值。NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
** 示例:
----------------------------------------
  CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
    ----------------------------------------
B : UNIQUE --UNIQUE 约束唯一标识数据库表中的每条记录。UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
                 RIMARY KEY 拥有自动定义的 UNIQUE 约束。
** 请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
** 示例:
----------------------------------------
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,      
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
);
---------->
CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
    ----------------------------------------
** 如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,请使用下面的 SQL 语法:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
);
----------------------------------------
** 当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:
ALTER TABLE Persons ADD UNIQUE (Id_P) ;
----------------------------------------
** 如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) ;
----------------------------------------
** 如需撤销 UNIQUE 约束,请使用下面的 SQL:
ALTER TABLE Persons DROP INDEX uc_PersonID ;
ALTER TABLE Persons DROP CONSTRAINT uc_PersonID ;
----------------------------------------
C : PRIMARY KEY :PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
----------------------------------------
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)
CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
----------------------------------------
** 如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
)
----------------------------------------
** 如果在表已存在的情况下为 "Id_P" 列创建 PRIMARY KEY 约束,请使用下面的 SQL:
ALTER TABLE Persons ADD PRIMARY KEY (Id_P) ;
----------------------------------------
** 如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName) ;
**注释:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
----------------------------------------
** 撤销 PRIMARY KEY 约束
ALTER TABLE Persons DROP PRIMARY KEY ;
ALTER TABLE Persons DROP CONSTRAINT pk_PersonID ;
----------------------------------------
D : FOREIGN KEY : 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
    http://www.w3school.com.cn/sql/sql_foreignkey.asp
----------------------------------------
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
CREATE TABLE Orders
(
Id_O int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
)
----------------------------------------
** 如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
)
----------------------------------------
** 如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束,请使用下面的 SQL:
ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) ;
----------------------------------------
** 如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) ;
----------------------------------------
** 撤销 FOREIGN KEY 约束
ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders ;
ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders ;
----------------------------------------
E : CHECK : CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
----------------------------------------
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)
CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
----------------------------------------
** 如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)
----------------------------------------
** 如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束,请使用下面的 SQL:
ALTER TABLE Persons ADD CHECK (Id_P>0) ;
----------------------------------------
** 如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes') ;
----------------------------------------
** 撤销 CHECK 约束
ALTER TABLE Persons DROP CONSTRAINT chk_Person ;
ALTER TABLE Persons DROP CHECK chk_Person ;
----------------------------------------
F : DEFAULT : DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。
----------------------------------------
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
----------------------------------------
** 通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
----------------------------------------
** 如果在表已存在的情况下为 "City" 列创建 DEFAULT 约束,请使用下面的 SQL:
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES' ;
ALTER TABLE Persons ALTER COLUMN City SET DEFAULT 'SANDNES' ;
----------------------------------------
** 撤销 DEFAULT 约束
ALTER TABLE Persons ALTER City DROP DEFAULT ;
ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT ;
----------------------------------------
27、ALTER :ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
--> ALTER TABLE table_name ADD column_name datatype ;  ** 在表中添加列
--> ALTER TABLE table_name  DROP COLUMN column_name ;  ** 删除表中的列
--> ALTER TABLE table_name ;   ** 改表名
--> ALTER COLUMN column_name datatype ;  ** 改变表中列的数据类型
--> ALTER TABLE Persons ADD Birthday date ;  ** 添加数据
28、AUTO INCREMENT 字段 :会在新记录插入表中时生成一个唯一的数字。
** 我们通常希望在每次插入新记录时,自动地创建主键字段的值。我们可以在表中创建一个 auto-increment 字段。
-->  CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
** MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。
    ** 默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:
--> ALTER TABLE Persons AUTO_INCREMENT=100 ;
29、NULL 值 :NULL 值是遗漏的未知数据。默认地,表的列可以存放 NULL 值。
** 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
** NULL 值的处理方式与其他值不同。
** NULL 用作未知的或不适用的值的占位符。
** 注释:无法比较 NULL 和 0;它们是不等价的。
--> SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NULL ;
--> SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NOT NULL ;
30、数据类型 :
** 在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。
Text 类型:
---------------------------------------------------------------------------------------------------------------------------------------------------------------
数据类型                                           描述
---------------------------------------------------------------------------------------------------------------------------------------------------------------
CHAR(size)                                        保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
VARCHAR(size)                                 保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。
注释:如果值的长度大于 255,则被转换为 TEXT 类型。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
TINYTEXT                                         存放最大长度为 255 个字符的字符串。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
TEXT                                                 存放最大长度为 65,535 个字符的字符串。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
BLOB                                                 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
MEDIUMTEXT                                 存放最大长度为 16,777,215 个字符的字符串。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
MEDIUMBLOB                                  用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
LONGTEXT                                          存放最大长度为 4,294,967,295 个字符的字符串。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
LONGBLOB                                          用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
ENUM(x,y,z,etc.)                                  允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。
注释:这些值是按照你输入的顺序存储的。
可以按照此格式输入可能的值:ENUM('X','Y','Z')
---------------------------------------------------------------------------------------------------------------------------------------------------------------
SET  与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
**Number 类型:
---------------------------------------------------------------------------------------------------------------------------------------------------------------
数据类型                                               描述
---------------------------------------------------------------------------------------------------------------------------------------------------------------
TINYINT(size)                                     -128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
SMALLINT(size)                                     -32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
MEDIUMINT(size)                              -8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
INT(size)      -2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
BIGINT(size)                                              -9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大      位数。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
FLOAT(size,d)                                          带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
DOUBLE(size,d)                                     带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
DECIMAL(size,d)                                      作为字符串存储的 DOUBLE 类型,允许固定的小数点。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
** 这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。
**Date 类型:
---------------------------------------------------------------------------------------------------------------------------------------------------------------
数据类型                                           描述
---------------------------------------------------------------------------------------------------------------------------------------------------------------
DATE()    日期。格式:YYYY-MM-DD
   注释:支持的范围是从 '1000-01-01' 到 '9999-12-31'
DATETIME()   *日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS
  注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'
---------------------------------------------------------------------------------------------------------------------------------------------------------------
TIMESTAMP()                                   *时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储。格式:YYYY-MM-DD HH:MM:SS
   注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC
---------------------------------------------------------------------------------------------------------------------------------------------------------------
TIME()     时间。格式:HH:MM:SS 注释:支持的范围是从 '-838:59:59' 到 '838:59:59'
---------------------------------------------------------------------------------------------------------------------------------------------------------------
YEAR()    2 位或 4 位格式的年。
   注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
** 即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。
  TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。

posted @ 2015-08-05 12:08  黑泡man  阅读(187)  评论(0编辑  收藏  举报