sql_1

order by
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC;
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC;
insert into
INSERT INTO 表名称 VALUES (值1, 值2,....);
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....);
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing');
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees');
update
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值;
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' ;
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson';
delete
DELETE FROM 表名称 WHERE 列名称 = 值;
DELETE FROM Person WHERE LastName = 'Wilson';
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
DELETE FROM table_name;
DELETE * FROM table_name;
top mysql 
SELECT * FROM Persons LIMIT 5;
like
SELECT * FROM Persons WHERE City LIKE 'N%';
提示:"%" 可用于定义通配符(模式中缺少的字母)。
以g结尾的city
SELECT * FROM Persons WHERE City LIKE '%g';
包含lon的city
SELECT * FROM Persons WHERE City LIKE '%lon%';
不包含
SELECT * FROM Persons WHERE City NOT LIKE '%lon%';

 其他通配符
%                                   替代一个或多个字符
_                                   仅替代一个字符
[charlist]                           字符列中的任何单一字符
[^charlist] 或者 [!charlist]  不在字符列

---------------------------------
SELECT * FROM Persons  WHERE FirstName LIKE '_eorge';

SELECT * FROM Persons  WHERE LastName LIKE 'C_r_er';

我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:
SELECT * FROM Persons  WHERE City LIKE '[ALN]%';
上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人:
SELECT * FROM Persons  WHERE City LIKE '[!ALN]%';
in
语法
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);

---------------
SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter');

----------------------------------------
between .....and
以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人,
SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter';

SELECT * FROM Persons
WHERE LastName
NOT BETWEEN 'Adams' AND 'Carter';
Alias
SELECT column_name AS alias_name
FROM table_name;
join
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P ;

-------------或者
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName;
JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName;

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName;

希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName;
union
UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2;

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA;
select into
SQL 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 LastName,FirstName
INTO Persons_backup
FROM Persons;

下面的例子通过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建了一个带有两个列的名为 "Persons_backup" 的表:
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;

从其他表筛选部分字段,结合默认字段值给新表添加数据
insert into sp_seller (user_id,seller_no,level,status,CREATED_BY,CREATED_ON,UPDATED_BY,UPDATED_ON) select id,substr(role_no,1,3),1,0,'sys',now(),'sys',now() from sp_user where user_type=9 ;

 

视图
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
create or replace view v_user (user_id,seller_uid,user_type,nick_name,real_name,bind_mobile, registre_time) as select u.id, case when u.user_type = 9 then u.id else u.recommender_id end, u.user_type, u.nick_name, u.REAL_NAME, u.BIND_MOBILE, u.register_time from sp_user u where exists( select 1 from sp_seller s where s.user_id = u.recommender_id) or u.user_type = 9;

SQL DROP VIEW Syntax
DROP VIEW view_name;

 

行转列
select u.real_name,da.inv1,da.inv3,da.inv6,da.inv9,da.inv12 from sp_user u left join(

select seller_id,sum(amount),
    sum(case due_time when 1 then amount else 0 end) inv1,
    sum(case due_time when 3 then amount else 0 end) inv3,
    sum(case due_time when 6 then amount else 0 end) inv6,
    sum(case due_time when 9 then amount else 0 end) inv9,
    sum(case due_time when 12 then amount else 0 end) inv12    
    from sp_investing where buy_time > 20150703000000 and buy_time < 20150708000000 and seller_id >0 group by seller_id) da on u.id=da.seller_id where u.user_type=9;

 

索引
CREATE INDEX
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

CREATE INDEX index_name
ON table_name (column_name)
注释:"column_name" 规定需要索引的列。

在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)

 删除索引
用于 MySQL 的语法:
ALTER TABLE table_name DROP INDEX index_name;
TRUNCATE TABLE 表名称
如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?
请使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据):
TRUNCATE TABLE 表名称
ALTER

ALTER TABLE 语句用于在已有的表中添加、修改或删除列。

