SQL数据库常用语句汇总

文章目录

  • 查询语句
    • 常用函数
      • 聚集函数/汇总函数
      • 日期和时间处理函数
      • 数值处理函数
      • 文本处理函数/字符处理函数
      • 转换函数
    • 子查询,即嵌套查询
      • EXISTS, ANY, ALL
    • 联结表 join
    • 组合查询
    • 使用视图
  • 修改语句
  • 数据表语句
  • 数据库语句
  • 事务
  • SQL数据类型
  • Transact-SQL语言

SQL是结构化查询语言的缩写,用来访问和操作数据库系统。

查询语句

查询语句关键词:
SELECT, FROM, WHERE, ORDER BY, GROUP BY, HAVING, INNER JOIN…ON, LIMIT OFFSET
AS 别名
COUNT(), SUM, AVERAGE, MAX, MIN
AND, OR, IN, NOT
UNION
LIKE;“ * ” 通配符,表示所有;%表示任意字符出现任意次数;_匹配单个字符;[]指定一个字符集;^ 表否定
拼接: + ||
多条SQL语句以 ; 分隔

SQL数据库常用语句汇总_第1张图片

  • SELECT 1; 测试数据库是否连接
  • SELECT * FROM <表名> ; 查询一个表的所有行和所有列的数据
  • SELECT * FROM <表名> WHERE <条件表达式> ; 条件查询
    条件表达式中可使用LIKE判断相似,例如name LIKE ‘ab%’,其中%表示任意字符。
  • SELECT 列1, 列2, 列3 FROM …,让结果集仅包含指定列。
    SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM … 给列起别名。
  • SELECT id, name, gender, score FROM students ORDER BY score DESC; ORDER BY排序,默认升序,DESC降序,ORDER BY后面可以是多列。ORDER BY子句在WHERE子句后面。
  • LIMIT M OFFSET N, 分页查询。例如SELECT id, name, gender, score FROM students ORDER BY score DESC LIMIT 3 OFFSET 0; 表示结果集分页,每页3条记录,获取第1页的记录。上述查询LIMIT 3 OFFSET 0表示,对结果集从0号记录开始,最多取3条。注意SQL记录集的索引从0开始。
  • SELECT COUNT(*) num FROM students; COUNT() 聚合查询,统计有多少条记录, num是别名。
    SELECT COUNT(*) boys FROM students WHERE gender = ‘M’; 可以用WHERE筛选

如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL。

  • SELECT class_id, COUNT() num FROM students GROUP BY class_id HAVING COUNT() >= 2; 分组聚合,按class_id分组。也可以根据多个列分组。HAVING 过滤分组 (区别:WHERE是过滤行)

  • SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
    FROM students s
    INNER JOIN classes c
    ON s.class_id = c.id;
    连接查询,可选:加上WHERE子句、ORDER BY等子句

  • WHERE子句操作符:
    SQL数据库常用语句汇总_第2张图片
    BETWEEN匹配范围内的所有值,包括指定的开始和结束值。

  • IN 操作符
    SELECT prod_name, prod_price FROM Products WHERE vend_id IN ('DLL01', 'BRS01') ORDER BY prod_name;

  • LIKE 操作符
    SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE 'Fish%';
    SELECT cust_contact FROM Customers WHERE cust_contact LIKE '[JM]%' 表示所有以J或M起头的联系人。'[^JM]%'表示匹配不以J或M起头的联系人

  • 拼接
    SELECT vendor_name + '(' + vend_country + ')' FROM Vendors ORDER BY vend_name;

常用函数

聚集函数/汇总函数

AVG()函数忽略列值为NULL的行。
SUM()函数忽略列值为NULL的行。
COUNT(*)统计所有行数;COUNT(column)对特定列中具有值得行进行计数,忽略NULL值。
VARIANCE : 方差
STDDEV: 标准差
聚集不同值:ALL为默认,如果只包含不同的值,指定DISTINCT参数。
SELECT AVG(DISTINCT prod_price) AS avg_price FROM Products WHERE end_id = 'DLL01';

日期和时间处理函数

