SQL基本语句
-
use DATABASE;命令用于选择数据库
-
SELECT
SELECT语句用于从数据库中选取数据。
结果被存储在一个结果表中,称为结果集。
基本语法为:
SELECT column_name,column_name FROM table_name;
也可以省略column_name,写为:
SELECT * FROM table_name;
实例1:从Students表中选取“id”和“name”列
SELECT id,name FROM Students;
实例2:从Students表中选取所有列
SELECT * FROM Students;
SQL SELECT DISTINCT语句
在表中,一个列可能会包含很多的重复值,有时候我们希望仅仅列出不同的值。
DISTINCT关键词用于返回唯一不同的值。
基本语法:
SELECT DISTINCT column_name,column_name FROM table_name;
实例:从“Websites”表的“country”列中选取唯一不同的值,也就是去掉“country”列的重复值
SELECT DISTINCT country FROM Websites;
-
WHERE子句
WHERE子句用于过滤选取的记录,提取那些满足指定条件的记录。
基本语法:
SELECT column_name,column_name FROM table_name WHERE column_name operator value;
实例:从Students表中选取姓名为“小王”的所有学生
SELECT * FROM Students WHERE name="小王";
WHERE子句中可以使用的运算符:
运算符 描述 = 等于 <> 不等于。注释:在有些版本中也写为!= > 大于 < 小于 >= 大于等于 <= 小于等于 BETWEEN 在某个范围内 LIKE 搜索某种模式 IN 指定针对某个列的多个可能值 -
AND & OR
AND & OR 运算符用于基于一个以上的条件对记录进行过滤。
- 如果第一个条件和第二个条件都成立,则AND运算符显示一条记录。
- 如果第一个条件和第二个条件中只要有一个成立,则OR运算符显示一条记录。
实例1:从Students表中选取id>5并且score>90的所有学生
SELECT * FROM Students WHERE id>5 AND score>90;
实例2:从Students表中选取id>5或者score>90的所有学生
SELECT * FROM Students WHERE id>5 OR score>90;
这两个运算符也可以结合圆括号组合成更加复杂的逻辑表达式。
-
ORDER BY
ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
ORDER BY 关键字默认按照升序对记录进行排序,如果需要按照降序对记录进行排序,可以使用DESC关键字。
基本语法:
SELECT column_name,column_name FROM table_name ORDER BY column_name,column_name ASC|DESC;
实例1:查看Students表中的所有学生信息,并按照id以升序排序
SELECT * FROM Students ORDER BY id;
实例2:查看Students表中的所有学生信息,并按照id以降序排序
SELECT * FROM Students ORDER BY id DESC;
实例3:查看Students表中的所有学生信息,并按照id和name排序
SELECT * FROM Students ORDER BY id,name;
-
INSERT INTO
INSERT INTO 语句用于向表中插入新记录。
INSERT INTO 语句可以有两种编写形式。
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name VALUES (value1,value2,value3,...);
第二种形式需要指定列名及被插入的值:
INSERT INTO table_name(column1,column2,column3,...) VALUES (value1,value2,value3,...);
实例:向Students表中插入一个新学生,id=10,name=“小张”,score=90
INSERT INTO Students VALUES(10,"小张",90);
或者
INSERT INTO Students(id,name,score) VALUES (10,"小张",90);
-
UPDATE
UPDATE语句用于更新表中已存在的记录。
基本语法:
UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value;
请注意SQL UPDATE 语句中的WHERE子句!
WHERE子句规定哪一条记录或者哪些记录需要更新,如果省略了WHERE子句,所有的记录都将被更新!
实例:将Students表中id=3的学生的姓名改为“小王”
UPDATE Students SET name="小王" WHERE id=3;
-
DELETE
DELETE语句用于删除表中的行。
基本语法:
DELETE FROM table_name WHERE some_column=some_value;
请注意DELETE语句中的WHERE子句!
WHERE子句规定哪一条记录或者哪些记录需要删除,如果省略了WHERE子句,所有的记录都会被删除!
实例:删除Students表中id=3的学生
DELETE FROM Students WHERE id=3;
-
LIKE
LIKE操作符用于在WHERE子句中搜索列中的指定模式。
基本语法:
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern;
实例1:从Students表中选取姓名以字母G开始的所有学生
SELECT * FROM Students WHERE name LIKE 'G%';
实例2:从Students表中选取姓名以字母g结尾的所有学生
SELECT * FROM Students WHERE name LIKE '%g';
实例3:从Students表中选取姓名中包含“in”的所有学生
SELECT * FROM Students WHERE name LIKE '%in%';
-
SQL通配符
通配符可用于替代字符串中的任何其他字符。
在SQL中,通配符与LIKE操作符一起使用,用于搜索表中的数据。
在SQL中,可使用以下通配符:
通配符 描述 % 替代0个或多个字符 _ 替代一个字符 [charlist] 字符列中的任何单一字符 [^charlist]或[!charlist] 不在字符列中的任何单一字符 在MySQL中使用REGEXP或NOT REGEXP运算符(或RLIKE和NOT RLIKE)来操作正则表达式
实例1:从Students表中选取姓名以F、G或S开头的所有学生
SELECT * FROM Students WHERE name REGEXP '^[FGS]';
实例2:从Students表中选取姓名以A到H开头的学生
SELECT * FROM Students WHERE name REGEXP '^[A-H]';
-
IN操作符
IN操作符允许我们在WHERE子句中规定多个值
基本语法:
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...);
实例:从Students表中选取姓名为“小王”或“小张”的学生
SELECT * FROM Students WHERE name IN ("小王","小张");
-
BETWEEN
BETWEEN操作符用于选取介于两个值之间的数据范围内的值,这些值可以是数值、文本或者日期。
基本语法:
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
实例1:在Students表中选取score介于60和80之间的所有学生
SELECT * FROM Students WHERE score BETWEEN 60 AND 80;
实例2:在Students表中选取姓名以介于A和H之间字母开始的所有学生
SELECT * FROM Students WHERE name BETWEEN 'A' AND 'H';
-
SQL别名
通过使用SQL,可以为表名或者列名指定别名,创建别名是为了让列名称的可读性更强。
列的别名语法:
SELECT column_name AS alias_name FROM table_name;
表的别名语法:
SELECT column_name(s) FROM table_name AS alias_name;
实例:下面的SQL语句指定了两个别名,一个是name列的别名,一个是score列的别名
SELECT name AS n,score AS s FROM Students;
-
SQL连接(JOIN)
SQL join 用于把来自两个或多个表的行结合起来
-
INNER 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与JOIN是相同的。
实例:下面的语句将输出id为1的学生所在的班级信息
SELECT * FROM Class INNER JOIN Students ON Class.id=Students.ClassID;
-
LEFT JOIN
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为NULL。
基本语法:
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name;
或:
SELECT colume_name(s) FROM table1 LEFT OUTER JOIN table2 ON table1.column_name=table2.column_name;
*注释:*在某些数据库中,LEFT JOIN 称为LEFT OUTER JOIN。
-
RIGHT JOIN
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;
*注释:*在某些数据库中,RIGHT JOIN 称为RIGHT OUTER JOIN。
-
FULL OUTER JOIN
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
SQL UNION操作符合并两个或多个SELECT 语句的结果集。
请注意,UNION内部的每个SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型,同时,每个SELECT 语句中的列的顺序必须相同。
基本语法:
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;
*注释:*默认地,UNION操作符选取不同的值。如果允许重复的值,请使用UNION ALL。
SQL UNION ALL语法:
SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;
*注释:*UNION 结果集中的列名总是等于UNION中第一个SELECT语句中的列名。
实例:从Website表和apps表中选取所有不同的country
SELECT country FROM Websites UNION SELECT country FROM apps ORDER BY country;
-
SELECT INTO
SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
-
注意:MySQL数据库不支持SELECT INTO语句,但支持INSERT INTO … SELECT.
当然,我们可以使用以下语句来拷贝表结构及数据:
CREATE TABLE 新表 AS SELECT * FROM 旧表
SQL SELECT INTO语法:
我们可以复制所有的列插入到新表中:
SELECT * INTO newtable [IN externaldb] FROM table1;
或者只复制希望的列插入到新表中:
SELECT column_name(s) INTO newtable [IN externaldb] FROM table1;
实例:
创建Students表的备份复件:
SELECT * INTO Students1 FROM Students;
只复制一些列插入到新表中:
SELECT name,score INTO Students1 FROM Students;
只复制id=3的学生到新表中:
SELECT * INTO Students1 FROM Students WHERE id=3;
*提示:*SELECT INTO语句可用于通过另一种模式创建一个新的空表,只需要添加促使查询没有数据返回的WHERE子句即可。
-
-
INSERT INTO SELECT
INSERT INTO SELECT语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
基本语法:
我们可以从一个表中复制所有的列插入到另一个已存在的表中:
INSERT INTO table2 SELECT * FROM table1;
或者我们可以只复制希望的列插入到另一个已存在的表中:
INSERT INTO table2 (column_name(s)) SELECT column_name(s) FROM table1;
-
CREATE DATABASE
CREATE DATABASE语句用于创建数据库。
基本语法:
CREATE DATABASE dbname;
-
CREATE TABLE
CREATE TABLE 语句用于创建数据库中的表。
基本语法:
CREATE TABLE table_name ( column_name1 data_type(size), column_name2 data_type(size), column_name3 data_type(size), ... );
column_name参数规定表中列的名称。
data_type参数规定列的数据类型。
size参数规定表中列的最大长度。
-
SQL约束
SQL约束用于规定表中的数据规则,如果存在违反约束的数据行为,行为会被约束终止。
在SQL中,我们有如下约束:
- NOT NULL -指示某列不能存储NULL值
- UNIQUE -保证某列的每一行有唯一的值
- PRIMARY KEY -NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识
- FOREIGN KEY -保证一个表中的数据匹配到另一个表中的值的参照完整性
- CHECK -保证列中的值符合指定的条件
- DEFAULT -规定没有给列赋值时的默认值
-
NOT NULL
NOT NULL约束强制列不接受NULL值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
在一个已创建的表的“Age”字段中添加NOT NULL约束:
ALTER TABLE Persons MODIFY Age int NOT NULL;
在一个已创建的表的“Age”字段中删除NOT NULL约束:
ALTER TABLE Persons MODIFY Age int NULL;
-
UNIQUE
UNIQUE约束唯一标识数据库表中的每条记录。UNIQUE和PRIMARY KEY 约束均为列或列集合提供了唯一性的保证,但是不同的是,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY KEY 约束
实例1:在“Persons”表创建时在“id”列上创建UNIQUE约束:
CREATE TABLE Persons ( id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), UNIQUE (id) )
实例2:在已创建的表Persons表中的“id”列创建UNIQUE约束:
ALTER TABLE Persons ADD UNIQUE (id)
-
PRIMARY KEY
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含NULL值。
每个表都应该有一个主键,并且每个表只能有一个主键。
实例1:在创建“Persons”表时在“id”列上创建PRIMARY KEY约束
CREATE TABLE Persons ( id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), PRIMARY KEY (id) )
实例2:在已创建的表“Persons”的“id”列上创建PRIMARY KEY约束
ALTER TABLE Persons ADD PRIMARY KEY (id)
-
FOREIGN KEY
一个表中的FOREIGN KEY指向另一个表中的UNIQUE KEY。
下面有两个表:
“Persons”表:
id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger "Orders"表:
O_id OrderNo P_id 1 77895 3 2 44678 3 3 22456 2 4 24562 1 "Order"表中的"P_id"列指向"Persons"表中的"id"列。
“Persons”表中的“id”列是“Persons”表中的PRIMARY KEY。
“Orders”表中的"P_id"列是“Orders”表中的FOREIGN KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的行为。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
-
CHECK
CHECK约束用于限制列中的值的范围。
如果对单个列定义CHECK约束,那么该列只允许特定的值。
如果对一个表定义CHECK约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
实例1:在“Persons”表创建时在“id”列上创建CHECK约束,规定“id”列必须只包含大于0的整数
CREATE TABLE Persons ( id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CHECK (id>0) )
实例2:在已创建的“Persons”表中的“id”列上创建CHECK约束,规定“id”列必须只包含大于0的整数
ALTER TABLE Persons ADD CHECK (id>0)
-
DEFAULT
DEFAULT约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。
实例1:在“Persons”表创建时在“City”列上创建DEFAULT约束规定“City”列的默认值
CREATE TABLE Persons ( id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) DEFAULT 'Sandnes' )
实例2:在已创建的“Persons”表中的“City”列上创建DEFAULT约束规定“City”列的默认值
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
-
CREATE INDEX
CREATE INDEX语句用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
基本语法:
CREATE INDEX index_name ON table_name (column_name)
-
DROP
通过DROP语句,可以轻松的删除索引、表和数据库。
-
DROP INDEX 用于删除表中的索引
ALTER TABLE table_name DROP INDEX index_name
-
DROP TABLE 用于删除表
DROP TABLE table_name
-
DROP DATABASE 用于删除数据库
DROP DATABASE database_name
-
如果我们仅仅需要删除表内的数据,但并不删除表本身,可以使用TRUNCATE TABLE
TRUNCATE TABLE table_name
-
-
ALTER
ALTER TABLE语句用于在已有的表中添加、删除或修改列。
如需在表中添加列,请使用下面的语法:
ALTER TABLE table_name ADD column_name datatype
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
ALTER TABLE table_name DROP COLUMN column_name
要改变表中列的数据类型,请使用下面的语法:
ALTER TABLE table_name MODIFY COLUMN column_name datatype
-
AUTO INCREMENT
AUTO INCREMENT会在新记录插入表中时生成一个唯一的数字。
我们通常希望在每次插入新记录时,自动地创建主键字段的值。
我们可以在表中创建一个auto-increment字段。
实例:把“Persons”表中的“id”列定义为auto-increment主键字段:
CREATE TABLE Persons ( id int NOT NULL AUTO_INCREMENT, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), PRIMARY KEY (id) )
-
日期
当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。只要数据包含的只是日期部分,运行查询就不会出问题,但是,如果涉及时间部分,情况就有点复杂了。
下面的表格列出了MySQL中最重要的内建日期函数:
函数 描述 NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 DATE() 提取日期或日期/时间表达式的日期部分 EXTRACT() 返回日期/时间的单独部分 DATE_ADD() 向日期添加指定的时间间隔 DATE_SUB() 从日期减去指定的时间间隔 DATEDIFF() 返回两个日期之间的天数 DATE_FORMAT() 用不同的格式显示日期/时间 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值,就要使用IS NULL 和 IS NOT NULL 操作符
-
通用数据类型
数据类型 描述 CHARACTER(n) 字符/字符串。固定长度n VARCHAR(n)或CHARACTER VARYING(n) 字符/字符串。可变长度,最大长度n BINARY(n) 二进制串,固定长度n BOOLEAN 存储TRUE或FALSE值 VARBINARY(n)或BINARY VARYING(n) 二进制串。可变长度,最大长度n INTEGER§ 整数值(没有小数点),精度p SMALLINT 整数值(没有小数点),精度5 INTEGER 整数值(没有小数点),精度10 BIGINT 整数值(没有小数点),精度19 DECIMAL(p,s) 精确数值,精度p,小数点后位数s NUMERIC(p,s) 精确数值,精度p,小数点后位数s FLOAT§ 近似数值,位数精度p REAL 近似数值,尾数精度7 FLOAT 近似数值,尾数精度16 DOUBLE PRECISION 近似数值,尾数精度16 DATE 存储年、月、日的值 TIME 存储小时、分、秒的值 TIMESTAMP 存储年、月、日、小时、分、秒的值 INTERVAL 由一些整数字段组成,代表一段时间,取决于区间的类型 ARRAY 元素的固定长度的有序集合 MULTISET 元素的可变长度的无序集合 XML 存储XML数据 -
MySQL数据类型
数据类型 描述 CHAR(size) 保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符 VARCHAR(size) 保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。**注释:**如果值的长度大于 255,则被转换为 TEXT 类型。 TINYTEXT 存放最大长度为 255 个字符的字符串。 TEXT 存放最大长度为 65,535 个字符的字符串。 BLOB 用于 BLOBs(Binary Large OBjects)。存放最多 65,535 字节的数据。 MEDIUMTEXT 存放最大长度为 16,777,215 个字符的字符串。 MEDIUMBLOB 用于 BLOBs(Binary Large OBjects)。存放最多 16,777,215 字节的数据。 LONGTEXT 存放最大长度为 4,294,967,295 个字符的字符串。 LONGBLOB 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。 ENUM(x,y,z,etc) 允许您输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。 **注释:**这些值是按照您输入的顺序排序的。