LEN() 函数 LEN 函数返回文本字段中值的长度。 SQL LEN() 语法SELECT LEN(column_name) FROM table_name SQL LEN() 实例 我们拥有下面这个 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 现在,我们希望取得 City 列中值的长度。 我们使用如下 SQL 语句: SELECT LEN(City) as LengthOfCity FROM Persons 结果集类似这样: LengthOfCity 6 8 7
MID() 函数 MID 函数用于从文本字段中提取字符。 SQL MID() 语法SELECT MID(column_name,start ) FROM table_name 参数 描述 column_name 必需。要提取字符的字段。 start 必需。规定开始位置(起始值是 1)。 length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。 SQL MID() 实例 我们拥有下面这个 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 现在,我们希望从 City 列中提取前 3 个字符。 我们使用如下 SQL 语句: SELECT MID(City,1,3) as SmallCity FROM Persons 结果集类似这样: SmallCity Lon New Bei
LCASE() 函数 LCASE 函数把字段的值转换为小写。 SQL LCASE() 语法SELECT LCASE(column_name) FROM table_name SQL LCASE() 实例 我们拥有下面这个 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 现在,我们希望选取 LastName 和 FirstName 列的内容,然后把 LastName 列转换为小写。 我们使用如下 SQL 语句: SELECT LCASE(LastName) as LastName,FirstName FROM Persons 结果集类似这样: LastName FirstName adams John bush George carter Thomas
UCASE() 函数 UCASE 函数把字段的值转换为大写。 SQL UCASE() 语法SELECT UCASE(column_name) FROM table_name SQL UCASE() 实例 我们拥有下面这个 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 现在,我们希望选取 LastName 和 FirstName 列的内容,然后把 LastName 列转换为大写。 我们使用如下 SQL 语句: SELECT UCASE(LastName) as LastName,FirstName FROM Persons 结果集类似这样: LastName FirstName ADAMS John BUSH George CARTER Thomas
HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。 SQL HAVING 语法SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value SQL HAVING 实例 我们拥有下面这个 Orders 表: O_Id OrderDate OrderPrice Customer 1 2008/12/29 1000 Bush 2 2008/11/23 1600 Carter 3 2008/10/05 700 Bush 4 2008/09/28 300 Bush 5 2008/08/06 2000 Adams 6 2008/07/21 100 Carter 现在,我们希望查找订单总金额少于 2000 的客户。 我们使用如下 SQL 语句: SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)2000 结果集类似: Customer SUM(OrderPrice) Carter 1700 现在我们希望查找客户 Bush 或 Adams 拥有超过 1500 的订单总金额。 我们在 SQL 语句中增加了一个普通的 WHERE 子句: SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer='Bush' OR Customer='Adams' GROUP BY Customer HAVING SUM(OrderPrice)1500 结果集: Customer SUM(OrderPrice) Bush 2000 Adams 2000
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。 GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。 SQL GROUP BY 语法SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name SQL GROUP BY 实例 我们拥有下面这个 Orders 表: O_Id OrderDate OrderPrice Customer 1 2008/12/29 1000 Bush 2 2008/11/23 1600 Carter 3 2008/10/05 700 Bush 4 2008/09/28 300 Bush 5 2008/08/06 2000 Adams 6 2008/07/21 100 Carter 现在,我们希望查找每个客户的总金额(总订单)。 我们想要使用 GROUP BY 语句对客户进行组合。 我们使用下列 SQL 语句: SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer 结果集类似这样: Customer SUM(OrderPrice) Bush 2000 Carter 1700 Adams 2000 很棒吧,对不对? 让我们看一下如果省略 GROUP BY 会出现什么情况: SELECT Customer,SUM(OrderPrice) FROM Orders 结果集类似这样: Customer SUM(OrderPrice) Bush 5700 Carter 5700 Bush 5700 Bush 5700 Adams 5700 Carter 5700 上面的结果集不是我们需要的。 那么为什么不能使用上面这条 SELECT 语句呢?解释如下:上面的 SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。SUM(OrderPrice) 返回一个单独的值(OrderPrice 列的总计),而 Customer 返回 6 个值(每个值对应 Orders 表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUP BY 语句解决了这个问题。 GROUP BY 一个以上的列 我们也可以对一个以上的列应用 GROUP BY 语句,就像这样: SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate
ALTER TABLE 语句 ALTER TABLE 语句用于在已有的表中添加、修改或删除列。 SQL ALTER TABLE 语法 如需在表中添加列,请使用下列语法: ALTER TABLE table_name ADD column_name datatype 要删除表中的列,请使用下列语法: ALTER TABLE table_name DROP COLUMN column_name 注释: 某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。 要改变表中列的数据类型,请使用下列语法: ALTER TABLE table_name ALTER COLUMN column_name datatype 原始的表 (用在例子中的): 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 SQL ALTER TABLE 实例 现在,我们希望在表 Persons 中添加一个名为 Birthday 的新列。 我们使用下列 SQL 语句: ALTER TABLE Persons ADD Birthday date 请注意,新列 Birthday 的类型是 date,可以存放日期。数据类型规定列中可以存放的数据的类型。 新的 Persons 表类似这样: Id LastName FirstName Address City Birthday 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing 改变数据类型实例 现在我们希望改变 Persons 表中 Birthday 列的数据类型。 我们使用下列 SQL 语句: ALTER TABLE Persons ALTER COLUMN Birthday year 请注意,Birthday 列的数据类型是 year,可以存放 2 位或 4 位格式的年份。 DROP COLUMN 实例 接下来,我们删除 Person 表中的 Birthday 列: ALTER TABLE Person DROP COLUMN Birthday 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
通过使用 DROP 语句,可以轻松地删除索引、表和数据库。 SQL DROP INDEX 语句 我们可以使用 DROP INDEX 命令删除表格中的索引。 用于 Microsoft SQLJet (以及 Microsoft Access) 的语法:DROP INDEX index_name ON table_name用于 MS SQL Server 的语法:DROP INDEX table_name.index_name用于 IBM DB2 和 Oracle 语法:DROP INDEX index_name用于 MySQL 的语法:ALTER TABLE table_name DROP INDEX index_name SQL DROP TABLE 语句 DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除): DROP TABLE 表名称 SQL DROP DATABASE 语句 DROP DATABASE 语句用于删除数据库: DROP DATABASE 数据库名称 SQL TRUNCATE TABLE 语句 如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢? 请使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据): TRUNCATE TABLE 表名称
CREATE INDEX 语句用于在表中创建索引。 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。 索引 您可以在表中创建索引,以便更加快速高效地查询数据。 用户无法看到索引,它们只能被用来加速搜索/查询。 注释: 更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。 SQL CREATE INDEX 语法 在表上创建一个简单的索引。允许使用重复的值: CREATE INDEX index_name ON table_name (column_name) 注释: column_name 规定需要索引的列。 SQL CREATE UNIQUE INDEX 语法 在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。 CREATE UNIQUE INDEX index_name ON table_name (column_name) CREATE INDEX 实例 本例会创建一个简单的索引,名为 PersonIndex,在 Person 表的 LastName 列: CREATE INDEX PersonIndex ON Person (LastName) 如果您希望以 降序 索引某个列中的值,您可以在列名称之后添加保留字 DESC : CREATE INDEX PersonIndex ON Person (LastName DESC) 假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开: CREATE INDEX PersonIndex ON Person (LastName, FirstName)
SQL SELECT INTO 语句可用于创建表的备份复件。 SELECT INTO 语句 SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。 SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。 SQL SELECT INTO 语法 您可以把所有的列插入新表: SELECT * INTO new_table_name FROM old_tablename 或者只把希望的列插入新表: SELECT column_name(s) INTO new_table_name FROM old_tablename SQL SELECT INTO 实例 - 制作备份复件 下面的例子会制作 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 SQL SELECT INTO 实例 - 带有 WHERE 子句 我们也可以添加 WHERE 子句。 下面的例子通过从 Persons 表中提取居住在 Beijing 的人的信息,创建了一个带有两个列的名为 Persons_backup 的表: SELECT LastName,Firstname INTO Persons_backup FROM Persons WHERE City='Beijing' SQL SELECT INTO 实例 - 被连接的表 从一个以上的表中选取数据也是可以做到的。 下面的例子会创建一个名为 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
SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。 SQL UNION 语法SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2 注释: 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。 SQL UNION ALL 语法SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2 另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。 下面的例子中使用的原始表:Employees_China: E_ID E_Name 01 Zhang, Hua 02 Wang, Wei 03 Carter, Thomas 04 Yang, Ming Employees_USA: E_ID E_Name 01 Adams, John 02 Bush, George 03 Carter, Thomas 04 Gates, Bill 使用 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 命令只会选取不同的值。 UNION ALL UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。 SQL Statement 1 UNION ALL SQL Statement 2 使用 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
SQL FULL JOIN 关键字 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。 FULL JOIN 关键字语法SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释: 在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。 原始的表 (用在例子中的): Persons 表: 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 全连接(FULL JOIN)实例 现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。 您可以使用下面的 SELECT 语句: SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName 结果集: LastName FirstName OrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678 Bush George 34764 FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 Persons 中的行在表 Orders 中没有匹配,或者如果 Orders 中的行在表 Persons 中没有匹配,这些行同样会列出。
SQL RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。 RIGHT JOIN 关键字语法SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释: 在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。 原始的表 (用在例子中的): Persons 表: 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 右连接(RIGHT JOIN)实例 现在,我们希望列出所有的定单,以及定购它们的人 - 如果有的话。 您可以使用下面的 SELECT 语句: SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName 结果集: LastName FirstName OrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678 34764 RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。
SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。 LEFT JOIN 关键字语法SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释: 在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。 原始的表 (用在例子中的): Persons 表: 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 左连接(LEFT JOIN)实例 现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。 您可以使用下面的 SELECT 语句: SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName 结果集: LastName FirstName OrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678 Bush George LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。
SQL INNER JOIN 关键字 在表中存在至少一个匹配时,INNER JOIN 关键字返回行。 INNER JOIN 关键字语法SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释: INNER JOIN 与 JOIN 是相同的。 原始的表 (用在例子中的): Persons 表: 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 内连接(INNER JOIN)实例 现在,我们希望列出所有人的定购。 您可以使用下面的 SELECT 语句: SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName 结果集: LastName FirstName OrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678 INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 Persons 中的行在 Orders 中没有匹配,就不会列出这些行。
通过使用 SQL,可以为列名称和表名称指定别名(Alias)。 SQL Alias表的 SQL Alias 语法SELECT column_name(s) FROM table_name AS alias_name 列的 SQL Alias 语法SELECT column_name AS alias_name FROM table_name Alias 实例: 使用表名称别名 假设我们有两个表分别是:Persons 和 Product_Orders。我们分别为它们指定别名 p 和 po。 现在,我们希望列出 John Adams 的所有定单。 我们可以使用下面的 SELECT 语句: SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John' 不使用别名的 SELECT 语句: SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName FROM Persons, Product_Orders WHERE Persons.LastName='Adams' AND Persons.FirstName='John' 从上面两条 SELECT 语句您可以看到,别名使查询程序更易阅读和书写。 Alias 实例: 使用一个列名别名表 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 SQL:SELECT LastName AS Family, FirstName AS Name FROM Persons结果: Family Name Adams John Bush George Carter Thomas
BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围。 BETWEEN 操作符 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。 SQL BETWEEN 语法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 4 Gates Bill Xuanwumen 10 Beijing BETWEEN 操作符实例 如需以字母顺序显示介于 Adams(包括)和 Carter(不包括)之间的人,请使用下面的 SQL: 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 操作符的! 实例 2 如需使用上面的例子显示范围之外的人,请使用 NOT 操作符: SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter' 结果集: Id LastName FirstName Address City 3 Carter Thomas Changan Street Beijing 4 Gates Bill Xuanwumen 10 Beijing
IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值。 SQL IN 语法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 IN 操作符实例 现在,我们希望从上表中选取姓氏为 Adams 和 Carter 的人: 我们可以使用下面的 SELECT 语句: 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
在搜索数据库中的数据时,您可以使用 SQL 通配符。 SQL 通配符 在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。 SQL 通配符必须与 LIKE 运算符一起使用。 在 SQL 中,可使用以下通配符: 通配符 描述 % 替代一个或多个字符 _ 仅替代一个字符 字符列中的任何单一字符 或者 不在字符列中的任何单一字符 原始的表 (用在例子中的): 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 使用 % 通配符例子 1 现在,我们希望从上面的 Persons 表中选取居住在以 Ne 开始的城市里的人: 我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City LIKE 'Ne%'结果集: Id LastName FirstName Address City 2 Bush George Fifth Avenue New York 例子 2 接下来,我们希望从 Persons 表中选取居住在包含 lond 的城市里的人: 我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City LIKE '%lond%'结果集: Id LastName FirstName Address City 1 Adams John Oxford Street London 使用 _ 通配符例子 1 现在,我们希望从上面的 Persons 表中选取名字的第一个字符之后是 eorge 的人: 我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE FirstName LIKE '_eorge'结果集: Id LastName FirstName Address City 2 Bush George Fifth Avenue New York 例子 2 接下来,我们希望从 Persons 表中选取的这条记录的姓氏以 C 开头,然后是一个任意字符,然后是 r,然后是任意字符,然后是 er: 我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'结果集: Id LastName FirstName Address City 3 Carter Thomas Changan Street Beijing 使用 通配符例子 1 现在,我们希望从上面的 Persons 表中选取居住的城市以 A 或 L 或 N 开头的人: 我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City LIKE ' %'结果集: Id LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 例子 2 现在,我们希望从上面的 Persons 表中选取居住的城市 不以 A 或 L 或 N 开头的人: 我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City LIKE ' %'结果集: Id LastName FirstName Address City 3 Carter Thomas Changan Street Beijing
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。 LIKE 操作符 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。 SQL LIKE 操作符语法SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern 原始的表 (用在例子中的): 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 LIKE 操作符实例例子 1 现在,我们希望从上面的 Persons 表中选取居住在以 N 开始的城市里的人: 我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City LIKE 'N%' 提示: % 可用于定义通配符(模式中缺少的字母)。 结果集: Id LastName FirstName Address City 2 Bush George Fifth Avenue New York 例子 2 接下来,我们希望从 Persons 表中选取居住在以 g 结尾的城市里的人: 我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City LIKE '%g'结果集: Id LastName FirstName Address City 3 Carter Thomas Changan Street Beijing 例子 3 接下来,我们希望从 Persons 表中选取居住在包含 lon 的城市里的人: 我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City LIKE '%lon%'结果集: Id LastName FirstName Address City 1 Adams John Oxford Street London 例子 4 通过使用 NOT 关键字,我们可以从 Persons 表中选取居住在 不包含 lon 的城市里的人: 我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City NOT LIKE '%lon%'结果集: Id LastName FirstName Address City 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing
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例子SELECT * FROM Persons LIMIT 5Oracle 语法SELECT column_name(s) FROM table_name WHERE ROWNUM = number例子SELECT * FROM Persons WHERE ROWNUM = 5 原始的表 (用在例子中的): 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 4 Obama Barack Pennsylvania Avenue Washington SQL TOP 实例 现在,我们希望从上面的 Persons 表中选取头两条记录。 我们可以使用下面的 SELECT 语句: SELECT TOP 2 * FROM Persons结果: Id LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York SQL TOP PERCENT 实例 现在,我们希望从上面的 Persons 表中选取 50% 的记录。 我们可以使用下面的 SELECT 语句: SELECT TOP 50 PERCENT * FROM Persons 结果: Id LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York
DELETE 语句 DELETE 语句用于删除表中的行。 语法DELETE FROM 表名称 WHERE 列名称 = 值 Person: LastName FirstName Address City Gates Bill Xuanwumen 10 Beijing Wilson Fred Zhongshan 23 Nanjing 删除某行 Fred Wilson 会被删除: DELETE FROM Person WHERE LastName = 'Wilson' 结果: LastName FirstName Address City Gates Bill Xuanwumen 10 Beijing 删除所有行 可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的: DELETE FROM table_name 或者: DELETE * FROM table_name
ORDER BY 语句用于对结果集进行排序。 ORDER BY 语句 ORDER BY 语句用于根据指定的列对结果集进行排序,默认升序 如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。 原始的表 (用在例子中的): Orders 表: Company OrderNumber IBM 3532 W3School 2356 Apple 4698 W3School 6953 实例 1 以字母顺序显示公司名称: SELECT Company, OrderNumber FROM Orders ORDER BY Company结果: Company OrderNumber Apple 4698 IBM 3532 W3School 6953 W3School 2356 实例 2 以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber): SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber 结果: Company OrderNumber Apple 4698 IBM 3532 W3School 2356 W3School 6953 实例 3 以逆字母顺序显示公司名称: SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC结果: Company OrderNumber W3School 6953 W3School 2356 IBM 3532 Apple 4698 实例 4 以逆字母顺序显示公司名称,并以数字顺序显示顺序号: SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC结果: Company OrderNumber W3School 2356 W3School 6953 IBM 3532 Apple 4698 注意: 在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。
AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。 AND 和 OR 运算符 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。AND:同时符合 如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。 OR:符合其中一项即可 原始的表 : LastName FirstName Address City Adams John Oxford Street London Bush George Fifth Avenue New York Carter Thomas Changan Street Beijing Carter William Xuanwumen 10 Beijing AND 运算符实例 使用 AND 来显示所有姓为 Carter 并且名为 Thomas 的人: SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'结果: LastName FirstName Address City Carter Thomas Changan Street Beijing OR 运算符实例 使用 OR 来显示所有姓为 Carter 或者名为 Thomas 的人: SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'结果: LastName FirstName Address City Carter Thomas Changan Street Beijing Carter William Xuanwumen 10 Beijing 结合 AND 和 OR 运算符 我们也可以把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式): SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')AND LastName='Carter' 结果: LastName FirstName Address City Carter Thomas Changan Street Beijing Carter William Xuanwumen 10 Beijing
WHERE 子句用于规定选择的标准。 WHERE 子句 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。 语法SELECT 列名称 FROM 表名称 WHERE 列 运算符 值 下面的运算符可在 WHERE 子句中使用: 操作符 描述 = 等于 或 != 不等于 大于 小于 = 大于等于 = 小于等于 BETWEEN 在某个范围内 LIKE 搜索某种模式 使用 WHERE 子句 如果只希望选取居住在城市 Beijing 中的人,我们需要向 SELECT 语句添加 WHERE 子句: SELECT * FROM Persons WHERE City='Beijing'Persons 表 LastName FirstName Address City Year Adams John Oxford Street London 1970 Bush George Fifth Avenue New York 1975 Carter Thomas Changan Street Beijing 1980 Gates Bill Xuanwumen 10 Beijing 1985 结果: LastName FirstName Address City Year Carter Thomas Changan Street Beijing 1980 Gates Bill Xuanwumen 10 Beijing 1985 引号的使用 请注意,SQL 使用单引号来环绕 文本值 。如果是 数值 ,请不要使用引号。 文本值:这是正确的: SELECT * FROM Persons WHERE FirstName='Bush' 这是错误的: SELECT * FROM Persons WHERE FirstName=Bush数值:这是正确的: SELECT * FROM Persons WHERE Year1965 这是错误的: SELECT * FROM Persons WHERE Year'1965'
在天文学家们最初热火朝天地处理SDSS数据的时候,我并没有勇气把大量精力投入到这项事业中。不过我确实曾经尝试过使用SQL去搜索一些SDSS数据, 不过没有坚持下来,原来做的一些事也早就忘记了。最近又需要搜索一下SDSS数据,没办法,只能再次进行尝试并作一些记录。 目前SDSS网站(中国镜像为 http://sdss.lamost.org/skyserver/en/ ) 默认搜索的数据库是BESTDR9,当然,可以指定SQL搜索其他的数据库。BESTDR9数据库含有大量的表格,一些包含测光观测的源(例如 PhotoObj),一些包含光谱观测的源(例如SpecObj),或者观测条件(Field)或者观测天区的几何位形(TileBoundary)。 除了表格,还有一些经过一些处理(分类)的子表(Views),比如星系子表之类。此外,还有一些相应的函数、子程序等,可以查看 http://skyserver.sdss3.org/dr9/en/help/browser/browser.asp 最简单的SQL脚本应包括三个关键词 SELECT 后面写要获得值的变量名称 FROM 后面写要搜索的表的名称 WHERE 对数据的要求 原 则上WHERE也可以不用,但是那样通常会得到无比庞大的数据输出而无法处理。SELECT后面跟的变量名如果太长,可以用AS指定一个别名。WHERE 指定的条件里可以用逻辑运算关键词AND、OR和NOT进行逻辑运算,也可以用比较算符给出限定。此外还可以进行数学运算。注意,数学运算不仅可以在WHERE后进行,在SELECT后面也可以进行,这个性质很方便,比如可以直接得到星等差(颜色)如下(p.u-p.g AS u_g) SELECT TOP 10 p.u,p.g,p.r,p.i,p.z,p.u-p.g AS u_g FROM PhotoObj AS p WHERE p.u BETWEEN 0 AND 19.6 AND p.g BETWEEN 0 AND 20 如果要将多个表格中的列合并,就需要使用JOIN命令。比如上面的例子中FROM一句可以改为 FROM PhotoObj AS p JOIN SpecObj AS s ON s.bestobjid = p.objid 这样可以取出PhotoObj和SpecObj两个表中的列了。 但是使用SQL进行搜索的时候,应该尽量提高效率,要不然有可能很长时间都无法完成搜索。一个要点就是使用尽量小的表,因为大表中有很多列通常都是不会用到的,每次搜索都搜一遍大表没有必要,对于通常的搜索,在大表的子集(含有同样多的行,列数少得多,但通常会用到的量都有)中进行搜索就行了。比如 PhotoTag就是PhotoObjAll的子集。 此外,SDSS网站还提供了交叉比对的功能,详见 http://skyserver.sdss3.org/dr9/en/tools/crossid/crossid.asp 。更多SQL搜索的例子可以参见 http://sdss.lamost.org/skyserver/en/help/docs/realquery.asp 。
1、表准备 存储所有网页的基本信息 CREATE TABLE ( IDENTITY (1, 1) NOT NULL , (900) COLLATE Chinese_PRC_CI_AS NULL , COLLATE Chinese_PRC_CI_AS NULL , NULL , NULL , CONSTRAINT PRIMARY KEY CLUSTERED ( ) ON ) ON TEXTIMAGE_ON GO 存储网页链接关系 CREATE TABLE ( NULL , (900) COLLATE Chinese_PRC_CI_AS NULL , NULL , (900) COLLATE Chinese_PRC_CI_AS NULL ) ON GO 2、执行脚本,填充WebPages中的REFCOUNT,使之成为链出网页的数量 declare cur_webpages cursor for select docid from webpages declare @docid int open cur_webpages fetch next from cur_webpages into @docid while (@@fetch_status=0) begin declare @rcount int select @rcount=count(*) from pagelinks where docid=@docid update webpages set refcount=@rcount WHERE CURRENT OF cur_webpages fetch next from cur_webpages into @docid end close cur_webpages deallocate cur_webpages 3、填充初始值 update webpages set weight=1.0/(select count(*) from webpages) update webpages set REVWEIGHT=0 4、计算PageRank的SQL脚本 declare @count int set @count=0 while(@count=7) begin declare cur_webpages cursor for select docid,refcount,weight,revweight from webpages declare @docid int declare @refcount int declare @weight float declare @revweight float if(@count%2=0) select docid,weight into pagebak from webpages else select docid,revweight as weight into pagebak from webpages CREATE INDEX ON . ( ) open cur_webpages fetch next from cur_webpages into @docid,@refcount,@weight,@revweight while (@@fetch_status=0) begin if @refcount0 begin if(@count%2=0) update pagebak set weight=weight+(@weight/@refcount) where docid in (select anchordocid from pagelinks where docid=@docid ) else update pagebak set weight=weight+(@revweight/@refcount) where docid in (select anchordocid from pagelinks where docid=@docid ) end fetch next from cur_webpages into @docid,@refcount,@weight,@revweight end close cur_webpages deallocate cur_webpages if(@count%2=0) begin update webpages set revweight=0.2+(select weight from pagebak where pagebak.docid=webpages.docid) update webpages set revweight=revweight/(select sum(revweight) from webpages) end else begin update webpages set weight=0.2+(select weight from pagebak where pagebak.docid=webpages.docid) update webpages set weight=weight/(select sum(weight) from webpages) end drop table pagebak select * from webpages set @count=@count+1 end
知道CiteSpace有这一功能的人大概不多,知道如何使用的大概更少。一是一直没有时间介绍,二来各类论文中也没有机会描述这些功能。 要求:会使用基本的SQL语句(CiteSpace本身带有一些简要的语法提示,可供初学者练习)。 用CiteSpace整理Web of Science格式数据的过程如下: 1。将数据读入CiteSpace自带的数据库 2。检查,更改数据 3。输出整理后的数据 具体步骤如下: 1。将数据读入CiteSpace自带的数据库 a)CiteSpace:Data:Import/Export; b) 打开数据库:Database:Open (下方窗口会显示现有project名称) c) 读入WoS格式数据:先将所有数据存到一个文档,每个文件名以download开始,以。txt结束。 d) 在Create a New Project中,用Browse选定你的数据文档,按Import开始读入数据。按提示输入project名(只要不与数据库中现有的其它project重名即可)。 2。检查,更改数据 a) 菜单中各项功能均可使用。相关SQL会显示在SQL Query and Results下的小窗口内。数据库结构可用Database:Show Data Structure显示。 b)更改数据:Project:Edit CiteSpace提示:UPDATE articles SET article='------', source='------' WHERE project='------' and uid='------' 更改数据需要该数据项的uid,可用SQL查到,例如:select uid from articles where project-‘terrorism' UPDATE语句中SET 后,WHERE前为数据字段的新值,如: UPDATE articles SET title=‘The Investigation of terrorist incidents’ WHERE project=’terrorism' and uid='ISI:A1990EZ80000009‘ 将把记录号为ISI:A1990EZ80000009的那条记录的标题改为The Investigation of terrorist incidents。 3。输出整理后的数据 a)选择输出数据的范围:Project:1。Select a subset for export CiteSpace示例如下:SELECT uid FROM articles WHERE project='terrorism' and dt='Article' and year=2000 例中将输出名为terrorism的project中2000年为止的所有类型为Article的数据条目。可按自己需要修改语句中WHERE之后的部分。 准备好后按Search(最底下一排)。 b)开始输出到WoS格式的文件:Project:2。Export Data (WoS) 按提示选定输出的目的地文档。可在File Name一栏直接打入文档目录的地址。CiteSpace输出时将显示等待,直到输出完毕。输出文件名的命名规则:download_ _ _of_ 。txt 例如:download_terrorism_300_of_586.txt 数据量越大,等待时间越长。 有没有不清楚的地方?
select code,name, org_lon,org_lat,sum(bytes) as bytes,sum(visitors) as visitors from public.sdb_ac where code in (select DISTINCT code from public.sdb_ac) group by code,name, org_lon,org_lat ;