SQL
转载自https://www.runoob.com/sql/sql-tutorial.html 本文只用于个人学习笔记用
SQL 是用于访问和处理数据库的标准的计算机语言。
- SQL,指结构化查询语言,全称是 Structured Query Language。
- SQL 让您可以访问和处理数据库。
- SQL 是一种 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言。
SELECT
用于从数据库中选取数据。
SELECT column_name,column_name FROM table_name;
SELECT * FROM table_name;
mysql> SELECT * FROM tbl; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 10 | php | 444 | 2018-10-10 | 0 | | 11 | linux | bbb | 2019-01-01 | 2 | +-----------+--------------+---------------+-----------------+---+ 5 rows in set (0.00 sec) mysql> mysql> mysql> SELECT runoob_title,runoob_author FROM tbl; +--------------+---------------+ | runoob_title | runoob_author | +--------------+---------------+ | learn mysql | 1111111 | | pyhon | aaa | | learn mysql | aaa | | php | 444 | | linux | bbb | +--------------+---------------+ 5 rows in set (0.00 sec) mysql>
SELECT DISTINCT
用于返回唯一不同的值。
SELECT DISTINCT column_name, column_name FROM table_name;
mysql> SELECT DISTINCT runoob_title FROM tbl; +--------------+ | runoob_title | +--------------+ | learn mysql | | pyhon | | php | | linux | +--------------+ 4 rows in set (0.00 sec) mysql>
WHERE
用于提取那些满足指定条件的记录。
SELECT column_name, column_name FROM table_name WHERE column_name operator value;
mysql> SELECT * FROM tbl WHERE runoob_title = 'learn mysql'; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | +-----------+--------------+---------------+-----------------+---+ 2 rows in set (0.00 sec) mysql>
AND &OR
AND & OR 运算符用于基于一个以上的条件对记录进行过滤。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
mysql> SELECT * FROM tbl WHERE runoob_title = 'learn mysql' OR runoob_author = 'aaa'; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | +-----------+--------------+---------------+-----------------+---+ 3 rows in set (0.00 sec) mysql> mysql> SELECT * FROM tbl WHERE runoob_title = 'learn mysql' AND runoob_author = 'aaa'; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 6 | learn mysql | aaa | 2018-01-10 | 0 | +-----------+--------------+---------------+-----------------+---+ 1 row in set (0.00 sec) mysql>
ORDER BY
关键字用于对结果集进行排序。
SELECT column_name, column_name
FROM table_name
ORDER BY column_name, column_name ASC | DESC;
mysql> SELECT * FROM tbl ORDER BY runoob_author; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 10 | php | 444 | 2018-10-10 | 0 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 11 | linux | bbb | 2019-01-01 | 2 | +-----------+--------------+---------------+-----------------+---+ 5 rows in set (0.00 sec) mysql> mysql> SELECT * FROM tbl ORDER BY runoob_author DESC; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 11 | linux | bbb | 2019-01-01 | 2 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 10 | php | 444 | 2018-10-10 | 0 | | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | +-----------+--------------+---------------+-----------------+---+ 5 rows in set (0.00 sec) mysql>
INSERT INTO
用于向表中插入新记录。
INSERT INTO table_name VALUES (value1,value2,value3,...);
INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);
mysql> INSERT INTO tbl VALUES ('17','mysql','3333','2017-09-05',7),('18','mysql','444','2017-09-05',8),('19','mysql','555','2017-11-05',9); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> mysql> select * from tbl; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 10 | php | 444 | 2018-10-10 | 0 | | 11 | linux | bbb | 2019-01-01 | 2 | | 17 | mysql | 3333 | 2017-09-05 | 7 | | 18 | mysql | 444 | 2017-09-05 | 8 | | 19 | mysql | 555 | 2017-11-05 | 9 | +-----------+--------------+---------------+-----------------+---+ 8 rows in set (0.00 sec) mysql> mysql> INSERT INTO tbl ( runoob_title , runoob_author , submission_date , j) VALUES ('mysql','2222','2017-05-05',6); Query OK, 1 row affected (0.00 sec) mysql> select * from tbl; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 10 | php | 444 | 2018-10-10 | 0 | | 11 | linux | bbb | 2019-01-01 | 2 | | 17 | mysql | 3333 | 2017-09-05 | 7 | | 18 | mysql | 444 | 2017-09-05 | 8 | | 19 | mysql | 555 | 2017-11-05 | 9 | | 20 | mysql | 2222 | 2017-05-05 | 6 | +-----------+--------------+---------------+-----------------+---+ 9 rows in set (0.00 sec) mysql>
UPDATE
用于更新表中的记录。
UPDATE table_name SET column1=value1, column2=value2,... WHERE some_column=some_value;
/*在更新记录时要格外小心!如果我们省略了 WHERE 子句,执行代码会将表中所有数据都更改,执行没有 WHERE 子句的 UPDATE 要慎重,再慎重。*/
mysql> UPDATE tbl sET runoob_title = 'SQL', runoob_author = 'AAA' where runoob_id = 20; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from tbl; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 10 | php | 444 | 2018-10-10 | 0 | | 11 | linux | bbb | 2019-01-01 | 2 | | 17 | mysql | 3333 | 2017-09-05 | 7 | | 18 | mysql | 444 | 2017-09-05 | 8 | | 19 | mysql | 555 | 2017-11-05 | 9 | | 20 | SQL | AAA | 2017-05-05 | 6 | +-----------+--------------+---------------+-----------------+---+ 9 rows in set (0.00 sec) mysql>
DELETE
用于删除表中的记录。
DELETE FROM table_name WHERE some_column = some_value;
WHERE 子句规定哪条记录或者哪些记录需要删除。如果您省略了 WHERE 子句,所有的记录都将被删除!
注释:在删除记录时要格外小心!因为您不能重来!
mysql> DELETE FROM tbl where runoob_id = 19; Query OK, 1 row affected (0.01 sec) mysql> select * from tbl; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 10 | php | 444 | 2018-10-10 | 0 | | 11 | linux | bbb | 2019-01-01 | 2 | | 17 | mysql | 3333 | 2017-09-05 | 7 | | 18 | mysql | 444 | 2017-09-05 | 8 | | 20 | SQL | AAA | 2017-05-05 | 6 | +-----------+--------------+---------------+-----------------+---+ 8 rows in set (0.00 sec) mysql>
SELECT TOP, LIMIT, ROWNUM
SELECT TOP 子句用于规定要返回的记录的数目。
SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。
注意:并非所有的数据库系统都支持 SELECT TOP 语句。 MySQL 支持 LIMIT 语句来选取指定的条数数据, Oracle 可以使用 ROWNUM 来选取。
SQL Server / MS Access 语法
SELECT TOP number | percent column_name(s) FROM table_name;
MYSQL语法
SELECT column_name(s) FROM table_name LIMIT number;
Oracle语法
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number;
mysql> select * from tbl LIMIT 5; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 10 | php | 444 | 2018-10-10 | 0 | | 11 | linux | bbb | 2019-01-01 | 2 | +-----------+--------------+---------------+-----------------+---+ 5 rows in set (0.00 sec) mysql>
LIKE
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern;
mysql> SELECT * FROM tbl WHERE runoob_title like '%sql'; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 17 | mysql | 3333 | 2017-09-05 | 7 | | 18 | mysql | 444 | 2017-09-05 | 8 | | 20 | SQL | AAA | 2017-05-05 | 6 | +-----------+--------------+---------------+-----------------+---+ 5 rows in set (0.00 sec) mysql>
通配符
通配符与SQL LIKE操作符一起使用,可用于替代字符串中的任何其他字符
% 代替0个或多个字符
- 代替一个字符
[charlist] 字符列中的任何单一字符
[^charlist] 或 [!charlist] 不在字符列中的任何单一字符
MySQL 、SQLite 只支持 % 和 _ 通配符,不支持 [^charlist] 或 [!charlist]
MySQL 中要完成 [^charlist] 或 [!charlist] 通配符的查询效果,需要通过正则表达式 REGEXP 来完成。
IN操作符
IN 操作符允许您在 WHERE 子句中规定多个值。
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...);
mysql> SELECT * FROM tbl WHERE runoob_title IN ('sql','php','linux'); +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 10 | php | 444 | 2018-10-10 | 0 | | 11 | linux | bbb | 2019-01-01 | 2 | | 20 | SQL | AAA | 2017-05-05 | 6 | +-----------+--------------+---------------+-----------------+---+ 3 rows in set (0.00 sec) mysql>
BETWEEN操作符
BETWEEN 操作符用于选取介于两个值之间的数据范围内的值。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
mysql> SELECT * FROM tbl WHERE j BETWEEN 2 AND 7; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 11 | linux | bbb | 2019-01-01 | 2 | | 20 | SQL | AAA | 2017-05-05 | 6 | | 17 | mysql | 3333 | 2017-09-05 | 7 | +-----------+--------------+---------------+-----------------+---+ 3 rows in set (0.00 sec) mysql>
如需显示不在上面实例范围内的数据,请使用 NOT BETWEEN:
mysql> SELECT * FROM tbl WHERE j NOT BETWEEN 2 AND 7; +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 10 | php | 444 | 2018-10-10 | 0 | | 18 | mysql | 444 | 2017-09-05 | 8 | +-----------+--------------+---------------+-----------------+---+ 5 rows in set (0.00 sec) mysql>
别名
通过使用 SQL,可以为表名称或列名称指定别名。
列的别名:
SELECT column_name AS alias_name FROM table_name;
表的别名:
SELECT column_name(s) FROM table_name AS alias_name;
mysql> SELECT runoob_title, runoob_title AS alias_tile FROM tbl; +--------------+-------------+ | runoob_title | alias_tile | +--------------+-------------+ | learn mysql | learn mysql | | pyhon | pyhon | | learn mysql | learn mysql | | php | php | | linux | linux | | mysql | mysql | | mysql | mysql | | SQL | SQL | +--------------+-------------+ 8 rows in set (0.00 sec) mysql>
mysql> SELECT F.runoob_title, L.runoob_author -> FROM tbl AS F, tb2 AS L -> WHERE F.runoob_id = L.runoob_id; +--------------+---------------+ | runoob_title | runoob_author | +--------------+---------------+ | learn mysql | keepalive | | pyhon | svn | | learn mysql | aaa | | php | 333 | +--------------+---------------+ 4 rows in set (0.00 sec) mysql>
连接(JOIN)
用于把来自两个或多个表的行结合起来
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行
INNER 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;
注释: INNER JOIN 和 JION是相同的。
mysql> SELECT * FROM tcount_tbl;SELECT * FROM tbl; +--------------+--------------+ | runoob_title | runoob_count | +--------------+--------------+ | learn mysql | 22 | | learn mysql | 4 | | python | 5 | | php | 5 | | zabbix | 5 | | apache | 5 | +--------------+--------------+ 6 rows in set (0.00 sec) +-----------+--------------+---------------+-----------------+---+ | runoob_id | runoob_title | runoob_author | submission_date | j | +-----------+--------------+---------------+-----------------+---+ | 2 | learn mysql | 1111111 | 2018-01-10 | 0 | | 4 | pyhon | aaa | 2018-10-10 | 0 | | 6 | learn mysql | aaa | 2018-01-10 | 0 | | 10 | php | 444 | 2018-10-10 | 0 | | 11 | linux | bbb | 2019-01-01 | 2 | | 17 | mysql | 3333 | 2017-09-05 | 7 | | 18 | mysql | 444 | 2017-09-05 | 8 | | 20 | SQL | AAA | 2017-05-05 | 6 | +-----------+--------------+---------------+-----------------+---+ 8 rows in set (0.00 sec) mysql> mysql> mysql> SELECT tbl.runoob_title, tbl.runoob_author, tbl.submission_date, tcount_tbl.runoob_count -> FROM tbl -> INNER JOIN tcount_tbl -> ON tbl.runoob_title=tcount_tbl.runoob_title; +--------------+---------------+-----------------+--------------+ | runoob_title | runoob_author | submission_date | runoob_count | +--------------+---------------+-----------------+--------------+ | learn mysql | 1111111 | 2018-01-10 | 22 | | learn mysql | 1111111 | 2018-01-10 | 4 | | learn mysql | aaa | 2018-01-10 | 22 | | learn mysql | aaa | 2018-01-10 | 4 | | php | 444 | 2018-10-10 | 5 | +--------------+---------------+-----------------+--------------+ 5 rows in set (0.00 sec) mysql>
LEFT JOIN 关键字
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;
注释:在某些数据库中,LEFT JOIN称为LEFT OUTER JOIN。
mysql> SELECT tbl.runoob_title, tbl.runoob_author, tbl.submission_date, tcount_tbl.runoob_count -> FROM tbl -> LEFT JOIN tcount_tbl -> ON tbl.runoob_title=tcount_tbl.runoob_title; +--------------+---------------+-----------------+--------------+ | runoob_title | runoob_author | submission_date | runoob_count | +--------------+---------------+-----------------+--------------+ | learn mysql | 1111111 | 2018-01-10 | 22 | | learn mysql | 1111111 | 2018-01-10 | 4 | | pyhon | aaa | 2018-10-10 | NULL | | learn mysql | aaa | 2018-01-10 | 22 | | learn mysql | aaa | 2018-01-10 | 4 | | php | 444 | 2018-10-10 | 5 | | linux | bbb | 2019-01-01 | NULL | | mysql | 3333 | 2017-09-05 | NULL | | mysql | 444 | 2017-09-05 | NULL | | SQL | AAA | 2017-05-05 | NULL | +--------------+---------------+-----------------+--------------+ 10 rows in set (0.00 sec) mysql>
RIGHT JOIN 关键字
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
mysql> SELECT tbl.runoob_title, tbl.runoob_author, tbl.submission_date, tcount_tbl.runoob_count -> FROM tbl -> RIGHT JOIN tcount_tbl -> ON tbl.runoob_title=tcount_tbl.runoob_title; +--------------+---------------+-----------------+--------------+ | runoob_title | runoob_author | submission_date | runoob_count | +--------------+---------------+-----------------+--------------+ | learn mysql | 1111111 | 2018-01-10 | 22 | | learn mysql | aaa | 2018-01-10 | 22 | | learn mysql | 1111111 | 2018-01-10 | 4 | | learn mysql | aaa | 2018-01-10 | 4 | | NULL | NULL | NULL | 5 | | php | 444 | 2018-10-10 | 5 | | NULL | NULL | NULL | 5 | | NULL | NULL | NULL | 5 | +--------------+---------------+-----------------+--------------+ 8 rows in set (0.00 sec) mysql>
FULL OUTER JOIN 关键字
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.
FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
SELECT column_name(s)
FROM table1
FULL OUTER JION table2
ON table1.column_name=table2.column_name;
MySQL不支持全关联
UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
注释:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
mysql> SELECT runoob_title FROM tbl -> UNION -> SELECT runoob_title FROM tcount_tbl -> ; +--------------+ | runoob_title | +--------------+ | learn mysql | | pyhon | | php | | linux | | mysql | | SQL | | python | | zabbix | | apache | +--------------+ 9 rows in set (0.00 sec) mysql> mysql> SELECT runoob_title FROM tbl UNION ALL SELECT runoob_title FROM tcount_tbl; +--------------+ | runoob_title | +--------------+ | learn mysql | | pyhon | | learn mysql | | php | | linux | | mysql | | mysql | | SQL | | learn mysql | | learn mysql | | python | | php | | zabbix | | apache | +--------------+ 14 rows in set (0.00 sec) mysql>
SELECT INTO语句
SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中
SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1;
MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT 。
当然你可以使用以下语句来拷贝表结构及数据:
CREATE TABLE new_table AS SELECT * FROM old_table;
INSERT INTO SELECTF语句
从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不受影响。
INSERT INTO table2
(column_name(s))
SELCEET column_name(s)
FROM table1;
CREATE DATABASE语句
创建数据库。
CREATE DATABASE dbname;
mysql> CREATE DATABASE testdb; Query OK, 1 row affected (0.00 sec) mysql>
CREATE TABLE语句
创建数据库中的表。表由行和列组成,每个表都必须有个表名。
CREATE TABLE table_name
(
column_name1 date_type(size),
column_name1 date_type(size),
column_name1 date_type(size),
...
);
column_name 参数规定表中列的名称。
data_type 参数规定列的数据类型(例如 varchar、integer、decimal、date 等等)。
size 参数规定表中列的最大长度。
mysql> use testdb; Database changed mysql> mysql> mysql> CREATE TABLE testtbl -> ( -> personid int, -> lastname varchar(255), -> firstname varchar(255), -> birthday date -> ); Query OK, 0 rows affected (0.00 sec) mysql>
约束(constraints)
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 - 规定没有给列赋值时的默认值
NOT NULL约束
约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
mysql> CREATE TABLE test2 ( -> id int NOT NULL, -> name varchar(255) not null, -> age int -> ); Query OK, 0 rows affected (0.00 sec) mysql>
添加NOT NULL约束
mysql> ALTER TABLE test2 -> MODIFY age int NOT NULL; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> mysql> desc test2; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(255) | NO | | NULL | | | age | int(11) | NO | | NULL | | +-------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql>
删除NOT NULL约束
mysql> alter table test2 -> modify age int null; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test2; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(255) | NO | | NULL | | | age | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql>
UNIQUE 约束
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
mysql> CREATE TABLE test3 -> ( -> id int not null, -> name varchar(20) not null, -> age int, -> unique (id) -> ); Query OK, 0 rows affected (0.00 sec) mysql> desc test3; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | NO | | NULL | | | age | int(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql>
创建UNIQUE约束
ALTER TABLE teable_name,
ADD UNIQUE (column_name);
撤销UNIQUE约束
ALTER TABLE table_name,
DROP INDEX column_name;
PRIMARY KEY约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
mysql> CREATE TABLE test4 -> ( -> id int not null, -> name varchar(20) not null, -> age int, -> unique (name), -> primary key (id) -> ); Query OK, 0 rows affected (0.00 sec) mysql> mysql> desc test4; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | NO | UNI | NULL | | | age | int(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql>
创建PRIMARY KEY约束
ALER TABLE table_name
ADD PRIMARY KEY (column_name);
撤销PRIMARY KEY约束
ALTER TABLE table_name
DROP PRIMARY KEY;
FOREIGN KEY约束
一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。
mysql> CREATE TABLE test5 ( -> o_id int not null, -> teststr varchar(20), -> f_id int not null, -> PRIMARY KEY (o_id), -> FOREIGN KEY (f_id) REFERENCES test4(id) -> ); Query OK, 0 rows affected (0.00 sec) mysql> mysql> desc test5; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | o_id | int(11) | NO | PRI | NULL | | | teststr | varchar(20) | YES | | NULL | | | f_id | int(11) | NO | MUL | NULL | | +---------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> mysql>
ALTER创建表的FOREIGN KEY约束
ALTER TABLE table1_name
ADD FOREIGN KEY (P_id)
REFERENCES table2_name(p_id);
ALTER撤销表的FOREIGN KEY约束
ALTER TABLE table_name
DROP FOREIGN KEY P_id;
CHECK约束
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
mysql> create table test6 -> ( -> id int not null, -> str varchar(10), -> check (id>0) -> ); Query OK, 0 rows affected (0.00 sec) mysql>
DEFAULT约束
DEFAULT 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
mysql> create table test7 ( -> id int not null, -> name varchar(100), -> sex varchar(5) default 'M' -> ); Query OK, 0 rows affected (0.01 sec) mysql> mysql> mysql> desc test7; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(100) | YES | | NULL | | | sex | varchar(5) | YES | | M | | +-------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql>
CREATE INDEX 语句
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
注释:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
SQL CREATE INDEX 语法
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name);
SQL CREATE UNIQUE INDEX 语法
在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值。Creates a unique index on a table. Duplicate values are not allowed:
CREATE UNIQUE INDEX index_name
ON table_name (column_name);
DROP语句
通过使用 DROP 语句,可以轻松地删除索引、表和数据库。
ALTER TABLE table_name DROP INDEX index_name;
DROP TABLE table_name;
DROP DATABASE database_name;
如果是仅仅需要删除表内数据,但不删除表本身,使用 TRUNCATE TABLE 语句。
TRUNCATE TABLE table_name;
ALTER TABLE语句
ALTER TABLE 语句用于在已有的表中添加、删除或修改列。
在表中添加列
ALTER TABLE table_name ADD column_name datatype;
删除列
ALTER TABLE table_name DROP COLUMN column_name;
改变列的数据类型
ALTER TABLE table_name ALTER COLUMN column_name datatype;
AUTO INCREMENT字段
Auto-increment 会在新记录插入表中时生成一个唯一的数字,自动地创建主键字段的值。
mysql> CREATE TABLE test8 ( -> id int not null auto_increment, -> name varchar(50), -> PRIMARY KEY(id) -> ); Query OK, 0 rows affected (0.00 sec) mysql> desc test8; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql>
视图(Views)
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
您可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition;
mysql> CREATE VIEW testview AS -> SELECT name FROM test8 ; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 239319 Current database: testdb Query OK, 0 rows affected (0.01 sec) mysql> mysql> SELECT * FROM testview; +------+ | name | +------+ | zhu | | zhu | | zhu | | zhu | +------+ 4 rows in set (0.00 sec) mysql>
更新视图
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition;
撤销视图
DROP VIEW view_name;
Date函数
MySQL Date 函数
下面的表格列出了 MySQL 中最重要的内建日期函数:
SQL Date 数据类型
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式:YYYY-MM-DD
- DATETIME - 格式:YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
- YEAR - 格式:YYYY 或 YY
NULL 值
NULL 值代表遗漏的未知数据。
默认地,表的列可以存放 NULL 值。
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
注释:无法比较 NULL 和 0;它们是不等价的。
测试 NULL 值必须使用 IS NULL 和 IS NOT NULL 操作符。
NULL 函数
ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
--如果alexa列为null值,则赋予0,否则,取原值 select id,name,url,ifnull(alexa,0)from websites; select id,name,url,COALESCE(alexa,0) from websites;
通用数据类型
数据类型定义列中存放的值的种类。
数据库表中的每个列都要求有名称和数据类型。SQL 开发人员必须在创建 SQL 表时决定表中的每个列将要存储的数据的类型。数据类型是一个标签,是便于 SQL 了解每个列期望存储什么类型的数据的指南,它也标识了 SQL 如何与存储的数据进行交互。
然而,不同的数据库对数据类型定义提供不同的选择。
下面的表格显示了各种不同的数据库平台上一些数据类型的通用名称:
MySQL 数据类型
在 MySQL 中,有三种主要的类型:Text(文本)、Number(数字)和 Date/Time(日期/时间)类型。
注意:以上的 size 代表的并不是存储在数据库中的具体的长度,如 int(4) 并不是只能存储4个长度的数字。
实际上int(size)所占多少存储空间并无任何关系。int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。就是在显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
例如:
1、int的值为10 (指定zerofill)
int(9)显示结果为000000010
int(3)显示结果为010
就是显示的长度不一样而已 都是占用四个字节的空间