ALTER TABLE table_name
ADD column_name datatype;

ALTER TABLE table_name
ALTER COLUMN column_name datatype;

现在,我们希望在表 "Persons" 中添加一个名为 "Birthday" 的新列。
我们使用下列 SQL 语句:
ALTER TABLE Persons ADD Birthday date;

ALTER TABLE Person
DROP COLUMN Birthday;
自增mysql

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

要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:
ALTER TABLE Persons AUTO_INCREMENT=100;

用于 SQL Server 的语法
下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:
CREATE TABLE Persons
(
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
MS SQL 使用 IDENTITY 关键字来执行 auto-increment 任务。
默认地,IDENTITY 的开始值是 1,每条新记录递增 1。
要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10);

Oracle 
您必须通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。
请使用下面的 CREATE SEQUENCE 语法:
CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
上面的代码创建名为 seq_person 的序列对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高访问速度要存储多少个序列值。
要在 "Persons" 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):
INSERT INTO Persons (P_Id,FirstName,LastName)
VALUES (seq_person.nextval,'Lars','Monsen')
上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 的赋值是来自 seq_person 序列的下一个数字。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。
MySQL Date
下面的表格列出了 MySQL 中最重要的内建日期函数:
函数                                描述
NOW()                    返回当前的日期和时间
CURDATE()            返回当前的日期
CURTIME()               返回当前的时间
DATE()                    提取日期或日期/时间表达式的日期部分
EXTRACT()                    返回日期/时间按的单独部分
DATE_ADD()            给日期添加指定的时间间隔
DATE_SUB()            从日期减去指定的时间间隔
DATEDIFF()            返回两个日期之间的天数
DATE_FORMAT()    用不同的格式显示日期/时间 

SQL Date 数据类型
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
YEAR - 格式 YYYY 或 YY
                                     
DATETIME
日期和时间的组合。支持的范围是'1000-01-01 00:00:00''9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,但允许使用字符串或数字为DATETIME列分配值。
 TIMESTAMP[(M)]
时间戳。范围是'1970-01-01 00:00:00'到2037年。
TIMESTAMP列用于INSERT或UPDATE操作时记录日期和时间。如果你不分配一个值,表中的第一个TIMESTAMP列自动设置为最近操作的日期和时间。也可以通过分配一个NULL值,将TIMESTAMP列设置为当前的日期和时间。

TIMESTAMP值返回后显示为'YYYY-MM-DD HH:MM:SS'格式的字符串,显示宽度固定为19个字符。如果想要获得数字值,应在TIMESTAMP 列添加+0
null

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

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

MySQL
MySQL 也拥有类似 ISNULL() 的函数。不过它的工作方式与微软的 ISNULL() 函数有点不同。
在 MySQL 中,我们可以使用 IFNULL() 函数,就像这样:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
或者我们可以使用 COALESCE() 函数,就像这样:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products
MySQL 数据类型
在 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)     -128127 常规。0255 无符号*。在括号中规定最大位数。
SMALLINT(size)    -3276832767 常规。065535 无符号*。在括号中规定最大位数。
MEDIUMINT(size)   -83886088388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。
INT(size)         -21474836482147483647 常规。04294967295 无符号*。在括号中规定最大位数。
BIGINT(size)      -92233720368547758089223372036854775807 常规。018446744073709551615 无符号*。在括号中规定最大位数。
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 位格式所允许的值:190121552 位格式所允许的值:7069,表示从 19702069* 即便 DATETIMETIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERTUPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。    
sql  服务器

DBMS - 数据库管理系统(Database Management System)
数据库管理系统是一种可以访问数据库中数据的计算机程序。
DBMS 使我们有能力在数据库中提取、修改或者存贮信息。
不同的 DBMS 提供不同的函数供查询、提交以及修改数据。
RDBMS - 关系数据库管理系统(Relational Database Management System)
关系数据库管理系统 (RDBMS) 也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。
20 世纪 70 年代初,IBM 公司发明了 RDBMS。
RDBMS 是 SQL 的基础,也是所有现代数据库系统诸如 Oracle、SQL Server、IBM DB2、Sybase、MySQL 以及 Microsoft Access 的基础。

 

