找回密码
 FreeOZ用户注册
12
返回列表 发新帖回复
楼主: xblues
打印 上一主题 下一主题

[数据库] 复习SQL查询知识

[复制链接]
31#
 楼主| 发表于 15-6-2009 22:24:19 | 只看该作者

CREATE INDEX 建立索引

提示: 作者被禁止或删除, 无法发言
鉴于更新拥有多个索引的表所需要的时间比更新独立表更长,所以仅仅建立必要的索引。
Updating a table with indexes takes more time than updating a table without (because the indexes also need an update). So you should only create indexes on columns (and tables) that will be frequently searched against.

CREATE INDEX index_name
ON table_name (column_name)

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

CREATE INDEX PIndex
ON Persons (LastName)

CREATE INDEX PIndex
ON Persons (LastName, FirstName)

DROP INDEX index_name ON table_name

DROP INDEX table_name.index_name

DROP INDEX index_name

ALTER TABLE table_name DROP INDEX index_name

DROP TABLE table_name

DROP DATABASE database_name

TRUNCATE用于清空表记录,而保留表结构
TRUNCATE TABLE table_name
回复  

使用道具 举报

32#
 楼主| 发表于 15-6-2009 22:26:19 | 只看该作者

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 DateOfBirth date

ALTER TABLE Persons
ALTER COLUMN DateOfBirth year

ALTER TABLE Persons
DROP COLUMN DateOfBirth
回复  

使用道具 举报

33#
发表于 15-6-2009 22:33:39 | 只看该作者


如果a是个变量,返回的结果集是单个值,这样可以用column m的值给a赋值
不过一遍sql中的变量都带有@标记

评分

参与人数 1威望 +30 收起 理由
xblues + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

34#
 楼主| 发表于 15-6-2009 22:52:11 | 只看该作者

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)
)

ALTER TABLE Persons AUTO_INCREMENT=100

CREATE TABLE Persons
(
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen')

CREATE TABLE Persons
(
P_Id PRIMARY KEY AUTOINCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen')
回复  

使用道具 举报

35#
 楼主| 发表于 15-6-2009 23:24:28 | 只看该作者

Views 视图

提示: 作者被禁止或删除, 无法发言
A view is a virtual table.
视图是一个虚拟表,也可以理解成一个临时表,用于存储中间结果。

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

CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)

CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName

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
回复  

使用道具 举报

36#
 楼主| 发表于 15-6-2009 23:26:33 | 只看该作者

Views 视图

提示: 作者被禁止或删除, 无法发言
A view is a virtual table.
视图是一个虚拟表,也可以理解成一个临时表,用于存储中间结果。

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

CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)

CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName

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
回复  

使用道具 举报

37#
 楼主| 发表于 15-6-2009 23:33:02 | 只看该作者

date 日期型数据格式

提示: 作者被禁止或删除, 无法发言
SELECT * FROM Orders WHERE OrderDate='2008-11-11'


MySQL 提供的日期函数比较丰富
Function         Description
NOW()         Returns the current date and time
CURDATE()         Returns the current date
CURTIME()         Returns the current time
DATE()         Extracts the date part of a date or date/time expression
EXTRACT()         Returns a single part of a date/time
DATE_ADD()         Adds a specified time interval to a date
DATE_SUB()         Subtracts a specified time interval from a date
DATEDIFF()         Returns the number of days between two dates
DATE_FORMAT()         Displays date/time data in different formats

MS SQL 怎不那么多了
Function         Description
GETDATE()         Returns the current date and time
DATEPART()         Returns a single part of a date/time
DATEADD()         Adds or subtracts a specified time interval from a date
DATEDIFF()         Returns the time between two dates
CONVERT()         Displays date/time data in different formats


SQL Date Data Types

MySQL comes with the following data types for storing a date or a date/time value in the database:
  • DATE - format YYYY-MM-DD
  • DATETIME - format: YYYY-MM-DD HH:MM:SS
  • TIMESTAMP - format: YYYY-MM-DD HH:MM:SS
  • YEAR - format YYYY or YY
SQL Server comes with the following data types for storing a date or a date/time value in the database:
  • DATE - format YYYY-MM-DD
  • DATETIME - format: YYYY-MM-DD HH:MM:SS
  • SMALLDATETIME - format: YYYY-MM-DD HH:MM:SS
  • TIMESTAMP - format: a unique number
回复  

使用道具 举报

38#
 楼主| 发表于 15-6-2009 23:38:07 | 只看该作者

空值

