【详解】SQL语句

来源:互联网 发布:自学java难度大吗 编辑:程序博客网 时间:2024/06/05 13:35

系统学过一遍SQL的知识,但写的时候还是有些地方会想不起来,不清楚。

所以在此系统的梳理一遍比较常用的,从头学习,也从头记忆一遍。


【重要事项】SQL对大小写不敏感。

所以如果SELECT大写别的就要小写,select这种的小写,字段名和表名就要大写。


最基础简单的语句,这里就不赘述了。我们只对常用但总容易忘的进行说明:

1.

SELECT DISTINCT 语句

在表中,有时候会包含重复值。

不过,有时我们希望仅仅列出不同(distinct)的值。

关键词 DISTINCT 用于返回唯一不同的值。

如果要从 "Company" 列中选取所有的值,我们需要使用 SELECT 语句:

SELECT Company FROM Orders

"Orders"表:

CompanyOrderNumberIBM3532W3School2356Apple4698W3School6953

结果:

CompanyIBMW3SchoolAppleW3School

请注意,在结果集中,W3School 被列出了两次。

如需从 Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句:

SELECT DISTINCT Company FROM Orders 

结果:

CompanyIBMW3SchoolApple

现在,在结果集中,"W3School" 仅被列出了一次。


2. where语句中的操作符

下面的运算符可在 WHERE 子句中使用:

操作符描述=等于<>不等于>大于<小于>=大于等于<=小于等于BETWEEN在某个范围内LIKE搜索某种模式

注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。

3. 引号的使用

SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

文本值:

这是正确的:SELECT * FROM Persons WHERE FirstName='Bush'这是错误的:SELECT * FROM Persons WHERE FirstName=Bush

数值:

这是正确的:SELECT * FROM Persons WHERE Year>1965这是错误的:SELECT * FROM Persons WHERE Year>'1965'

4.and和or运算符

AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。

如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。

SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'

如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'

AND和OR运算符可以结合使用:

SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')AND LastName='Carter'
5. order by

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照升序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。


字母顺序显示公司名称:

SELECT Company, OrderNumber FROM Orders ORDER BY Company

结果:

CompanyOrderNumberApple4698IBM3532W3School6953W3School2356

逆字母顺序显示公司名称:

SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC

结果:

CompanyOrderNumberW3School6953W3School2356IBM3532Apple4698

6. insert into

语法

INSERT INTO 表名称 VALUES (值1, 值2,....)

我们也可以指定所要插入数据的列:

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

前者是插入一整行,后者是插入一行中某些列


7. update

语法:

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
LastNameFirstNameAddressCityGatesBillXuanwumen 10BeijingWilson Champs-Elysees 
修改一列UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' 
修改两列UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'WHERE LastName = 'Wilson'

8. delete

DELETE FROM 表名称 WHERE 列名称 = 值

Person:

LastNameFirstNameAddressCityGatesBillXuanwumen 10BeijingWilsonFredZhongshan 23Nanjing

删除某行

"Fred Wilson" 会被删除:

DELETE FROM Person WHERE LastName = 'Wilson' 

删除所有行

可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:

DELETE FROM table_name

9.between

SQL BETWEEN 语法

SELECT column_name(s)FROM table_nameWHERE column_nameBETWEEN value1 AND value2
sql='select ID from SELLING_GOODS where ID between %s and %s'%(1963259, 1963829)

10. 别名
sql = 'SELECT O.GAME_ID, SUM(O.AMOUNT) AS AMOUNT, SUM(O.BALANCE_AMOUNT) AS BALANCE_AMOUNT, SUM(O.CHARGE_AMOUNT) AS CHARGE_AMOUNT, SUM(IFNULL(V.TEMP_AMOUNT, 0)) AS VOUCHER_AMOUNT FROM moyoyo_sdk.ORDER_INFO O LEFT JOIN netgame_trade.VOUCHER V ON V.ID = O.VOUCHER_ID WHERE O.CREATED_DATE >= "%s" AND O.CREATED_DATE < "%s" AND O.PAY_TYPE !=- 1 AND O.STATUS = 1 GROUP BY O.GAME_ID; '%(handleDateStr, todayStr)
这一句设置了列的别名,还有表的别名
FROM moyoyo_sdk.ORDER_INFO O

11. join
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。

Persons、Orders两张表

可以这样写:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM Persons, OrdersWHERE Persons.Id_P = Orders.Id_P 

也可以用join关键字这样写:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsINNER JOIN OrdersON Persons.Id_P = Orders.Id_PORDER BY Persons.LastName

join中有这么几种关键字:inner join、left join、right join、full join

这里以这两张表为例:

"Persons" 表:

Id_PLastNameFirstNameAddressCity1AdamsJohnOxford StreetLondon2BushGeorgeFifth AvenueNew York3CarterThomasChangan StreetBeijing

"Orders" 表:

Id_OOrderNoId_P177895324467833224561424562153476465

inner join:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsINNER JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName

结果集:

LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678只返回匹配的就是inner join!!!


left join:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsLEFT JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName

结果集:

LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678BushGeorge 发现,左表中没有匹配项的2,还返回了Bush!即从左表中返回所有的行!


right join:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsRIGHT JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName

结果集:

LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678  34764从右表中返回所有的行!


full join:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsFULL JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName

结果集:

LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678BushGeorge   34764返回所有的行!


12. sum与group by

"Orders" 表:O_IdOrderDateOrderPriceCustomer12008/12/291000Bush22008/11/231600Carter32008/10/05700Bush42008/09/28300Bush52008/08/062000Adams62008/07/21100Carter

SELECT SUM(OrderPrice) AS OrderTotal FROM Orders

结果集类似这样:

OrderTotal5700


group by

sum函数常常需要添加group by。

还是上面的orders表,如果我们想要得到每个客户的订单总额。

SELECT Customer,SUM(OrderPrice) FROM OrdersGROUP BY Customer

结果集类似这样:

CustomerSUM(OrderPrice)Bush2000Carter1700Adams2000


0 0