函数的语法
内建 SQL 函数的语法是:
SELECT function(列) FROM 表;

AVG 函数返回数值列的平均值。NULL 值不包括在计算中。

现在,我们希望找到 OrderPrice 值高于 OrderPrice 平均值的客户。
我们使用如下 SQL 语句:
SELECT Customer FROM Orders
WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders);

SQL COUNT() 语法
SQL COUNT(column_name) 语法
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECT COUNT(column_name) FROM table_name

现在,我们希望计算 "Orders" 表中不同客户的数目。
我们使用如下 SQL 语句:
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders;

FIRST() 函数
FIRST() 函数返回指定的字段中第一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
SQL FIRST() 语法
SELECT FIRST(column_name) FROM table_name;

MAX() 函数
MAX 函数返回一列中的最大值。NULL 值不包括在计算中。
SQL MAX() 语法
SELECT MAX(column_name) FROM table_name;
现在,我们希望查找 "OrderPrice" 列的最大值。
我们使用如下 SQL 语句:
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders;

MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
SQL MIN() 语法
SELECT MIN(column_name) FROM table_name

SUM() 函数
SUM 函数返回数值列的总数(总额)。
SQL SUM() 语法
SELECT SUM(column_name) FROM table_name;

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

现在,我们希望查找订单总金额少于 2000 的客户。
我们使用如下 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000;

现在我们希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。
我们在 SQL 语句中增加了一个普通的 WHERE 子句:
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500;
UCASE() 函数
UCASE 函数把字段的值转换为大写。
SQL UCASE() 语法
SELECT UCASE(column_name) FROM table_name;

我们使用如下 SQL 语句:
SELECT UCASE(LastName) as LastName,FirstName FROM Persons;

LCASE() 函数
LCASE 函数把字段的值转换为小写。
SQL LCASE() 语法
SELECT LCASE(column_name) FROM table_name;
MID() 函数
MID 函数用于从文本字段中提取字符。
SQL MID() 语法
SELECT MID(column_name,start[,length]) FROM table_name;

现在,我们希望从 "City" 列中提取前 3 个字符。
我们使用如下 SQL 语句:
SELECT MID(City,1,3) as SmallCity FROM Persons;


参数                     描述
column_name    必需。要提取字符的字段。
start                    必需。规定开始位置(起始值是 1)。
length            可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。                        

 

ROUND() 函数
ROUND 函数用于把数值字段舍入为指定的小数位数。
SQL ROUND() 语法
SELECT ROUND(column_name,decimals) FROM table_name

参数                    描述
column_name    必需。要舍入的字段。
decimals            必需。规定要返回的小数位数。                

现在,我们希望把名称和价格舍入为最接近的整数。
我们使用如下 SQL 语句:
SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products;

NOW() 函数
NOW 函数返回当前的日期和时间。
提示:如果您在使用 Sql Server 数据库,请使用 getdate() 函数来获得当前的日期时间。
SQL NOW() 语法
SELECT NOW() FROM table_name;

现在,我们希望显示当天的日期所对应的名称和价格。
我们使用如下 SQL 语句:
SELECT ProductName, UnitPrice, Now() as PerDate FROM Products;
FORMAT() 函数
FORMAT 函数用于对字段的显示进行格式化。
SQL FORMAT() 语法
SELECT FORMAT(column_name,format) FROM table_name;

现在,我们希望显示每天日期所对应的名称和价格(日期的显示格式是 "YYYY-MM-DD")。
我们使用如下 SQL 语句:
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate
FROM Products;

 

posted @ 2015-07-06 23:33  ~清风煮酒~  阅读(272)  评论(0编辑  收藏  举报