提示: 作者被禁止或删除, 无法发言
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products


SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
回复  

使用道具 举报

39#
 楼主| 发表于 15-6-2009 23:43:12 | 只看该作者

数据类型

提示: 作者被禁止或删除, 无法发言
这个可以详细看这里:

http://www.w3schools.com/sql/sql_datatypes.asp
回复  

使用道具 举报

40#
 楼主| 发表于 15-6-2009 23:47:13 | 只看该作者

Aggregate 聚合函数

提示: 作者被禁止或删除, 无法发言
*  AVG() - Returns the average value
    * COUNT() - Returns the number of rows
    * FIRST() - Returns the first value
    * LAST() - Returns the last value
    * MAX() - Returns the largest value
    * MIN() - Returns the smallest value
    * SUM() - Returns the sum
回复  

使用道具 举报

41#
 楼主| 发表于 15-6-2009 23:47:54 | 只看该作者

Scalar functions 统计函数

提示: 作者被禁止或删除, 无法发言
*  UCASE() - Converts a field to upper case
    * LCASE() - Converts a field to lower case
    * MID() - Extract characters from a text field
    * LEN() - Returns the length of a text field
    * ROUND() - Rounds a numeric field to the number of decimals specified
    * NOW() - Returns the current system date and time
    * FORMAT() - Formats how a field is to be displayed
回复  

使用道具 举报

42#
 楼主| 发表于 16-6-2009 00:13:39 | 只看该作者
提示: 作者被禁止或删除, 无法发言
SELECT AVG(column_name) FROM table_name

SELECT AVG(OrderPrice) AS OrderAverage FROM Orders

SELECT Customer FROM Orders
WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)

SELECT COUNT(column_name) FROM table_name

SELECT COUNT(*) FROM table_name

SELECT COUNT(DISTINCT column_name) FROM table_name

SELECT COUNT(Customer) AS CustomerNilsen FROM Orders
WHERE Customer='Nilsen'

SELECT COUNT(*) AS NumberOfOrders FROM Orders

SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders

SELECT FIRST(column_name) FROM table_name

SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders

SELECT LAST(column_name) FROM table_name

SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders

SELECT MAX(column_name) FROM table_name

SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders

SELECT MIN(column_name) FROM table_name

SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders

SELECT SUM(column_name) FROM table_name

SELECT SUM(OrderPrice) AS OrderTotal FROM Orders
回复  

使用道具 举报

43#
 楼主| 发表于 16-6-2009 00:18:36 | 只看该作者

GROUP BY 分组查询 聚合查询

提示: 作者被禁止或删除, 无法发言
Group By 挺有意思的,注意 SELECT 后边不能用*,而是必须明确指明字段,而GROUP BY后边跟的条件字段集需要和前面SELECT后边的字段集合一直(顺序可以不一样),SELECT去掉后边用来GROUP的字段,剩下的项目一定是用聚合函数包围的字段。明白了么?

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer

SELECT Customer,SUM(OrderPrice) FROM Orders

SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate

[ 本帖最后由 xblues 于 8-7-2010 01:37 编辑 ]
回复  

使用道具 举报

44#
 楼主| 发表于 16-6-2009 00:31:37 | 只看该作者

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

引入HAVING的原因是因为聚合函数不能够用于WHERE从句

The HAVING clause was added to SQL because the WHERE keyword could not be used with aggregate functions.

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000

SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Hansen' OR Customer='Jensen'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
回复  

使用道具 举报

45#
 楼主| 发表于 16-6-2009 00:37:58 | 只看该作者
提示: 作者被禁止或删除, 无法发言
SELECT UCASE(column_name) FROM table_name

SELECT UCASE(LastName) as LastName,FirstName FROM Persons

SELECT LCASE(column_name) FROM table_name

SELECT LCASE(LastName) as LastName,FirstName FROM Persons

SELECT MID(column_name,start[,length]) FROM table_name

SELECT MID(City,1,4) as SmallCity FROM Persons

SELECT LEN(column_name) FROM table_name

SELECT ROUND(column_name,decimals) FROM table_name

SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products

SELECT NOW() FROM table_name

SELECT ProductName, UnitPrice, Now() as PerDate FROM Products

SELECT FORMAT(column_name,format) FROM table_name

SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate
FROM Products
回复  

使用道具 举报

46#
 楼主| 发表于 16-6-2009 00:58:28 | 只看该作者

这里是一个总结,可以是一个速查手册

提示: 作者被禁止或删除, 无法发言
回复  