注意:不同的数据库日期时间处理函数差别很大。
SELECT order_num FROM Orders WHERE YEAR(order_date) = 2004; 表示检索2004年的所有订单
ADD_MONTHS(): 默认将给定的日期增加一个月,ADD_MONTHS(col, 2) 增加两个月
LAST_DAY(): 返回指定月份的最后一天
MONTHS_BETWEEN(): 计算给定的两个日期中有多少个月
SYSDATE: 返回系统的日期和时间
GETDATE() : 获取当前系统时间
DATEADD(datepart, number, date): 在指定日期上增加年、月、日或时间等。datepart参数规定在日期的哪个部分增减数值.DATEADD(year, 5, GETDATE() )
DATEDIFF(datepart, date1, date2):获取两个日期间的差,并返回数值数据
DATENAME(datepart, date): 获取日期的一部分,并以字符串形式返回。
DATEPART(datepart, date): 获取日期的一部分,并以整数值返回。

数值处理函数

SQL数据库常用语句汇总_第3张图片
CEIL:比给定参数大或者相等的最小整数。6.4->7
FLOOR:比给定参数小或相等的最大整数。6.4->6
LN:返回给定参数的自然对数。
LOG(col, a): 以a为底的对数
MOD:余数
POWER(a,b): a为底数,b为指数
SIGN: 如果负数,返回-1;如果整数,返回1;如果0,返回0.
RAND:返回0-1之间的随机float值。
ROUND(numeric_表达式, length): 返回数字表达式四舍五入为指定的长度或精度

文本处理函数/字符处理函数

CONCAT:连接两个字符串。 SELECT CONCAT(firstname, lastname) "first and last names" FROM Characters 多个词做别名时用引号。
INITCAP: 第一个字母变大写,其他字母转换为小写。
REPLACE(a,b,c): a是需要搜索的字符串,b是搜索的内容,c是需要替换成的字符串。如果c省略或者是NULL,那么只执行搜索操作而不替换任何内容。
TRANSLATE(a,b,c):a目标字符串,b源字符串,c目的字符串。在目标字符串和源字符串中均出现的字符将会被替换成对应目的字符串。
UPPER() 大写
RTRIM() 去掉右边的所有空格
SQL数据库常用语句汇总_第4张图片
SOUNDEX() 匹配所有发音类似的函数,例 SELECT cust_name, cust_contact FROM Customers WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');

转换函数

CONVERT(datatype[(length)], expression, [style]): expression 要进行数据类型转换的值或列名。
CAST(expression AS datatype[(length)]):
TO_CHAR: 转换为字符型
TO_NUMBER: 转换为数值型
STARTING WITH: 作用与LIKE(exp%)相似

子查询,即嵌套查询

