本章只是总结的一部分常用的SQL语句,较为辅助的数据库语句,更多语句可以查看:“SQL 数据库常用语句(一)”
连接:https://blog.csdn.net/BYH371256/article/details/83345751
31、CHECK 约束用于限制列中的值的范围(如果对单个列定义 CHECK 约束,那么该列只允许特定的值,
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制)
示例:
下面的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。
CREATE TABLE Persons (My SQL:)
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
CHECK (Id_P>0)
)
CREATE TABLE Persons (SQL Server / Oracle / MS Access:)
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL
)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
CREATE TABLE Persons (MySQL / SQL Server / Oracle / MS Access:)
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)
撤销 CHECK 约束
如需撤销 CHECK 约束,请使用下面的 SQL:
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
MySQL:
ALTER TABLE Persons
DROP CHECK chk_Person
32、DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录
CREATE TABLE Persons
(
Id_P int NOT NULL,
City varchar(255) DEFAULT 'Sandnes'
)
33、通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
34、CREATE INDEX 语句用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据;
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。
因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
示例1:在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
示例2:在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name)
注释:"column_name" 规定需要索引的列。
35、DROP:通过使用 DROP 语句,可以轻松地删除索引、表和数据库;
DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):(语法:DROP TABLE 表名称)
DROP DATABASE 语句用于删除数据库:(语法:DROP DATABASE 数据库名称)
仅除去表内的数据,但并不删除表本身,使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据):(语法:TRUNCATE TABLE 表名称)
36、ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
在表中添加列:(语法:ALTER TABLE table_name ADD column_name datatype)
删除表中的列:(语法:ALTER TABLE table_name DROP COLUMN column_name)
注释:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。
改变表中列的数据类型:(语法:ALTER TABLE table_name ALTER COLUMN column_name datatype)
37、Auto-increment 会在新记录插入表中时生成一个唯一的数字。
在每次插入新记录时,自动地创建主键字段的值;可以在表中创建一个 auto-increment 字段。
用于 MySQL 的语法
下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
PRIMARY KEY (P_Id)
)
MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:ALTER TABLE Persons AUTO_INCREMENT=100
要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName) VALUES ('Bill','Gates')
38、Date 函数:日期
当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。
只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。
如果表中日期是包含时间的,查询不含有时间部分的日期,查询到的数据为空。
提示:如果您希望使查询简单且更易维护,那么请不要在日期中使用时间部分!
MySQL Date 函数
下面的表格列出了 MySQL 中最重要的内建日期函数:
函数-----描述:(NOW()---返回当前的日期和时间;CURDATE()---返回当前的日期;DATE()---提取日期或日期/时间表达式的日期部分;
EXTRACT()---返回日期/时间按的单独部分;DATE_ADD()---给日期添加指定的时间间隔;DATE_SUB()---从日期减去指定的时间间隔
DATEDIFF()---返回两个日期之间的天数;DATE_FORMAT()---用不同的格式显示日期/时间)
SQL Server Date 函数
下面的表格列出了 SQL Server 中最重要的内建日期函数:
函数-------描述:(GETDATE()---返回当前日期和时间;DATEPART()---返回日期/时间的单独部分
DATEADD()---在日期中添加或减去指定的时间间隔;DATEDIFF()---返回两个日期之间的时间;CONVERT()---用不同的格式显示日期/时间)
SQL Date 数据类型
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式 YYYY-MM-DD; DATETIME - 格式: YYYY-MM-DD HH:MM:SS; TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
YEAR - 格式 YYYY 或 YY
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式 YYYY-MM-DD; DATETIME - 格式: YYYY-MM-DD HH:MM:SS; SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: 唯一的数字
39、函数返回当前的日期和时间:SELECT NOW(),CURDATE(),CURTIME()
NOW 函数返回当前的日期和时间。
提示:如果您在使用 Sql Server 数据库,请使用 getdate() 函数来获得当前的日期时间。
语法:SELECT NOW() FROM table_name
示例:SELECT ProductName, UnitPrice, Now() as PerDate FROM Products
40、NULL 值是遗漏的未知数据,默认地,表的列可以存放 NULL 值,IS NULL 和 IS NOT NULL 操作符。
(无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。我们必须使用 IS NULL 和 IS NOT NULL 操作符)
表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。NULL 用作未知的或不适用的值的占位符。注释:无法比较 NULL 和 0;它们是不等价的。
示例1:SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NULL 查找为Null的数据
示例2:SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NOT NULL 查找不为Null的数据
41、ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder (假如 "UnitsOnOrder" 是可选的,而且可以包含 NULL 值)
1 computer 699 25 15
2 printer 365 36
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder) FROM Products 在这里,我们希望 NULL 值为 0。
如果 "UnitsOnOrder" 是 NULL,则不利于计算,因此如果值是 NULL 则 ISNULL() 返回 0
SQL Server / MS Access:SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products。
Oracle 没有 ISNULL() 函数。不过,我们可以使用 NVL() 函数达到相同的结果:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0)) FROM Products。
MySQL
MySQL 也拥有类似 ISNULL() 的函数。不过它的工作方式与微软的 ISNULL() 函数有点不同。
在 MySQL 中,我们可以使用 IFNULL() 函数,就像这样:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products。
或者我们可以使用 COALESCE() 函数,就像这样:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0)) FROM Products。
42、Microsoft Access、MySQL 以及 SQL Server 所使用的数据类型和范围,使用不同数据库,数据类型和范围可能不一样;
43、现代的 SQL 服务器构建在 RDBMS 之上。
DBMS - 数据库管理系统(Database Management System)
数据库管理系统是一种可以访问数据库中数据的计算机程序。
DBMS 使我们有能力在数据库中提取、修改或者存贮信息。
不同的 DBMS 提供不同的函数供查询、提交以及修改数据。
RDBMS - 关系数据库管理系统(Relational Database Management System)
关系数据库管理系统 (RDBMS) 也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。
20 世纪 70 年代初,IBM 公司发明了 RDBMS。
RDBMS 是 SQL 的基础,也是所有现代数据库系统诸如 Oracle、SQL Server、IBM DB2、Sybase、MySQL 以及 Microsoft Access 的基础。
/SQL 用于计数和计算的内建函数///
44、AVG 函数返回数值列的平均值。NULL 值不包括在计算中。语法:(SELECT AVG(column_name) FROM table_name)
示例:SELECT Customer FROM Orders WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
找到 OrderPrice 值高于 OrderPrice 平均值的客户
45、COUNT() 函数返回匹配指定条件的行数。COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
语法:SELECT COUNT(column_name) FROM table_name
COUNT(*) 函数返回表中的记录数:SELECT COUNT(*) FROM table_name
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:SELECT COUNT(DISTINCT column_name) FROM table_name
注释:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是无法用于 Microsoft Access。
示例:SELECT COUNT(Customer) AS CustomerNilsen FROM Orders WHERE Customer='Carter' 希望计算客户 "Carter" 的订单数
QL COUNT(*) 实例:如果我们省略 WHERE 子句,比如这样:SELECT COUNT(*) AS name FROM Orders
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders 计算 "Orders" 表中不同客户的数目。
46、FIRST() 函数返回指定的字段中第一个记录的值。提示:可使用 ORDER BY 语句对记录进行排序。
SQL FIRST() 语法:SELECT FIRST(column_name) FROM table_name
47、LAST() 函数返回指定的字段中最后一个记录的值。提示:可使用 ORDER BY 语句对记录进行排序。
SQL LAST() 语法:SELECT LAST(column_name) FROM table_name
48、MAX 函数返回一列中的最大值。NULL 值不包括在计算中。
SQL MAX() 语法:SELECT MAX(column_name) FROM table_name
注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
49、MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
SQL MIN() 语法:SELECT MIN(column_name) FROM table_name
注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
50、SUM 函数返回数值列的总数(总额)。
SQL SUM() 语法:SELECT SUM(column_name) FROM table_name
51、合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
SQL GROUP BY 语法:SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value
GROUP BY column_name
示例:SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer 查询后显示 用户 以及用户的总数
对一个以上的列应用 GROUP BY 语句,就像这样:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate
52、HAVING 子句:在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
语法:SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value
GROUP BY column_name HAVING aggregate_function(column_name) operator value
示例:SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000 希望查找订单总金额少于 2000 的客户
示例:SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer HAVING SUM(OrderPrice)>1500
53、UCASE 函数把字段的值转换为大写。语法:SELECT UCASE(column_name) FROM table_name
示例:SELECT UCASE(LastName) as LastName,FirstName FROM Persons 选取 "LastName" 和 "FirstName" 列的内容,然后把 "LastName" 列转换为大写。
54、LCASE 函数把字段的值转换为小写。语法:SELECT LCASE(column_name) FROM table_name
示例:SELECT LCASE(LastName) as LastName,FirstName FROM Persons
55、MID 函数用于从文本字段中提取字符。语法:SELECT MID(column_name,start[,length]) FROM table_name
参数 描述
column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
示例:SELECT MID(City,1,3) as SmallCity FROM Persons (别名:as SmallCity)
结果集:
SmallCity
Lon
56、LEN 函数返回文本字段中值的长度。语法:SELECT LEN(column_name) FROM table_name
示例:SELECT LEN(City) as LengthOfCity FROM Persons
57、ROUND 函数用于把数值字段舍入为指定的小数位数。语法:SELECT ROUND(column_name,decimals) FROM table_name 四舍五入
参数 描述
column_name 必需。要舍入的字段。
decimals 必需。规定要返回的小数位数。
示例:SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products 把名称和价格舍入为最接近的整数
58、FORMAT 函数用于对字段的显示进行格式化。语法:SELECT FORMAT(column_name,format) FROM table_name
参数 描述
column_name 必需。要格式化的字段。
format 必需。规定格式。
示例:SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate FROM Products
59、查询不连续ID :
语法:select image_id + 1 from image_list a where not exists(select * from image_list b where b.image_id = a.image_id + 1) and image_id < (select MAX(image_id) from image_list)
语法(返回不连续ID 或者是最大值):select image_id + 1 from image_list a where not exists(select * from image_list b where b.image_id = a.image_id + 1)