使用道具 举报

47#
 楼主| 发表于 16-6-2009 01:14:38 | 只看该作者

存储过程

提示: 作者被禁止或删除, 无法发言
这里有简要介绍
http://databases.about.com/od/sqlserver/a/storedprocedure.htm

使用存储过程的好处
    * Precompiled execution. SQL Server compiles each stored procedure once and then reutilizes the execution plan. This results in tremendous performance boosts when stored procedures are called repeatedly.
    * Reduced client/server traffic. If network bandwidth is a concern in your environment, you'll be happy to learn that stored procedures can reduce long SQL queries to a single line that is transmitted over the wire.
    * Efficient reuse of code and programming abstraction. Stored procedures can be used by multiple users and client programs. If you utilize them in a planned manner, you'll find the development cycle takes less time.
    * Enhanced security controls. You can grant users permission to execute a stored procedure independently of underlying table permissions.
回复  

使用道具 举报

48#
 楼主| 发表于 16-6-2009 01:17:18 | 只看该作者

简单的存储过程的例子

提示: 作者被禁止或删除, 无法发言
结构如下:

定义存储过程
声明变量
SQL语句+变量


CREATE PROCEDURE sp_GetInventory
@location varchar(10)
AS
SELECT Product, Quantity
FROM Inventory
WHERE Warehouse = @location

执行格式:
EXECUTE sp_GetInventory 'FL'
EXECUTE sp_GetInventory 'NY'
回复  

使用道具 举报

49#
 楼主| 发表于 16-6-2009 01:22:55 | 只看该作者

一个稍微复杂的存储过程例子

提示: 作者被禁止或删除, 无法发言
http://www.sql-server-performanc ... ures_basics_p5.aspx
  1. /*
  2. Name:  usp_adduser
  3. Description:  Add new logins.
  4. Author:  Tom O’Neill
  5. Modification Log: Change

  6. Description                  Date         Changed By
  7. Created procedure            7/15/2003    Tom O’Neill
  8. */



  9. CREATE PROCEDURE usp_adduser

  10. @login varchar(20),
  11. @pswd varchar(20),
  12. @f_name varchar(25),
  13. @l_name varchar(35),
  14. @address_1 varchar(30),
  15. @address_2 varchar(30),
  16. @city varchar(30),
  17. @state char(2),
  18. @zipcode char(10),
  19. @email varchar(50)

  20. AS

  21. INSERT INTO USERLIST (login, pswd, f_name, l_name, address_1, address_2, city, state, zipcode, email)

  22. VALUES (@login, @pswd, @f_name, @l_name, @address_1, @address_2, @city, @state, @zipcode, @email)

复制代码
  1. exec usp_adduser 'dnelson', 'dean2003', 'Dean', 'Nelson', '200 Berkeley Street', ' ', 'Boston', 'MA', '02116', 'dnelson@test.com'
复制代码
回复  

使用道具 举报

50#
发表于 16-6-2009 10:02:52 | 只看该作者
去找了找自信:

W3Schools SQL Quiz
Result:
20 of 20
100%

Perfect!!!

Time Spent
5:44

评分

参与人数 1威望 +30 收起 理由
xblues + 30 你太有才了!

查看全部评分

回复  

使用道具 举报

51#
发表于 16-6-2009 11:12:57 | 只看该作者
已经7年没用sql了,result和楼上一样。yeah!! :-)

评分

参与人数 1威望 +30 收起 理由
xblues + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

52#
发表于 16-6-2009 15:22:19 | 只看该作者
俺大概也5-6年没碰过SQL了,结果也一样啊,只能说太简单了。

Result:
20 of 20
100%
Perfect!!!
Time Spent
4:46
回复  

使用道具 举报

53#
 楼主| 发表于 16-6-2009 19:38:01 | 只看该作者
提示: 作者被禁止或删除, 无法发言
这个教程和测试都是最基础的了,真的实际应用还是要比这个复杂得多的。
一般一个语句都包含了数个链接,链接至少3个表,还要包含聚合函数,和分组的。
回复  

使用道具 举报

54#
发表于 16-6-2009 20:40:31 | 只看该作者
我一直在用的,而且用了好几年的,还有一个不对
回复  

使用道具 举报

55#
发表于 18-6-2009 15:43:18 | 只看该作者

回复 #1 xblues 的帖子

我都对了, 不过确实没太多意义。现实比这复杂太多了。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 14-4-2025 01:43 , Processed in 0.030120 second(s), 41 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表