sql 字段 SQL学习笔记

附上教程链接~ SQL 教程开搞!一、基础教程:基本定义分类数据操作语言 (DML) 和 数据定义语言 (DDL)。

附上教程链接~ 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()
);

表已经存在:

sql 字段 SQL学习笔记

# 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的值起始,并且以不同的递增规律增加
Identity2010# 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

应用举例

#分数scorescore<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
现在最火的发帖平台

创业在大学生创业 大学生创新创业

2024-4-13 1:12:38

现在最火的发帖平台

环保日记

2024-4-13 1:12:45

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索