最近一直在重新学习SQL语句,之前在学校学的都忘得差不多了,前面也零零散散的上传了一笔记,一直是跟着 www.runoob.com 这个网站学的,今天跟着把所有的都跟着做完了,笔记整理了下,使用的数据库是医保耗材过期的练习库,下奶上传上来。
一、常规四件套--增改删查
查询
SELECT 查询使用
SELECT DISTINCT 语句用于返回唯一不同的值。
在表中,一个列可能会包含多个重复值,仅仅列出不同(distinct)的值。DISTINCT 关键词用于返回唯一不同的值。select distinct 列名 from 表名 --筛选出这个列里面唯一的值
例如
select distinct bby05 from bby1
-- SELECT 中 WHERE 子句使用
select * from bby1 where bca01=12
"=" 等于
"< >" 不等于,也可以写成"!="
"> " 大于
"<" 小于
">=" 大于等于
"<=" 小于等于
"between" 在某个范围之间
"like " 搜索模糊范围
"in "指定针对于某个列的多个可能值
运算符
- SQL AND & OR 运算符
--AND & OR 运算符用于基于一个以上的条件对记录进行过滤。
--如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
--筛选出bby1表中bca01等于12但bcf01大于2的信息
select * from bby1 where bca01 ='12' and bcf01>2
--如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
--筛选出bby1表中bca01等于12或bcf01大于2的信息
select * from bby1 where bca01 ='12' or bcf01>2
排序
- SQL ORDER BY 关键字
--ORDER BY 关键字用于对结果集进行排序。关键字用于对结果集按照一个列或者多个列进行排序 。
--ORDER BY 关键字默认按照升序对记录进行排序。
select * from bby1 order by bby04
--order by 列名 desc 按照降序对记录进行排序。
select * from bby1 order by bby04 desc
增加
- SQL INSERT INTO 语句
INSERT INTO 语句用于向表中插入新记录-语句可以有两种编写形式。
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
insert into pass values (10,'小张','24','男','15596395557','山西太原')
第二种形式需要指定列名及被插入的值:
insert into pass (id, name ,age,sex, phone,address) values (1,'杨帆','16','男','19847935678','陕西商洛')
更新
SQL UPDATE 语句
UPDATE 语句用于更新表中的记录,UPDATE 语句用于更新表中的记录。
--修改命令
修改id是9的年龄为21,修改名字是“小吕”的年龄为22update pass set age='21' where id='9' update pass set age='22',sex='女' where name='小吕'
删除
SQL DELETE 语句
DELETE 语句用于删除表中的记录,语句用于删除表中的行 。
--删除Websites中name 列中是Facebook值以及country是USA值的信息行DELETE FROM Websites WHERE name='Facebook' AND country='USA';
- SQL SELECT TOP 子句
SELECT TOP 子句用于规定要返回的记录的数目。
注意:并非所有的数据库系统都支持 SELECT TOP 语句。
--查询前100行在bby1表中的信息
select top 100 * from bby1
- SQL SELECT TOP PERCENT 实例
在 SQL Server 中还可以使用百分比作为参数。
--下面的 SQL 语句从 bby1 表中选取前面百分之 50 的记录:
SELECT TOP 50 PERCENT * FROM bby1
相似值查询
- SQL LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
--查询bby1表中bby05列中“骨”开头的行信息,"%" 符号用于在模式的前后定义通配符。
select * from bby1 where bby05 like '骨%'
--查询bby1表中bby05列中“骨”开头的行信息, "_" 符号用于在模式的前后定义索引的字数,在骨后索引三个字符数。
select * from bby1 where bby05 like '骨___'
--查询bby1表中bby05列中不包含“骨”字的行信息,
select * from bby1 where bby05 not like '%骨%'
- SQL 通配符
通配符可用于替代字符串中的任何其他字符。
在 SQL 中,通配符与 SQL LIKE 操作符一起使用,通配符用于搜索表中的数据。
% 替代0个或多个字符
_ 替代一个字符串位置
--查询bby1表中bby06列“成人”开头的所有信息
select * from bby1 where bby06 like '成人%'
SQL IN 操作符
IN 操作符允许您在 WHERE 子句中规定多个值。
--查询在bby1表中bby05列名字是“科雷氏骨折切开复位内固定术” ,“髁状突陈旧性骨折整复术的信息”select * from bby1 where bby05 in ('科雷氏骨折切开复位内固定术' ,'髁状突陈旧性骨折整复术')
- SQL BETWEEN 操作符
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
--查询bby1表中bby01列从1到2300的数值
select * from bby1 where bby01 between 1 and 2300
--查询bby1表中bby01列不在1到2300的数值
select * from bby1 where bby01 not between 1 and 2300
--查询bby1表中bby01列不在1到2300的数值并且bca01不是139和140 的数值并按照bca01的升序排列
select * from bby1 where bby01 not between 1 and 2300 and bca01 not in (139,140) order by bca01
--查询bby1表中bby30列的时间介于“2020-10-21”和“2022-10-21”之间的所有创建记录
select * from bby1 where bby30 between '2020-10-21' and '2022-10-21'
- SQL 别名
通过使用 SQL,可以为表名称或列名称指定别名,创建别名是为了让列名称的可读性更强。
--查询表bby1的部分列并书写别名
select bby01 ID, bdn01 类型ID, bby04 编码,bby05 药品名称,bby06 规格,bby08 药品单位,bax01 收入项目,bby30 创建时间 from bby1 收费项目目录
--查询表bby1并将几个列组合成为一个列名书写别名
select bby01 ID, concat( bdn01,',', bby04,',',bby05,',',bby06,',',bby08,',',bby30) as 集合 from bby1
--查询表bby1中的连接项目,两者相互有一个同一个列来进行绑定两个viaode关系来进行查询
select c.BBY01,y.bdn01 from bby1 y ,bcs1 c where c.BBY01=y.BBY01
SQL多表连接查询
- SQL 连接(JOIN)
SQL join 用于把来自两个或多个表的行结合起来。
--将两个表的列vaa01关联起来
select * from vac1
inner join cbm1
on vac1.VAA01=cbm1.VAA01
INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行
--在SQL中inner join 和join 是一样的效果
select vac01,vac02,vac1.BAO02 from vac1
join cbm1
on vac1.VAA01=cbm1.VAA01
SQL LEFT JOIN 关键字
--LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。
--如果右表中没有匹配,则结果为 NULL。有时候left join 也称为left outer joinselect vac01,vac02,vac1.BAO02 from vac1 left join cbm1 on vac1.VAA01=cbm1.VAA01 order by vac01 desc
SQL RIGHT JOIN 关键字
--RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。
--如果左表中没有匹配,则结果为 NULL。select vac01,vac02,vac1.BAO02 from vac1 right join cbm1 on vac1.VAA01=cbm1.VAA01 order by vac01 desc
- SQL FULL OUTER JOIN 关键字
/*FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.
FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。*/
select vac01,vac02,vac1.BAO02 from vac1
full outer join cbm1
on vac1.VAA01=cbm1.VAA01
order by vac01 desc
操作符
SQL UNION 操作符
/*SQL UNION 操作符合并两个或多个 SELECT 语句的结果集。UNION 内部的每个 SELECT 语句必须拥有相同数量的列。
列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
默认union的操作符选取不同的值,如果允许重复的值,请使用union all
*/
--查询bby1表中 bca01,bdn01 ,bby05字段并且bca01不为空值且bca1表中的bca01具有相同关联的列,并且降序排列select bca01,bdn01 ,bby05 from bby1 where bca01<>' ' union select bca01,bca02 ,bca03 from bca1 order by bca01 desc
复制表
--SQL SELECT INTO 语句
/*通过 SQL,可以从一个表复制信息到另一个表。SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
可以复制整个表的所有列,也可以复制表中部分或单个列
提示:新表将会使用 SELECT 语句中定义的列名称和类型进行创建。可以使用 AS 子句来应用新名称。*/
--将bbj1表中的所有列和信息复制到test1表中
select * into test1 from bbj1
--将bbj1表中的部分列和信息复制到test2表中
select bbj01,bby01,acf01,bck01a into test2 from bbj1
--删除上面创建的两个表
delete from test1
delete from test2
二、创建、复制、删除、修改(表/库)(用查询语句)
- SQL INSERT INTO SELECT 语句
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。
目标表中任何已存在的行都不会受影响。
从一个表中复制所有的列插入到另一个已存在的表中,前提是具有共同的字段列和数据类型
--复制bbj1表中的数据到test1中,并查询test1表中的信息
insert into test1
select * from bbj1
go
select * from test1
select into from 和 insert into select 都是用来复制表
两者的主要区别为: select into from 要求目标表不存在,
因为在插入时会自动创建;insert into select from 要求目标表存在。
- 复制表结构及其数据:
create table table_name_new as select * from table_name_old
- 只复制表结构:
create table table_name_new as select * from table_name_old where 1=2;
或者:
create table table_name_new like table_name_old
- 只复制表数据:
如果两个表结构一样:
insert into table_name_new select * from table_name_old
如果两个表结构不一样:
insert into table_name_new(column1,column2...) select column1,column2... from table_name_old
- 创建数据库
SQL CREATE DATABASE 语句
--CREATE DATABASE 语句用于创建数据库。CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) );
- 约束(增改删)
- SQL 约束(Constraints)
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),
或者在表创建之后规定(通过 ALTER TABLE 语句)。
在 SQL 中,有如下约束:
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。
确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
DEFAULT - 规定没有给列赋值时的默认值。
约束(创)
create table Persons( ID INT not null, LastName varchar(255) not null, FirstName varchar(255) not null, Age int )
- 约束(增)
添加age的约束不为空
alter table Persons alter column Age int not null;
- 约束(删)
删除age以创建好的约束为空
alter table Persons alter column Age int null;
在创建表的时候为P_id创建约束UNIQUE
CREATE TABLE Persons ( P_Id int NOT NULL UNIQUE, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) )
已经创建表后添加约束
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
--撤销unique约束
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
- 主键约束
- SQL PRIMARY KEY 约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含 NULL 值。每个表都应该有一个主键,并且每个表只能有一个主键。
--当数据表已经创建后,需要新增primary key的约束
alter table Prsons add primary key (P_id)
--需要重新命名或者重新定义多个列的主键信息
alter table Prsons add constraint pk_PrsonsID primary key (P_id,LastName)
FOREIGN KEY 约束用于预防破坏表之间连接的行为。
FOREIGN KEY约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
--在Orders表创建的时候创建foreign key 约束CREATE TABLE Orders ( O_Id int NOT NULL PRIMARY KEY, OrderNo int NOT NULL, P_Id int FOREIGN KEY REFERENCES Persons(P_Id) )
--alter table 时的SQL foreign key 约束,已经创建好表,使用
alter table Orders add foreign (P_id) references Persons(P_id)
--重新定义FOREIGN KEY约束,定义多个列的FOREIGN key 约束
alter table Orders add constraint fk_PerOrders foreign key(P_id) references Persons(P_id)
撤销FOREIGN KEY约束
ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders
- SQL DEFAULT 约束
DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。
--创建数据表Persons的时候设置City的默认值是Sandnes
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
--当表已经被创建的时候使用alter table来设置city的默认值为sandes
ALTER TABLE Persons ADD CONSTRAINT abf_c DEFAULT 'SANDNES' for City
--撤销default的约束
ALTER TABLE Persons DROP constraint abf_c
- CREATE INDEX 语句用于在表中创建索引
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。
因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
在表上创建一个简单的索引。允许使用重复的值:
--在表iah1中创建索引列是iah01的索引countes的索引
create index countes on iah1(iah01)
SQL 撤销索引、撤销表以及撤销数据库
--通过使用 DROP 语句,可以轻松地删除索引、表和数据库。此处删除刚在创建的countes的索引drop index countes on iah1
--删除表
drop table 表名
--删除数据库
drop database 库名
--truncate table 语句
--仅需要删除表内的数据,但并不删除表本身
truncate table 表名
- ALTER TABLE 语句
alter table 表名 add 列名 数据类型 --添加
alter table 表名 drop 列名 --删除
alter table 表名 alter column 列名 数据类型 --修改
--例如在数据ACO1中添加列ABBVW列 类型为int
alter table aco1 add ABBVW int
--例如在数据ACO1中删除列ABBVW列
alter table aco1 drop ABBVW
--修改数据ACO1中添加列ABBVW列类型为varchar(10)
alter table aco1 alter column ABBVW varchar(10)
SQL AUTO INCREMENT 字段
--Auto-increment 会在新记录插入表中时生成一个唯一的数字。
--用于 SQL Server 的语法
/*
下面的 SQL 语句把 "Persons" 表中的 "ID" 列定义为 auto-increment 主键字段:CREATE TABLE Persons ( ID int IDENTITY(1,1) PRIMARY KEY, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) )
MS SQL Server 使用 IDENTITY 关键字来执行 auto-increment 任务。
在上面的实例中,IDENTITY 的开始值是 1,每条新记录递增 1。
提示:要规定 "ID" 列以 10 起始且递增 5,请把 identity 改为 IDENTITY(10,5)。*/给已经存在的列添加递增auto_increment
alter table 表名 change 列名 列名 列名属性 not null auto-increment
三、视图
SQL 视图(Views)视图是可视化的表。
**视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。**
--例如在bby1表中创建视图,其中bca01字段的数值必须大于12create view tools as select * from bby1 where bca01>12
查询视图tools
select * from tools
注意:视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。
SQL 更新视图
在tools 视图增加字段bdn01等于T的值alter view tools as select * from bby1 where bca01>12 and bdn01='T'
SQL撤销视图
drop view 视图名
- SQL Date 函数
SQL 日期(Dates)
**确保所插入的日期的格式,与数据库中日期列的格式相匹配。数据包含的只是日期部分,运行查询就不会出问题。
但是,如果涉及时间部分,情况就有点复杂了。在讨论日期查询的复杂性之前,最重要的内建日期处理函数。**
函数 描述
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 - 格式:唯一的数字
注释:当在数据库中创建一个新表时,需要为列选择数据类型!
--查询时间列的信息,当有年月日的时候可以根据日期查询,当有时间查询的时候不能只取日期查询,因为没有匹配项目
--查询bby1表中bca01的字段大于12的,并且bdn01字段等于T的,且bby30时间的字段为2017-06-14 09:43:08.617,并且按照bby04来升序排列
select * from bby1 where bca01>12 and bdn01='T' and bby30 = '2017-06-14 09:43:08.617' order by bby04
提示:如果希望使查询简单且更易维护,那么请不要在日期中使用时间部分!
- SQL NULL 值
--NULL 值代表遗漏的未知数据。默认地,表的列可以存放 NULL 值。
--如果表中的某个列是可选的,可以在不向该列添加值的情况下插入新记录或更新已有的记录。
--这意味着该字段将以 NULL 值保存。NULL 值的处理方式与其他值不同。
--NULL 用作未知的或不适用的值的占位符。Note注释:无法比较 NULL 和 0;它们是不等价的。
-- IS NULL用于仅仅查找某个列的NULL值,也可以使用NOT查找不是空值的某个列,这里查找是NULL空值的数据
select * from bby1 where bby10 is null
--查找bby1表中bby10的字段不是NULL空值的数据
select * from bby1 where bby10 is not null
--在数据库中可以看到的字段部分是可以计算的,也允许这个集合是NULL,计算中NULL是0
select bby01,bdn01,bby04+bby11 集合 from BBY1
四、SQL 通用数据类型
**数据类型定义列中存放的值的种类。
数据库表中的每个列都要求有名称和数据类型。**
Each column in a database table is required to have a name and a data type.
**在创建 SQL 表时决定表中的每个列将要存储的数据的类型。
数据类型是一个标签,是便于 SQL 了解每个列期望存储什么类型的数据的指南,它也标识了 SQL 如何与存储的数据进行交互。**
数据类型 描述
CHARACTER(n) 字符/字符串。固定长度 n。
VARCHAR(n) 或
CHARACTER VARYING(n) 字符/字符串。可变长度。最大长度 n。
BINARY(n) 二进制串。固定长度 n。
BOOLEAN 存储 TRUE 或 FALSE 值
VARBINARY(n) 或
BINARY VARYING(n) 二进制串。可变长度。最大长度 n。
INTEGER(p) 整数值(没有小数点)。精度 p。
SMALLINT 整数值(没有小数点)。精度 5。
INTEGER 整数值(没有小数点)。精度 10。
BIGINT 整数值(没有小数点)。精度 19。
DECIMAL(p,s) 精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数,小数点后有 2 位数的数字。
NUMERIC(p,s) 精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同)
FLOAT(p) 近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。
REAL 近似数值,尾数精度 7。
FLOAT 近似数值,尾数精度 16。
DOUBLE PRECISION 近似数值,尾数精度 16。
DATE 存储年、月、日的值。
TIME 存储小时、分、秒的值。
TIMESTAMP 存储年、月、日、小时、分、秒的值。
INTERVAL 由一些整数字段组成,代表一段时间,取决于区间的类型。
ARRAY 元素的固定长度的有序集合
MULTISET 元素的可变长度的无序集合
XML 存储 XML 数据
- SQL Server 数据类型
-- String 类型:
数据类型 描述 存储
char(n) 固定长度的字符串。最多 8,000 个字符。 Defined width
varchar(n) 可变长度的字符串。最多 8,000 个字符。 2 bytes + number of chars
varchar(max) 可变长度的字符串。最多 1,073,741,824 个字符。 2 bytes + number of chars
text 可变长度的字符串。最多 2GB 文本数据。 4 bytes + number of chars
nchar 固定长度的 Unicode 字符串。最多 4,000 个字符。 Defined width x 2
nvarchar 可变长度的 Unicode 字符串。最多 4,000 个字符。
nvarchar(max) 可变长度的 Unicode 字符串。最多 536,870,912 个字符。
ntext 可变长度的 Unicode 字符串。最多 2GB 文本数据。
bit 允许 0、1 或 NULL
binary(n) 固定长度的二进制字符串。最多 8,000 字节。
varbinary 可变长度的二进制字符串。最多 8,000 字节。
varbinary(max) 可变长度的二进制字符串。最多 2GB。
image 可变长度的二进制字符串。最多 2GB。
Number 类型:
数据类型 描述 存储 tinyint 允许从 0 到 255 的所有数字。 1 字节 smallint 允许介于 -32,768 与 32,767 的所有数字。 2 字节 int 允许介于 -2,147,483,648 与 2,147,483,647 的所有数字。 4 字节 bigint 允许介于 -9,223,372,036,854,775,808 与 9,223,372,036,854,775,807 之间的所有数字。 8 字节 decimal(p,s) 固定精度和比例的数字。 允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。 p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 smallmoney 介于 -214,748.3648 与 214,748.3647 之间的货币数据。 4 字节 money 介于 -922,337,203,685,477.5808 与 922,337,203,685,477.5807 之间的货币数据。 8 字节 float(n) 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 n 参数指示该字段保存 4 字节还是 8 字节。 float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 4 或 8 字节 real 从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 4 字节
- Date 类型:
数据类型 描述 存储
datetime 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。 8 字节
datetime2 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。 6-8 字节
smalldatetime 从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。 4 字节
date 仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 3 bytes
time 仅存储时间。精度为 100 纳秒。 3-5 字节
datetimeoffset 与 datetime2 相同,外加时区偏移。 8-10 字节
timestamp 存储唯一的数字,每当创建或修改某行时,该数字会更新。
值基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。
- 其他数据类型:
数据类型 描述
sql_variant 存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。
uniqueidentifier 存储全局唯一标识符 (GUID)。
xml 存储 XML 格式化数据。最多 2GB。
cursor 存储对用于数据库操作的指针的引用。
table 存储结果集,供稍后处理。
五、SQL 函数
--SQL 函数
SQL 拥有很多可用于计数和计算的内建函数。
- SQL Aggregate
函数计算从列中取得的值,返回一个单一的值。
AVG() - 返回平均值
COUNT() - 返回行数
FIRST() - 返回第一个记录的值
LAST() - 返回最后一个记录的值
MAX() - 返回最大值
MIN() - 返回最小值
SUM() - 返回总和
- SQL Scalar 函数
SQL Scalar 函数基于输入值,返回一个单一的值。
UCASE() - 将某个字段转换为大写
LCASE() - 将某个字段转换为小写
MID() - 从某个文本字段提取字符,MySql 中使用
SubString(字段,1,end) - 从某个文本字段提取字符
LEN() - 返回某个文本字段的长度
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
NOW() - 返回当前的系统日期和时间
FORMAT() - 格式化某个字段的显示方式
AVG() 函数
--AVG() 函数返回数值列的平均值。select avg(bby01) from bby1
SQL COUNT() 函数
**--COUNT() 函数返回匹配指定条件的行数。
可以查看单独的列返回信息,也可以查看列中某个值的总访问量**select count(bby01) from bby1 where bby04='600300105'
--查询bby1表中bby10不为空得值
select count(bby10) from bby1
- --注意count单独查询列的统计返回信息,只计算这个列不是null的值返回统计--
--查询bby1表中bby04列不重复的项目统计值返回 count(distinct 列名)去除重复值统计
select count(distinct bby04)from bby1
- SQL FIRST() 函数
FIRST() 函数返回指定的列中第一个记录的值。
SQL LAST()函数返回指定列中最后一个值(sql server的用法)
select top 1 bby01 from bby1 order by bby01 desc
- SQL MAX() 语法
- MAX() 函数返回指定列的最大值。
SELECT MAX(column_name) FROM table_name;
--查询返回列bby01的指定列最大数值
select max(bby01) from bby1
--查询验证返回的最大值是不是max的查询最大值
select * from bby1 order by bby01 desc
- SQL MIN() 语法
- MIN() 函数返回指定列的最小值。
SELECT MIN(column_name) FROM table_name;
--查询返回列bby01的指定列最小数值
select min(bby01) from bby1
--查询验证返回的最小值是不是min的查询最小值
select * from bby1 order by bby01
- SQL SUM() 语法
- SUM() 函数返回数值列的总数。
SELECT SUM(column_name) FROM table_name;
--查询bca01这个列的所有数值合计,意思是这个列的所有数字相加
select sum(bca01) 数值合计 from bby1
select bby01,sum(bby1.bcf01) from bby1 group by bby01
GROUP BY 语句
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。但无法添加where子句条件
--查询bby1表中的bby01,bdn01,bca01,bby04,bby05,bby08,并合计查询bcf01字段信息,包含在bby01,bdn01,bca01,bby04,bby05,bby08中select bby01,bdn01,bca01,bby04,bby05,bby08,sum(bcf01) as 合计 from bby1 group by bby01,bdn01,bca01,bby04,bby05,bby08
- SQL HAVING 子句
**在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。**
查询bby1表中的bby01,bdn01,bca01,bby04,bby05,并合计查询bcf01字段信息,包含在bby01,bdn01,bca01,bby04,bby05,bby08中
并且要求集合bcf01的值大于4,bdn01的值是2,按照bby01的降序排列
select bby01,bdn01,bca01,bby04,bby05,sum(bcf01) as 合计 from bby1
group by bby01,bdn01,bca01,bby04,bby05
having sum(bcf01)>4 and bdn01='2'
order by bby01 desc
1.where在group by前, having在group by 之后
2.聚合函数(avg、sum、max、min、count),不能作为条件放在where之后,但可以放在having之后
*/
EXISTS 运算符
**EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
也可以加入not字段 返回不符合查询的值**
--查询iah1表中下列字段,并且iag03字段的值要大于1200,嵌套查询select iah01,iaa01,iah04,iah05,iaf03,abbrp,iah31,iah43,iah45,iah49 from iah1 where exists ( select * from iag1 where iah1.iah01=iag1.iag01 and iag03>1200)
SQL UPPER() 函数
UCPPER() 函数把字段的值转换为大写。
--将查询到的某一列转换为大写,可以包含字段值部分字母的部分为大写select top 500 iah01,iaa01,upper(iah04) iah04 from iah1
SQL LOWER() 函数
LOWER() 函数把字段的值转换为小写。
--将查询到的某一列转换为小写,可以包含字段值部分字母的部分为小写select iah01,iaa01,LOWER(iah04) iah04 from iah1
SQL substring() 函数
substring() 函数用于从文本字段中提取字符。select top 10 bby01,bby04 ,substring(bby05,1,4) from bby1
--使用左标识符也可以截取相应字段
select top 10 bby01,bby04 ,LEFT(bby05,5) BBY05 from bby1
--使用右标识符也可以截取相应字段
select top 10 bby01,bby04 ,right(bby05,5) BBY05 from bby1
SQL LEN() 函数
LEN() 函数返回文本字段中值的长度。
--查看bby1表中bby05字段值的长度值select top 100 bby01,len(bby05) 字段数 from bby1
SQL ROUND() 函数
ROUND() 函数用于把数值字段舍入为指定的小数位数。
--查询表bby1中,bby04字段舍入指定三位小数位select bby01,bdn01,bby05,round(bby04,3) 三位 from bby1
SQL getdate() 函数
getdate() 函数返回当前系统的日期和时间。select getdate() 表时间