SELECT * FROM tablename
SELECT columnname FROM tablename
SELECT column1, column2 FROM tablename
[]
,MySQL使用重音符`,Oracle使用双引号SELECT QuantityPurchased * PricePerItem FROM Orders
+
,MySQL使用CONCAT()
函数链接字符串,Oracle使用双竖线||
SELECT f_n AS 'first_name' from customers
SELECE something from someshittablename AS another_table_name
LEFT/RIGHT (string, numberOfCharactors)
:从左/右取字符串数据的指定位数,在Oracle中以SUBSTR替代SUBSTRING (string, start, end)
:取得字符串数据的子字符串,在Oracle中以SUBSTR替代LTRIM/RTRIM (string)
:删除字符串数据左侧/右侧的空格CONCAT (string1, string2, string3 ...)
:拼接多个字符串,Oracle中只容许拼接两个字符串UPPER/LOWER (string)
:返回字符串的大/小写RIGHT(RTRIM(something)) AS 'something'
GETDATE/NOW/CURRENT_DATE ()
:三个函数都用于获取当前时间,对应Microsoft SQL Server/MySql/Oracle三家数据库的实现DATEPART (date_part, date_value)
:单独返回某个部分的时间,date_part
为须要返回的时间部分,date_value
为原始时间,MySQL的实现为DATE_FORMAT(date_value, date_format)
,date_value
为原始时间,date_format
为相似于%d
这样的格式用于告诉函数须要返回哪部分时间,date_part
的有效值为:year/quarter/month/dayofyear/day/month/hour/minute/secondDATEDIFF (date_part, start_date, end_date)
:用于计算任意两个不一样日期间相差的时间,在MySQL中该函数之容许计算天数差别,因此date_part
参数不可用,仅须要传入两个日期便可ROUND (NumbericValue, DecimalPlaces)
:对任意数进行四舍五入,NumbericValue
表示要四舍五入的数,DecimalPlaces
表示从第几位开始四舍五入(即须要保留到第几位),以十分位为0,向左为负数,向右为正数RAND ([seed])
:产生一个随机数 ,可选的seed
参数为一个整数,用于每次返回相同的值PI ()
:返回数学运算中的pi值CAST (expression AS data_type)
:将数据从一种类型转换为另外一种类型,expression
表示数据或函数表达式,data_type
表示须要转换到的数据类型,通常状况下SQL在作计算时会进行自动的类型转换,因此不多用到这个函数,它的典型使用场景是当一个日期被保存成了字符串,须要转换为真正的日期数据:CAST('2017-5-1', AS DATETIME)
,Oracle中该函数的参数形式会不同ISNULL/IFNULL/NVL (column_data_maybe_null, if_null_will_use_this_data )
:将NULL值转换为一个有意义的值,对应Microsoft SQL Server/MySql/Oracle三家数据库的实现排序数据的语法以下:sql
SELECT
column1,
column2
FROM table1, table2
ORDER BY column3, column2 DESC
复制代码
ORDER BY
句子老是在FROM
子句以后,FROM
子句老是在SELECT
关键字以后SELECT
和ORDER BY
后面指定的列,多是彻底不一样的一些列ASC
和DESC
来升序/降序排列ORDER BY
后指定了多列,则首先按照第一列排序,如遇相同则相同的行按第二列排序,以此类推SELECT
关键字后,则只须要在ORDER BY
子句中指定计算字段的别名便可(经测试在MySQL中若是计算字段别名带有空格则暂时没法在此引用,由于不能使用引号),若是计算字段没有出如今SELECT
关键字后,则可直接在ORDER BY
子句中指定一个计算字段,例如:SELECT
title,
rental_duration,
rental_rate
FROM film
ORDER BY rental_duration * rental_rate DESC
复制代码
NULL
(Oracle中排在最后,可以使用NULLS FIRST
关键字来强制最早)-数字-字符(字符中首先显示数字字符,再显示普通字符,除Oracle外不区分大小写)来进行排序,反之亦然。SELECT column1, column2
CASE column3
WHEN value1 THEN result1
WHEN value2 THEN value2
(repeat WHEN-THEN any number of times)
[ELSE defaul_result]
END
column4
FROM tablename
复制代码
SELECT
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
(repeat WHEN-THEN any number of times)
[ELSE defaul_result]
END AS custom_column_name,
FROM tablename
# 最新版的MySQL语法与书中的语法有细微差异:
# ELSE子句最后不须要逗号
SELECT
title,
CASE
WHEN rental_duration = 3 THEN 'Three Day Left'
WHEN rental_rate = 0.99 THEN 'Cheapest'
ELSE 'Normal'
END AS 'Rental Status'
FROM film
复制代码
WHERE
子句开始WHERE
子句老是在FROM
和ORDER BY
子句之间,实际上任何“子句”都必须按照这个顺序来SELECT columnList
FROM tableList
WHERE condition
ORDER BY columnList
复制代码
WHERE
子句操做符,如下这些操做符均可以在基于列的逻辑CASE WHEN condition
语句中使用
=
<>
>
<
>=
<=
SELECT
first_name,
last_name
FROM actor
WHERE age > 18
复制代码
TOP/LIMIT/ROWNUM
(对应Microsoft SQL Server、MySQL和Oracle)限制行数(关键字TOP返回的行,并非真的随机样本,而是根据数据库中的物理存储方式限定了前几行数据而已)# Microsoft SQL Server
SELECT
TOP number
columnList
FROM table
# MySQL
SELECT
columnList
FROM table
LIMIT number
# Oracle
SELECT
columnList
FROM table
WHERE ROWNUM <= number
复制代码
SORT BY
子句作“Top N”查询(基于特定分类,获得带有最大/小值的必定数量的行)# 本月卖得最好的莎士比亚的三本书
# MySQL
SELECT
title AS 'Book Title',
current_month_sale AS 'Quantity Sold'
FROM books
WHERE author = 'Shakespear'
LIMIT 3
ORDER BY current_month_sale DESC
# Oracle中的TOP N查询须要用到子查询,后文会细讲
SELECT * FROM
(SELECT
title AS 'Book Title',
current_month_sale AS 'Quantity Sold'
FROM books
ORDER BY current_month_sale)
WHERE ROWNUM <= 3
复制代码
AND
、或OR
、非NOT
三个关键字在WHERE
子句中表示布尔逻辑。与其它语言的计算顺序同样,AND
的优先级最高,OR
其次,NOT
优先级最低,也可使用()
来改变三者的计算顺序# 这个例子仅为展现布尔逻辑,实际使用不该该这么绕
SELECT
first_name,
last_name,
age
FROM actors
WHERE
NOT(
(age < 18 OR age > 60)
AND last_name = 'Jhon'
)
复制代码
BETWEEN
和IN
,用于替代column >= range_bottom AND column <= range_top
和column = value1 OR column = value2
这样的特例,简化SQL语句的编写# BETWEEN,等价于 age >= 18 AND age <= 60
SELECT
first_name,
last_name,
age
FROM actors
WHERE
age BETWEEN 18 AND 60
# IN,等价于 state = 'IL' AND state = 'NY'
SELECT
customer_name,
state
FROM orders
WHERE state IN ('IL', 'NY')
复制代码
IS NULL
在WHERE
子句中判断一个列是否为空,也能够与函数ISNULL(column, value)
结合使用# 选取重量为0或者没有填写重量的产品
SELECT
product_description,
weight
FROM products
WHERE weight = 0
OR weight IS NULL
# 使用ISNULL等价的写法
SELECE
product_description,
weight
FROM products
WHERE ISNULL(weight, 0) = 0
# IS NULL和ISNULL
SELECT
product_description,
ISNULL(weight, 0) AS 'weight'
FROM products
WHERE weight = 0
OR weight IS NULL
复制代码
WHERE
子句可使用LIKE
操做符来查找针对列值的某部分匹配
SELECT
title
FROM
film
WHERE
title LIKE '%love%'
复制代码
SELECT
title
FROM
film
WHERE
title LIKE 'love%'
复制代码
SELECT
title
FROM
film
WHERE
title LIKE '%love'
复制代码
SELECT
title
FROM
film
WHERE
title LIKE '% love %'
复制代码
符号 | 含义 |
---|---|
% | 任意个任意字符 |
_ | 一个任意字符 |
[characterlist] | 一个指定字符列表中的字符(在MySQL和Oracle中没有) |
[^charactorlist] | 一个非指定字符列表中的字符(在MySQL和Oracle中没有) |
NOT
操做符能够和LIKE
操做符组合使用,例如SELECT
first_name,
last_name
FROM actor
WHERE first_name LIKE '%ARY%'
AND last_name NOT LIKE '[MG]ARY'
复制代码
SOUNDEX
函数:可以输出一个表示字符读音的四字代码(以首字母开头,而后删去剩余字符中全部元音和字母y,最后转换为一个三位数的数字用于表示读音,最后输出相似S530
)DIFFERENCE
函数:能够和SOUNDEX
函数一块儿使用(仅Microsoft SQL Server支持),检查两个字符的SOUNDEX
类似度并返回一个表示读音相近度的数字,(两个字符的SOUNDEX
值共有四个字符,每有一个位置的字符相等,则结果自增1,因此DIFFERENCE
函数的返回值只有0到4五个可能的数字,越大越相近,越小越不一样DISTINCT
关键字来删除输出重复的行# 查看全部艺术家(没有显示相同艺术家的行)
SELECT
DISTINCT
artist
FROM songs
ORDER BY artist
# 查看全部艺术家和专辑的惟一组合(没有显示同一艺术家和同一专辑的行,每一行中艺术家和专辑的组合是惟一的)
SELECT
DISTINCT
artist,
album
FROM songs
ORDER BY artist, album
复制代码
函数 | 解释 |
---|---|
SUM |
合计、加总 |
AVG |
平均值 |
MIN |
最小值 |
MAX |
最大值 |
COUNT |
数量 |
# 总值、均值、最大值、最小值
SELECT
SUN(fee) AS 'Total Gym Fees'
AVG(grade) AS 'Average Quiz Score'
MIN(grade) AS 'Minimum Quiz Score'
MAX(grade) AS 'Maximum Quiz Score'
FROM grades
WHERE grade_type = 'quiz'
# 返回全部选中行的数目
SELECT
COUNT(*) AS 'Count of Homework Rows'
FROM grades
WHERE grade_type = 'homework'
# 返回指定列中存在值的行的数目
SELECT
COUNT(grade) AS 'Count of Homework Rows'
FROM grades
WHERE grade_type = 'homework'
# 与DISTINCT配合返回指定列中惟一值的行数
SELECT
COUNT(DISTINCT fee_type) AS 'Number of Fee Types'
FROM Fees
复制代码
# 统计每一个分级下的电影数量
SELECT
rating, COUNT(rating) AS 'Rating Count'
FROM
film
GROUP BY rating
复制代码
GROUP BY
子句中的列,要么是在聚合函数中使用的列,由于全部内容都在组中出现,不在组中的内容没有办法处理,这种状况下MySQL与其它两种数据库不一样,它只会得出错误的结果,而不会报错# 统计不一样租金率下的不一样分级电影的数量
SELECT
rating,
rental_rate,
COUNT(rating) AS 'Rating Count'
FROM film
GROUP BY rating, rental_rate
复制代码
SUM
、AVG
、MIN
、MAX
、COUNT
)统计的是全部行的数据,在有分组的状况下,这些聚合函数则仅会统计组内的数据,固然实际上也是最终显示的表的每一行的聚合GROUP BY
子句中的columnlist顺序没有意义,但ORDER BY
子句中的顺序是有意义的,通常按照排序的优先顺序来列出这些列会颇有帮助(也即SELECT
中的columnlist与ORDER BY
中的columnlist保持一致)WHERE
子句中的查询条件是针对单独的行来应用的,若是存在GROUP BY
分组,就须要使用HAVING
关键字了# 查看分级中全部电影平均时长大于100分钟的分级中电影的数量
SELECT
rating AS '分级',
COUNT(title) AS '电影数量',
AVG(length) AS '平均时长'
FROM
film
GROUP BY rating
HAVING AVG(length) > 100
ORDER BY 电影数量 DESC
复制代码
SELECT
语句的通常格式以下:SELECT
columnlist
FROM
tablelist
WHERE
condition
GROUP BY
columnlist
HAVING
condition
ORDER BY
COLUMNLIST
复制代码
INNER JOIN
来指定想要链接的第二个表,使用ON
来指定两个表的共同列因为共同列名称是同样的,因此须要在列名前面使用表名做为命名空间来区分两个表中独立的列# 简单地依据customer_id将顾客表和订单表拼接到一个表中
SELECT *
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id
复制代码
FROM
和INNER JOIN
之间的顺序仅会影响哪一个表的列先显示,不会影响行的顺序FROM
和WHERE
也能够指定表的内链接,这是内链接的另外一种范式,但因其没有显示地表示出链接的逻辑,因此不推荐使用(因此其实INNER JOIN ON
的惟一做用仅仅是表达语义而已)SELECT *
FROM customers, orders
WHERE customers.customer_id = orders.customer_id
复制代码
SELECT
c.customer_id AS 'Customer Id',
c.first_name AS 'First Name',
c.last_name AS 'Last Name',
o.order_id AS 'Order Id',
o.quantity AS 'Quantity',
o.price_per_item AS 'Price'
FROM customers AS 'c',
INNER JOIN
复制代码
JOIN
来指定一个内链接LEFT OUTER JOIN
,右链接RIGHT OUTER JOIN
,全链接FULL OUTER JOIN
,其中关键字OUTER
并非必须的。链接类型 | 全称 | 简写 | 用途 |
---|---|---|---|
内链接 | INNER JOIN |
JOIN |
两个表都是主表(primary table),共同列中全部的行都必须同时在这两个表中才会被选中 |
左链接 | LEFT OUTER JOIN |
LEFT JOIN |
左表为主表,右表为从表(secondary table),选中共同列中全部在主表中的行,无论它是否出如今从表 |
右链接 | RIGHT OUTER JOIN |
RIGHT JOIN |
左表为从表,右表为主表,规则同左链接 |
全链接 | FULL OUTER JOIN |
FULL JOIN |
两个表都是从表,共同列中的行只要出如今任意一个表中都会被选中 |
IS NOT NULL
和IS NULL
来过滤空行或显示空行# 过滤了没有订单的客户和有退货的订单
SELECT
customers.first_name AS 'First Name',
customers.last_name AS 'Last Name',
orders.order_date AS 'Order Date',
orders.order_amount AS 'Order Amt'
FROM customers
LEFT JOIN orders
ON orders.customer_id = customers.customre_id
LEFT JOIN refunds
ON orders.order_id = refunds.order_id
WHERE orders.order_id IS NOT NULL
AND refunds.refund_id IS NULL
ORDER BY customers.customer_id, orders.order_id
复制代码
FROM
子句时,建议仅使用关键字LEFT JOIN
而且避免使用圆括号ON
子句中,非自链接的共同列来自两个表,自链接的共同列来自同一个表,因此这时候须要在FROM
关键字和JOIN
关键字后为该表各自建立一个别名用以在ON
子句中进行区分# 列出personnel表中全部员工的经理名字
SELECT
employees.employee_name AS 'Employee Name',
managers.employee_name AS 'Maneger Name'
FROM personnel AS 'employees'
LEFT JOIN personnel AS 'managers'
ON employees.manager_id = managers._employee_id
ORDER BY employee.employee_id
复制代码
SELECT
语句,它不包含任何数据。ORDER BY
子句# 建立视图的语法:
CREATE VIEW view_name AS
select_statement
# 一个建立视图的例子,注意不能有ORDER BY子句
CREATE VIEW customers_orders_refunds AS
SELECT
customers.first_name AS 'First Name',
customers.last_name AS 'Last Name',
orders.order_date AS 'Order Date',
orders.order_amount AS 'Order Amt'
FROM customers
LEFT JOIN orders
ON orders.customer_id = customers.customre_id
LEFT JOIN refunds
ON orders.order_id = refunds.order_id
WHERE orders.order_id IS NOT NULL
AND refunds.refund_id IS NULL
复制代码
# 建立视图
CREATE VIEW view_name AS
select_statement
# 引用视图
SELECT * from view_name
复制代码
# 建立视图
CREATE VIEW customers_view AS
SELECT
first_name AS 'First Name',
last_name AS 'Last Name'
FROM customers
# 引用视图中的列
SELECT
`First Name`,
`Last Name`,
FROM customers_view
WHERE `Last Name` = 'Lopez'
复制代码
SELECT
语句封装为一个视图ALTER
关键字修改一个已经建立的视图,从新指定被封装到其中的SELECT
语句# 整个被封装到视图的select语句都须要从新指定
ALTER VIEW view_name AS
new_select_statement
# 与Microsoft SQL Server和MySQL不一样,Oracle在修改视图以前,须要使用DROP VIEW view_name先删除视图
复制代码
DROP VIEW view_name
来删除视图SELECT
、INSERT
、UPDATE
、DELETE
语句SELECT
语句中子查询能够有三种用法:
SELECT
语句格式以下:SELECT column_list
FROM table_list
WHERE condition
GROUP BY column_list
HAVING condition
ORDER BY column_list
复制代码
table_list
的一部分时,它指定了一个数据源condition
的一部分时,它成为查询条件的一部分column_list
的一部分时,它建立了一个单个的计算的列FROM
子句的一部分时,它当即建立了一个新的数据源,并被当作一个独立的表或视图来引用,与视图的区别是视图是永久保存在数据库中的,而子查询只是临时的# 使用子查询指定数据源的通常格式
SELECT column_list
FROM [table_list]
[JOIN] subquery
AS custom_subquery_name
# 从address表,city表和country表中列出五个地址对应的城市和国家
SELECT
address AS 'Address',
city AS 'City',
country AS 'Country'
FROM address
LEFT JOIN(
SELECT
city.city,
city.city_id,
country.country,
country.country_id
FROM city
LEFT JOIN country
ON city.country_id = country.country_id
) AS city_and_country ON address.city_id = city_and_country.city_id
ORDER BY address
LIMIT 5
复制代码
WHERE
子句中IN
操做符的右值,能够以更复杂的逻辑来为IN
操做符建立一个可选列表;注意,当子查询用于指定查询条件时,仅能返回单一的列# 使用子查询指定查询条件的通常格式
SELECT column_list
FROM table_list
WHERE column IN subquery
SELECT column_list
FROM table_list
WHERE subquery match_some_comdition
# 列出全部使用现金支付的客户名称
SEELCT customer_name AS 'Customer Name'
FROM costomers
WHERE customer_id IN
(
SELECT customer_id
FROM orders
WHERE order_type = 'cash'
)
# 列出订单金额少于20美圆的客户列表
SELECT customer_name AS 'Customer Name'
FROM customers
WHERE
(
SELECT SUM(orderAmount)
FROM orders
WHERE customers.customer_id = orders.customer_id
) < 20
复制代码
# 使用子查询做为计算列的通常格式
SELECT column_list,
subquery_result AS 'Result Alia'
FROM table_list
# 查询客户及其订单数量
SELECT
customer_name AS 'Customer Name',
(
SELECT COUNT(order_id)
FROM orders
WHERE customers.customer_id = orders.customer_id
) AS 'Number of Orders'
FROM customers
ORDER BY customers.customer_id
复制代码
customers
表EXISTS
操做符:用于肯定一个关联子查询中是否存在数据# 查询下过订单的用户
SELECT
customer_name AS 'Customer'
FROM customers
WHERE EXISTS
(
SELECT * FROM orders
WHERE customers.customer_id = orders.customer_id
)
复制代码
在前文中,链接JOIN
能够未来自两个表的列组合到一个表中,子查询则是将一条SELECT
语句的结果提供给第另外一条SELECT
语句使用。然而有时候咱们但愿未来自两个表的行组合到一个表中,这时候就须要使用SQL中的集合逻辑UNION
,来作合并查询。数据库
UNION
-合并两条SELECT
语句,选取在A或B中的数据,若是同时存在在A或B中,仅显示一条SELECT
order_date AS 'Date',
'order' AS 'Type',
order_amount AS 'amount'
FROM orders
WHERE custom_id = 2
UNION
SELECT
return_date AS 'Date',
'return' AS 'type',
return_amount AS 'amount'
FROM returns
WHERE custom_id = 2
ORDER BY date
复制代码
使用UNION
须要遵照3个规则(实际就一条规则:相同列):
SELECT
语句中的列的数量必须相等SELECT
语句中的列排列顺序必须相同SELECT
语句中的列数据类型必须相同UNION ALL
-合并两条SELECT
语句,选取在A或B中的数据,即便同时存在在A或B中,都将显示在结果中SELECT
DISTINCT
order_date AS 'Date'
FROM orders
UNION ALL
SELECT
DISTINCT
return_date AS 'Date'
FROM returns
ORDER BY Date
# UNION 确保来自两个表的行没有重复数据,但 UNION ALL 容许来自两个表的行能够有相同数据
# DISTINCT 确保来自同一个表(或者说同一个SELECT语句)的行没有重复数据
# 因此上面的语句选取的数据可能会存在重复数据,但重复的数据并不来自两个表而是来自同一个表,而且仅会重复一次
复制代码
INTERSECT
-合并两条SELECT
语句,选取同时出如今A和B中的行(MySql不支持该操做符)SELECT order_date AS 'Date'
FROM orders
INTERSECT
SELECT return_date As 'Date'
FROM returns
ORDER BY Date
复制代码
EXCEPT
-合并两条SELECT
语句,选取仅出如今A或仅出如今B中的的数据(MySql和Oracle不支持该操做符,但Oracle提供了等价的MINUS
操做符)SELECT order_date AS 'Date' FROM orders
EXCEPT
SELECT return_date AS 'Date' FROM returns
ORDER BY Date
复制代码
到目前为止,前文全部的SQL语句都是单独使用,然而不少时候,你会但愿SQL语句可以像函数同样,定义一次,而后重复调用,而且可使用参数来增长灵活性。这时,你就可使用存储过程来实现这一目的。express
-- Microsoft SQL Server
CREATE PROCEDURE ProcedureName (OptionalPrameterDeclarations)
AS
BEGIN
SQLStatements
END
-- MySQL
DELIMITER $$ -- 规定END语句使用的分隔符,默认为分号
CREATE PROCEDURE ProcedureName (OptionalPrameterDeclarations)
BEGIN
SQLStatements; -- 每一条SQL语句都必须使用分号分隔,即便只有一条
END$$
DELIMITER ; -- 将分隔符改回分号
复制代码
-- Microsoft SQL Server
CREATE PROCUDURE CustomerProcudure (@custId INT)
AS
BEGIN
SELECT * FROM customers
WHERE customer_id = @custId
END
-- MySQL
DELIMITER $$
CREATE PROCEDURE CustomerProcudure (custId INT)
BEGIN
SELECT * FROM customers
WHERE CUSTOMER_ID = custId;
END
DELEMITER ;
复制代码
-- Microsoft SQL Server
EXEC CustomerProcudure @custId = 2
-- MySQL
CALL CustomerProcudure (2)
复制代码
CREATE
关键字替换为ALTER
关键字便可;然而在MySQL中,虽然也存在ALTER
命令,但它的功能十分简单,因此通常咱们选择先删除存储过程而后再从新建立-- 删除存储过程
DROP PROCEDURE ProcedureName
复制代码
INSERT
命令来插入指定数据,注意不须要为自增型的列指定数据,数据库会自动处理它;另外,Oracle不容许一次插入多行数据,须要分开书写
INSERT
语句中指定的具体数据-- 向customer表插入两条新数据
INSERT INTO customers
(first_name, last_name, state) -- 只要列名是正确的,它们的顺序无所谓
-- 当这里的列名顺序与数据库中的物理顺序一致时可省略它们,但强烈不建议这么作
VALUES
('Virginia', 'Jones', 'OH'), -- VALUES关键字后的数据列,要与INSERT INTO后的列相对应
('Clark', 'Woodland', 'CA')
复制代码
SELECT
语句指定的数据-- 将customer_transaction中的RI州的用户插入到customer表中
INSERT INTO customer
(first_name, last_name, state)
SELECT
fn, ln, state -- 这里选中列的顺序须要与INSERT INTO 语句中的顺序一致
FROM customer_transactions
WHERE state = 'RI'
复制代码
DELETE
命令来删除一条数据,一般是一整行(删除某行中的列没有意义,那属于修改数据的范畴)-- 删除数据的通常写法
DELETE
FROM table_name
WHERE conditions
-- 可使用SELECT语句来验证删除结果
SELECT
COUNT (*) -- 使用聚合函数COUNT来统计被删除数据的数量以确认是否所有都被删除了
FROM table_name
WHERE conditions
-- 清空一个表中的全部数据,可使用TRUNCATE TABLE语句
TRUNCATE TABLE customers
-- 上面的语句与下面的DELETE语句效果基本相同
DELETE FROM customers
-- 惟一不一样在于,TRUNCATE TABLE语句重置了自增列,而DELETE语句没有
复制代码
-- 更新数据的通常格式
UPDATE table
SET
column1 = expression1,
column2 = expression2
-- repeat any number of time
WHERE conditions -- 若是没有指定行,该句会把全部行的指定列都更新一次
复制代码
-- 通常格式
UPDATE table -- 指定要更新的表
SET table.column_1 = -- 指定须要更新的列1
(
SELECT another_table.column_1 -- 子查询从另外一表中获取数据,并经过主键(也但是其它)来进行匹配
FROM another_table
WHERE another_table.auto_increment_primary_key = table.auto_increment_primary_key
)
SET table.column_2 = -- 指定须要更新的列2
(
SELECT another_table.column_2
FROM another_table
WHERE another_table.auto_increment_primary_key = auto_increment_primary_key.column_2
)
WHERE EXISTS -- 指定须要更新的行,使用子查询指定只更新table中存在于another_table中的行
(
SELECT *
FROM another_table
WHERE another_table.auto_increment_primary_key = table.auto_increment_primary_key
)
复制代码
VIEW
、过程PROCEDURE
须要用到的都是DDLNULL
值);实际上主键能够跨越多个列,叫作复合主键(当但愿使用电影名称列来做为主键时可能会存在重复名称, 这时可使用电影名称+年份两个列做为复合主键来惟一地定义每部电影)NULL
CREATE TABLE
语句来建立表及其属性(列),不一样数据库之间存在差别:-- Microsoft SQL Server
CREATE TABLE my_table
(
column_1 INT IDENTITY (1, 1) PRIMARY KEY NOT NULL, -- 列名column_1,INT类型,自增型,主键,不能为NULL
column_2 NOT NULL REFERENCES related_table (first_column), -- 列名column_2,INT类型,不能为NULL,外键,关联到related_table表的first_column列
column_3 VARCHAR (25) NULL, -- 列名column_3,VARCHART类型,能够是NULL
column_4 FLOAT NULL DEFAULT (10) -- 列名column_4,FLOAT类型,能够是NULL
)
-- My SQL
CRAET TABLE my_table
column_1 INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
column_2 INT NOT NULL,
column_3 VARCHAR (25) NULL,
column_4 FLOAT NULL DEFAULT 10 NULL,
CONSTRAINT FOREIGN KEY (column_2) REFERENCE 'related_table' (first_column) -- 指定外键
-- Oracle
CREATE TABLE my_table
(
column_1 INT PRIMARY KEY NOT NULL, -- Oracle不容许有自增型的列
column_2 INT NOT NULL,
column_3 VARCHAR2 (25) null,
column_4 FLOAT DEFAULT 10 NULL
CONSTRAINT "foreign_key" FOREIGN KEY (column_2) REFERENCES related_table (first_column)
)
复制代码
使用ALTER TABLE
语句修改表的具体属性,该语句的复杂性及数据库差别巨大,这里再也不展开;使用DROP TABLE table_name
语句来删除一个表-- 修改表
ALTER TABLE my_table
DROP COLUMN column_3
-- 删除表
DROP TABLE my_table
复制代码
CREATE INDEX
语句,用来在建立表以后建立索引,使用ALTER INDEX
语句来添加和修改索引-- 建立索引
CREATE INDEX index_2
ON my_table (column_4)
-- 删除索引
DROP INDEX index_2
ON my_table
复制代码