SELECT cust_id FROM Orders WHERE orders_num IN (SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01');

  • 创建计算字段
SELECT cust_name, cust_state,
(SELECT COUNT(*)  FROM orders WHERE Orders.cust_id = Customers.cust_id) AS orders # orders 是一个计算字段
FROM Customers
ORDER BY cust_name;

EXISTS, ANY, ALL

EXISTS: 子查询返回的内容为非空时 EXISTS 返回 TRUE, 否则返回 FALSE。
ANY:ANY 与子查询中的每一行与主查询进行比较 并对子查询中的每一行返回一个 TRUE值。等号时,IN 返回的结果与 SOME 或 ANY 是相同的。
ALL :在于子查询中的所有结果均满足条件时它才会返回 TRUE。

联结表 join

内部联结 INNER JOIN…ON
外部联结 LEFT OUTER JOIN…ON 左边表选择所有行; 同等于 WHERE *=
RIGHT OUTER JOIN…ON 同等于 WHERE =*
全外部联结 FULL OUTER JOIN…ON

注意:表别名只在查询执行中使用,与列别名不一样,表别名不返回到客户机;而列别名返回客户机展示。

组合查询

UNION:并集, 相当于WHERE OR
UNION必须由两条或两条以上SELECT语句组成;UNION每个查询必须有包含相同得列,不过次序可以不同。
UNION默认从查询结果集中自动去除重复行。如果要匹配所有行,使用UNION ALL.
UNION只能使用一条ORDER BY子句,必须出现在最后一条SELECT语句之后。

SELECT cust_name,cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT cust_name,cust_contact, cust_email
RFOM Customers
WHERE cust_name = 'Fun4All'
ORDER BY cust_name, cust_contact;

使用视图

视图是虚拟的表。

  • 利用视图简化复杂的联结
    视图极大地简化了复杂SQL语句的使用。利用视图,可一次性编写基础的SQL,然后根据需要多次使用。
    创建视图 CREATE VIEW...AS
CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num;

然后把视图当作虚拟的表,可再次查询。

SELECT cust_name, cust_contact FROM ProductCustomers WHERE prod_id = 'RGAN01';

修改语句

增删改查,即CRUD:Create、Retrieve、Update、Delete。
INSERT:插入新记录;
UPDATE:更新已有记录;
DELETE:删除已有记录。

  • INSERT INTO <表名> (字段1, 字段2, …) VALUES (值1, 值2, …); 可以一次性添加多条记录。注意:字段顺序不必和数据库表的字段顺序一致,但值的顺序必须和字段顺序一致。

  • INSERT INTO statistics (class_id, average) SELECT class_id, AVG(score) FROM students GROUP BY class_id; 写入查询结果集,需确保INSERT语句的列和SELECT语句的列能一一对应。

  • UPDATE <表名> SET 字段1=值1, 字段2=值2, … WHERE …; 建议最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用UPDATE更新。

  • DELETE FROM <表名> WHERE …; 在执行DELETE语句时也要非常小心,最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用DELETE删除。

  • REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99); 插入或替换

  • INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99) ON DUPLICATE KEY UPDATE name=‘小明’, gender=‘F’, score=99; 插入或更新,若id=1的记录不存在,INSERT语句将插入新记录,否则,当前id=1的记录将被更新,更新的字段由UPDATE指定。

  • INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99); 插入或忽略

数据表语句

SHOW TABLES; 列出当前数据库的所有表
DESC students; 查看一个表的结构
SHOW CREATE TABLE students; 查看创建表的SQL语句
CREATE TABEL ‘students’ (
‘id’ bigint(20) NOT NULL AUTO_INCREMENT,
‘name’ varchar(100) NOT NULL,
PRIMARY KEY (‘id’)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
创建表
DROP TABLE students; 删除表
ALTER TABLE students ADD COLUMN birth VARCHAR(10) NOT NULL; 修改表
ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL; 修改birth列,例如把列名改为birthday,类型改为VARCHAR(20)。
ALTER TABLE students DROP COLUMN birthday; 删除列

CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1; 快照,即复制一份当前表的数据到一个新表,新创建的表结构和SELECT使用的表结构完全一致。

数据库语句

SHOW DATABASES; 列出所有数据库
USE test; 对一个数据库进行操作时,首先将其切换为当前数据库
CREATE DATABASE test; 创建一个新数据库
DROP DATABASE test; 删除一个数据库,慎用!!!

命令行程序mysql实际上是MySQL客户端,真正的MySQL服务器程序是mysqld,在后台运行。

事务

把多条语句作为一个整体进行操作的功能,被称为数据库事务。数据库事务可以确保该事务范围内的所有操作都可以全部成功或者全部失败。
事务执行

BEGIN;  # 开启一个事务
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;  # 提交一个事务

事务回滚

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
ROLLBACK;   # 回滚事务

SQL数据类型

日期和时间数据类型
SQL数据库常用语句汇总_第5张图片
定义数据类型:
SQL数据库常用语句汇总_第6张图片
TINYINT(范围在0~255)。各数据库厂商还会支持特定的数据类型,例如JSON。

Transact-SQL语言

  • 逻辑运算符
    SQL数据库常用语句汇总_第7张图片
    字符串连接运算符:+ 加号

  • CASE语句

SELECT
	CASE 
	    WHEN 学习成绩 >= 85 THEN '优秀’
	    WHEN 学习成绩 >=60 AND 学习成绩 <= 84 THEN '中等’
	    WHEN 学习成绩 < 60 THEN '不及格’
	    ELSE '没有成绩’
	END
FROM 学生信息表

参考文章:
廖雪峰官网:SQL教程
《SQL必知必会(第3版)》[英] BEN Forta著, 钟鸣,刘晓霞 等译

你可能感兴趣的:(数据库)