SQL 是用于访问和处理数据库的标准的计算机语言。包含数据的增、删、改、查(CURD)操作。数据库中包含数据表,数据表中根据数据的结构存放数据。SQL语句不区分大小写,但是我们一般把SQL的操作关键字大写,更方便我们阅读。
一些SQL命令及用法:
SELECT | 从数据库中提取数据 |
UPDATE | 更新数据库中的数据 |
DELETE | 从数据库中删除数据 |
INSERT INTO | 向数据库中插入新数据 |
CREATE DATABASE | 创建新数据库 |
ALTER DATABASE | 修改数据库 |
CREATE TABLE | 创建新表 |
ALTER TABLE | 变更(改变)数据库表 |
DROP TABLE | 删除表 |
CREATE INDEX | 创建索引(搜索键) |
DROP INDEX | 删除索引 |
CREATE DATABASE 语句用于创建数据库。
CREATE DATABASE dbname;
CREATE TABLE 语句用于创建数据库中的表。
表由行和列组成,每个表都必须有个表名。
CREATE TABLE table_name(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
SQL 约束用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
CREATE TABLE table_name(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
在 SQL 中,我们有如下约束:
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
DEFAULT - 规定没有给列赋值时的默认值。
您可以在表中创建索引,以便更加快速高效地查询数据。用户无法看到索引,它们只能被用来加速搜索/查询。
CREATE INDEX index_name ON table_name (column_name)
在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name ON table_name (column_name)
下面的 SQL 语句从表中选取所有记录:
SELECT * FROM table_name;
查出两列的数据
SELECT column_name,column_name FROM table_name;
一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。DISTINCT 关键词用于返回唯一不同的值。
SELECT DISTINCT column_name,column_name FROM table_name;
WHERE 子句用于提取那些满足指定标准的记录。
SELECT column_name,column_name FROM table_name WHERE column_name operator value;
AND & OR 运算符用于基于一个以上的条件对记录进行过滤。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
SELECT * FROM Websites WHERE country='CN' AND alexa > 50;
SELECT * FROM Websites WHERE country='USA' OR country='CN';
SELECT * FROM Websites WHERE alexa > 15 AND (country='CN' OR country='USA');
ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。
SELECT column_name,column_name FROM table_name ORDER BY column_name,column_name ASC|DESC;
INSERT INTO 语句用于向表中插入新记录。
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name VALUES (value1,value2,value3,...);
第二种形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);
UPDATE 语句用于更新表中已存在的记录。
请注意 SQL UPDATE 语句中的 WHERE 子句!WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE 子句,所有的记录都将被更新!
UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value;
DELETE 语句用于删除表中的行。
请注意 SQL DELETE 语句中的 WHERE 子句!WHERE 子句规定哪条记录或者哪些记录需要删除。如果您省略了 WHERE 子句,所有的记录都将被删除!
DELETE FROM table_name WHERE some_column=some_value;
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern;
通过使用 NOT 关键字,您可以选取不匹配模式的记录。
SELECT column_name(s) FROM table_name WHERE column_name NOT LIKE pattern;
这里的pattern是通配符,用以下模式书写
通配符 | 描述 |
% | 替代 0 个或多个字符 |
_ | 替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或 [!charlist] | 不在字符列中的任何单一字符 |
下面的 SQL 语句选取 url 以字母 "https" 开始的所有网站:
SELECT * FROM Websites WHERE url LIKE 'https%';
下面的 SQL 语句选取 url 包含模式 "oo" 的所有网站:
SELECT * FROM Websites WHERE url LIKE '%oo%';
下面的 SQL 语句选取 name 以 "G" 开始,然后是一个任意字符,然后是 "o",然后是一个任意字符,然后是 "le" 的所有网站:
SELECT * FROM WebsitesWHERE name LIKE 'G_o_le';
下面的 SQL 语句选取 name 以 A 到 H 字母开头的网站:
SELECT * FROM Websites WHERE name REGEXP '^[A-H]';
下面的 SQL 语句选取 name 不以 A 到 H 字母开头的网站:
SELECT * FROM Websites WHERE name REGEXP '^[^A-H]';
IN 操作符允许您在 WHERE 子句中规定多个值。
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...);
BETWEEN 操作符用于选取介于两个值之间的数据范围内的值。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
SELECT column_name(s) FROM table_name WHERE column_name NOT BETWEEN value1 AND value2;
通过使用 SQL,可以为表名称或列名称指定别名。基本上,创建别名是为了让列名称的可读性更强。
SELECT column_name AS alias_name FROM table_name;
SELECT column_name(s) FROM table_name AS alias_name;
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行
INNER JOIN 关键字在表中存在至少一个匹配时返回行。INNER JOIN 与 JOIN 是相同的。都是取交集
SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name=table2.column_name;
或:
SELECT column_name(s) FROM table1 JOIN table2 ON table1.column_name=table2.column_name;
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name;
或:
SELECT column_name(s) FROM table1 LEFT OUTER JOIN table2 ON table1.column_name=table2.column_name;
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name=table2.column_name;
或:
SELECT column_name(s) FROM table1 RIGHT OUTER JOIN table2 ON table1.column_name=table2.column_name;
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.
FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name=table2.column_name;
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;
如果允许重复的值,请使用 UNION ALL。
SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
通过使用 DROP 语句,可以轻松地删除索引、表和数据库。
DROP INDEX 语句用于删除表中的索引。
DROP TABLE 语句用于删除表。
DROP TABLE table_name
DROP DATABASE 语句用于删除数据库。
DROP DATABASE database_name
如果我们仅仅需要删除表内的数据,但并不删除表本身,请使用 TRUNCATE TABLE 语句:
TRUNCATE TABLE table_name
ALTER TABLE 语句用于在已有的表中添加、删除或修改列。
如需在表中添加列,请使用下面的语法:
ALTER TABLE table_name ADD column_name datatype
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
ALTER TABLE table_name DROP COLUMN column_name
Auto-increment 会在新记录插入表中时生成一个唯一的数字。
SQL中的函数
SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。有用的 Aggregate 函数:
AVG() | 返回平均值 |
COUNT() | 返回行数 |
FIRST() | 返回第一个记录的值 |
LAST() | 返回最后一个记录的值 |
MAX() | 返回最大值 |
MIN() | 返回最小值 |
SUM() | 返回总和 |
GROUP BY | 语句用于结合聚合函数,根据一个或多个列对结果集进行分组 |
HAVING | 子句可以让我们筛选分组后的各组数据。在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用 |
SQL Scalar 函数基于输入值,返回一个单一的值。有用的 Scalar 函数:
UCASE() | 将某个字段转换为大写 |
LCASE() | 将某个字段转换为小写 |
MID() | 从某个文本字段提取字符 |
LEN() | 返回某个文本字段的长度 |
ROUND() | 对某个数值字段进行指定小数位数的四舍五入 |
NOW() | 返回当前的系统日期和时间 |
FORMAT() | 格式化某个字段的显示方式 |