sql 整理

1SELECT DISTINCT 列名称 FROM 表名称

2<> 不等于

3SELECT TOP number|percent column_name(s) FROM table_name

  sqlserver : top

 mysqloracle : select column_name from tab_name limit offset , rows

SELECT username FROM user LIMIT 4,10
如果 user 表中的数据记录超过14条的话,该例子将会返回符合结果的第 5-14 条记录(共 10 条),注意默认偏移量是从 0 开始的。
offset 参数如果省略,则默认为 0 ,即 LIMIT 10 等同于 LIMIT 0,10 (返回符合查询条件的前 10 条记录)。

db2 : select column_name from tab_name fetch first 10 rows only

4SQL 通配符 : 可以替代一个或多个字符;必须与 LIKE 运算符一起使用

替代一个或多个

_ 替代一个  eg : SELECT * FROM Persons WHERE FirstName LIKE '_eorge'

           SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'

[charlist] 字符列中的任何单一字符 

egSELECT * FROM Persons WHERE City LIKE '[ALN]%' "Persons" 表中选取居住的城市以 "A" "L" "N" 开头的人

[^charlist]或者[!charlist]  不在字符列中的任何单一字符

eg:SELECT * FROM Persons WHERE City LIKE '[!ALN]%'

从上面的 "Persons" 表中选取居住的城市不以 "A" "L" "N" 开头的人

5、BETWEEN 操作符(包头不包尾) 不同数据库用法不同

BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期

eg:以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人

SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'

6、连接

可以通过引用两个表的方式,从两个表中获取数据

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons, Orders

WHERE Persons.Id_P = Orders.Id_P

使用join

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons

INNER JOIN Orders

ON Persons.Id_P = Orders.Id_P

ORDER BY Persons.LastName

 

不同的 SQL JOIN:除了我们在上面的例子中使用的 INNER JOIN(内连接),我们还可以使用其他几种连接。

JOININNER JOIN: 如果表中有至少一个匹配,则返回行

LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

FULL JOIN: 只要其中一个表中存在匹配,就返回行

INNER JOIN: 返回persons表存在且orders表也存在的数据

 sql 整理

现在,我们希望列出所有人的定购。

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons

INNER JOIN Orders

ON Persons.Id_P=Orders.Id_P

ORDER BY Persons.LastName

 sql 整理

 

LEFT JOIN:每条person中的数据对应orders中的数据(具体条数看是否person一条对应orders多条),不一定是persons有多少条数据,结果集就有多少条

 sql 整理

左连接(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

 sql 整理

 

RIGHT JOIN:

 sql 整理

 

右连接(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

 sql 整理

 

FULL JOIN:

 sql 整理

全连接(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.LastNamesql 整理

7、union/union all

Union: 筛选掉重复的记录;按照字段的顺序进行排序;效率低

Union all:不筛选重复记录,不排序,效率高

对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。

对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。

从效率上说,UNION ALL 要比UNION快很多

所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL

关键字写在两条sql语句之间:

eg1:

SELECT E_Name FROM Employees_China

UNION

SELECT E_Name FROM Employees_USA

eg2

SELECT E_Name FROM Employees_China

UNION ALL

SELECT E_Name FROM Employees_USA

8、sql约束

UNIQUE 约束唯一标识数据库表中的每条记录。

UNIQUE PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

 mysql : unique(id)

sqlserver: id int not null unique

命名及定义多列unique约束

constraint  UN_id  unique(id,name)

在已创建表上添加unique约束

alter table persons add unique(id)

为已创建表添加多个unique约束

alter table persons contraint UN_id unique(id,name)


9、sql 日期函数

Mysql:

 sql 整理

Date():返回年月日

SELECT  DATE( createTime )  FROM  `t_user`  WHERE id =1

 2017-06-01

Time():返回时分秒

SELECT TIME( updateTime )  FROM  `t_user`  WHERE id =2

 12:01:25

EXTRACT() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等

EXTRACT(unit FROM date)

Unit

MICROSECOND

SECOND

MINUTE

HOUR

DAY

WEEK

MONTH

QUARTER

YEAR

SECOND_MICROSECOND

MINUTE_MICROSECOND

MINUTE_SECOND

HOUR_MICROSECOND

HOUR_SECOND

HOUR_MINUTE

DAY_MICROSECOND

DAY_SECOND

DAY_MINUTE

DAY_HOUR

YEAR_MONTH

 sql 整理

 

DATE_ADD() 函数向日期添加指定的时间间隔

DATE_ADD(date,INTERVAL expr type)

date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔

Type :

MICROSECOND

SECOND

MINUTE

HOUR

DAY

WEEK

MONTH

QUARTER

YEAR

SECOND_MICROSECOND

MINUTE_MICROSECOND

MINUTE_SECOND

HOUR_MICROSECOND

HOUR_SECOND

HOUR_MINUTE

DAY_MICROSECOND

DAY_SECOND

DAY_MINUTE

DAY_HOUR

YEAR_MONTH

 sql 整理

 

DATEDIFF(date1,date2)

SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate

 

DATE_FORMAT(date,format)   format 规定日期/时间的输出格式

 sql 整理

 

SELECT OrderId,DATEADD(day,2,OrderDate) AS OrderPayDate

FROM Orders

date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。

SELECT DATEDIFF(day,'2008-12-29','2008-12-30') AS DiffDate

 

10、Having

SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

SELECT Customer,SUM(OrderPrice) FROM Orders

WHERE Customer='Bush' OR Customer='Adams'

GROUP BY Customer

HAVING SUM(OrderPrice)>1500

11mid()

MID 函数用于从文本字段中提取字符。

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

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

11、round()

ROUND 函数用于把数值字段舍入为指定的小数位数。

SELECT ROUND(column_name,decimals) FROM table_name

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