附上教程链接~ SQL 教程
开搞!
一、基础教程:基本定义分类
数据操作语言 (DML) 和 数据定义语言 (DDL)。
查询和更新指令构成了 SQL 的 DML 部分(主要针对某个表具体内容):
SQL 中最重要的 DDL 语句(主要针对库、表、索引和关系):
语法
SELECT 列A,列B FROM 表名称
SELECT * FROM 表名称
SELECT DISTINCT 列名称 FROM 表名称
# where条件筛选
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值/'string'
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值/'string' and (列 运算符 值/'string' or 列 运算符 值/'string')
# order by排序筛选
SELECT Company, OrderNumber FROM Orders ORDER BY Company # company是英文字母,按字母顺序
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber #第二个指标代表二级筛选条件(比如有一个company有两个ordernumber,就会按number排序)
into语法
插入行数据
INSERT INTO 表名称 VALUES (值1, 值2,....) #每一个列一次赋值
INSERT INTO 表名称 (列1, 列2,...) VALUES (值1, 值2,....) # 可以插入某几列指定的值,其他列保持空值
语法(行视角)
# 删除某行
DELETE FROM 表名称 WHERE 列 运算符 值/'string'
# 删除全部行,但索引仍保持不变
DELETE FROM 表名称
DELETE * FROM 表名称
#列的删除用alter table
(2022.3.10 / 我好水哈哈哈,就复习了最基本的语法)
Drop 语法
# 删除表:
DROP TABLE 表名称
# 删除数据库:
DROP DATABASE 数据库名称
table 语法
只清除表内数据,不删除表本身
TRUNCATE TABLE 表名称
语法
更新列数据
UPDATE 表名称 SET 列名称 = 新值,列名称 = 新值 WHERE 列 运算符 值/'string'
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;
数据类型
详细信息见SQL 数据类型
二、高级教程Top 语法(并非所有数据库都支持)
SQL 语法:
SELECT TOP number/number percent column_name FROM table_name
MySQL语法:
SELECT column_name FROM table_name LIMIT number
语法:
SELECT column_name FROM table_name WHERE ROWNUM <= number
Like 语法
用于在where子句中搜索列中的指定模式。
SELECT column_name FROM table_name WHERE column_name LIKE pattern;
#举例:以g结尾的city
SELECT * FROM table_name WHERE city LIKE “%g”;
#举例:不选包含lon的city
SELECT * FROM table_name WHERE city NOT LIKE “%lon%”;
SQL通配符(LIKE模式使用)通配符含义
零或多个字符
一个字符
[]
字符列表中任何单一字符
[^] or [!]
不在字符列表中任何单一字符
In 语法
where子句中规定值
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...);
SELECT column_name(s) FROM table_name WHERE column_name NOT IN (value1,value2,...);
语法
where子句中规定值
!!需先明确自己使用的数据库里是左开右闭还是全开等
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
SELECT column_name(s) FROM table_name WHERE column_name NOT BETWEEN value1 AND value2;
As 语法
可以为列名和表名指定昵称(Alias),从而查找时可以简写/新建表或者视图时重新命名
#对表
SELECT column_name(s) FROM table_name AS alias_name;
#对列
SELECT column_name AS alias_name FROM table_name;
#简写举例
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John';
#重命名举例
SELECT LastName AS Family, FirstName AS Name FROM Persons
(后面去玩桌游了,我有罪2022.3.16)
Join 语法(列+列)
SELECT table_a.column_name1,table_a.column_name2,table_b.column_name1
FROM table_a # from谁,谁就是最关心的主体信息,是主键的来源;
JOIN table_b ON table_a.column_name1 = table_b.column_name3;
join逻辑图Union 语法(行+行)
用于合并两个或多个 语句的结果集,要求列完全匹配
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2;
# 如果允许重复的值
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2;
into 语法
从一个表中选取数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。
某种新建表的形式。
SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename;
SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename;
语法
新建数据库
CREATE DATABASE database_name;
table 语法
新建表
CREATE TABLE 表名称
(列名称1 数据类型 约束1,
列名称2 数据类型 NOT NULL,
列名称3 数据类型 ,
....);
约束语法
约束用于限制加入表的数据的类型。
(1)可以在创建表时规定约束(通过 TABLE 语句);
(2)或者在表创建之后也可以(通过 ALTER TABLE 语句)。
我们将主要探讨以下几种约束:
!!其实这些约束也可以通过交互式方式进行设置;即通过界面选择设置。(但我目前不知道企业工作会不会唾弃这种交互式方法)
Not null 约束用法
强制约束列不接受空值(见下方例子)
约束用法
唯一标识数据库表中的每条记录( KEY 拥有自动定义的 约束。)
新建表时增加约束用法如下:
# MySQL
CREATE TABLE Persons
(Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
City varchar(255),
UNIQUE (Id_P) #最后单独说明);
# SQL Server / Oracle / MS Access
CREATE TABLE Persons
(Id_P int NOT NULL UNIQUE, #设定的时候就约束
LastName varchar(255) NOT NULL);
# 给约束命名
CREATE TABLE Persons
(Id_P int NOT NULL, #设定的时候就约束
LastName varchar(255) NOT NULL,
CONSTRAINT pk_PersonID UNIQUE (Id_P,LastName)
);
如果表已被创建,但需要新加约束,使用ALTER TABLE
ALTER TABLE Persons ADD UNIQUE (Id_P);
如需命名 约束,并定义多个列的 约束:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName);
撤销约束:
# MySQL
ALTER TABLE Persons
DROP INDEX uc_PersonID;
# SQL Server / Oracle / MS Access
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID;
key约束语法
主键,唯一标识表,不可重复,自带属性。语法多同,删除时略有不同
# MySQL
ALTER TABLE Persons
DROP PRIMARY KEY;
# SQL Server / Oracle / MS Access
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID;
key 约束语法
外键,某一个表中的外键指向了另一个表的主键,用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
同 key用法相同,但是 后面都加一个引用了哪个表的主键” 表名(主键名)”,效果如下:
# MySQL
CREATE TABLE Orders
(Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
);
删除时不用加,和 key完全相同。
Check 约束语法
用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
# MySQL
CREATE TABLE Persons
(Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
City varchar(255),
CHECK (Id_P>0) #最后单独说明);
# SQL Server / Oracle / MS Access
CREATE TABLE Persons
(Id_P int NOT NULL CHECK (Id_P>0), #设定的时候就约束
LastName varchar(255) NOT NULL);
# 给约束命名
CREATE TABLE Persons
(Id_P int NOT NULL,
City varchar(255),
CONSTRAINT chk_PersonID CHECK (Id_P>0 AND City='Sandnes')
);
表已创建,alter table方法同前约束;删除如下:
# MySQL
ALTER TABLE Persons
DROP CHECK chk_Person;
# SQL Server / Oracle / MS Access
ALTER TABLE Persons
DROP CONSTRAINT chk_Person;
约束语法
用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。后面可以跟符合列数据类型的值(数值/字符串),也可以跟函数。
CREATE TABLE Persons
(City varchar(255) DEFAULT 'Sandnes'
);
# 通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
CREATE TABLE Orders
(Id_P int,
OrderDate date DEFAULT GETDATE()
);
表已经存在:
# MySQL
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES';
# SQL Server / Oracle / MS Access
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
撤销 约束
# MySQL
ALTER TABLE Persons
ALTER City DROP DEFAULT;
# SQL Server / Oracle / MS Access
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
(2022.3.17 不想看了,拜拜,下次再见)
index 语法
在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。用户无法看到索引,它们只能被用来加速搜索/查询。
CREATE INDEX index_name
ON table_name (column_name)
# 在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name, column_name2)
# 可规定索引顺序
CREATE INDEX PersonIndex ON Person (LastName DESC)
# 撤销索引
# Access
DROP INDEX index_name ON table_name
# SQL Server
DROP INDEX table_name.index_name
# IBM DB2 和 Oracle 语法:
DROP INDEX index_name
# MySQL 的语法:
ALTER TABLE table_name DROP INDEX index_name
Auto 字段(MySQL)/ 字段(SqL )
在新纪录插入表中时生成一个唯一的数字,主要用于主键序号的自动生成
# "P_Id" 列定义为 auto-increment 主键,默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
# 规定以其他非1的值起始
ALTER TABLE Persons AUTO_INCREMENT=100
# SQL Server
CREATE TABLE Persons
(
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
# 规定以其他非1的值起始,并且以不同的递增规律增加
Identity(20,10)# 20起始,10递增
view 语法
视图是基于 SQL 语句的结果集的可视化的表。物理虚拟表,即现实不存储。包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
# 创建视图
CREATE VIEW view_name AS
SELECT column_name(s) FROM table_name WHERE condition
# 更新的话就再创建一次
# 撤销视图
DROP VIEW view_name
NULL 值
用is null / is not null
在计算时,可以把null值赋值为0,否则返回也是null结果
# SQL Server / MS Access
ISNULL(UnitsOnOrder,0)
# Oracle
NVL(UnitsOnOrder,0)
# MySQL
IFNULL(UnitsOnOrder,0)
COALESCE(UnitsOnOrder,0)
(2022.3.18 明天学完函数,后天就可以参加测验练习熟练度啦!)
三、函数
AVG()函数
返回列平均值
SELECT AVG(column_name) FROM table_name
COUNT()函数
返回符合条件的行数
SELECT COUNT(column_name) FROM table_name
SELECT COUNT(*) FROM table_name
SELECT COUNT(DISTINCT column_name) FROM table_name
FIRST()、LAST()函数
返回第一个记录的值,可先order by
SELECT FIRST(column_name) FROM table_name
MAX()、MIN()函数
SELECT MAX(column_name) FROM table_name
SUM()函数
返回总数(求和)
SELECT SUM(column_name) FROM table_name
Group by用法
用于结合合计函数(比如sum),根据一个或多个列对结果集进行分组。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
用法
增加 子句原因是: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
# 例子:查找订单总金额少于 2000 的客户。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
UCASE() 、LCASE()函数
把字段的所有值转换为大、小写。
SELECT UCASE(column_name) FROM table_name
MID()函数
从文本字段的所有值中提取字符。
# start 必需,规定开始位置(起始值是 1)
# length可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
SELECT MID(column_name,start,length) FROM table_name
# 例子:
SELECT MID(City,1,3) as SmallCity FROM Persons
LEN()函数
返回文本字段中所有值的长度。
SELECT LEN(column_name) FROM table_name
# 例子
SELECT LEN(City) as LengthOfCity FROM Persons
ROUND()函数
用于把数值字段舍入为指定的小数位数,为小数位。
SELECT ROUND(column_name,decimals) FROM table_name
Date()函数
MySQL:
函数描述
NOW()
返回当前日期和时间
()
返回当前的日期
()
返回当前的时间
DATE()
提取日期或日期/时间表达式的日期部分
()
返回日期/时间按的单独部分
()
给日期添加指定的时间间隔
()
从日期减去指定的时间间隔
()
返回两个日期之间的天数
()
用不同的格式显示日期/时间
SQL
函数描述
()
返回当前日期和时间
()
返回日期/时间的单独部分
()
在日期中添加或减去指定的时间间隔
()
返回两个日期之间的时间
()
用不同的格式显示日期/时间
数据类型:
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
SQL 使用下列数据类型在数据库中存储日期或日期/时间值:
()函数
设置格式
SELECT FORMAT(column_name,format) FROM table_name
# 例子
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate
FROM Products
(咦教程学完了,怎么没出现exit用法,奇怪哦,完了再补吧 2022.3.20,还有测验也过于理论基础了)
四、补 语法
属于相关子查询,不返回数据,当查询为空值时,返回“FALSE”,非空则返回“TRUE”。
因为 返回的是真值或假值,所以他所带的子查询一般直接用' *' ,因为给出列名也没多少意义。
子查询的条件依赖于外层父查询的查个属性值。比如:
select Sname
from Student
where exists (
select *
from SC
where Sno=Student.Sno and Cno ='1');
所说的依赖也就是这一句“ Sno=.Sno”,是外查询。查询过程不是一般的自下而上执行,依赖于外查询,执行的时候是先从父查询中取一个元组,然后根据条件 Sno=.Sno 处理内查询,得到结果再进行父查询中取第二个元组,如果反复。
可与NOT 连用,反意思反过来理解。
实习想法和整个学习进度都被辣鸡疫情耽误了……我来早上温习一下。(2022.7.17)
CASE WHEN 语法
(from :SQL之CASE WHEN用法详解)
根据when条件查找并用then定义输出结果
case
when sex = '1' then '男'
when sex = '2' then '女'
else '其他' end
!Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
– 比如说,下面这段sql永远无法得到“第二类”这个结果
case
when col_1 in ( 'a', 'b') then '第一类'
when col_1 in ('a') then '第二类'
else'其他' end
应用举例
#分数score,score<60返回不及格,score>=60返回及格,score>=80返回优秀
SELECT STUDENT_NAME,
(CASE WHEN score < 60 THEN '不及格'
WHEN score >= 60 AND score < 80 THEN '及格'
WHEN score >= 80 THEN '优秀'
ELSE '异常' END) AS Rank
FROM student
#现老师要统计班中,有多少男同学,多少女同学,并统计男同学中有几人及格,女同学中有几人及格,要求用一个SQL输出结果。
#表
SELECT
SUM (CASE WHEN STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_COUNT,
SUM (CASE WHEN STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_COUNT,
SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_PASS,
SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_PASS
FROM
THTF_STUDENTS