代码运行软件:SQL server 2019

0、数据库简介(了解)

数据库(Database,DB):按照数据结构来组织、存储和管理数据的仓库,其本身可看作电子化的文件柜,用户可以对文件中的数据进行增加、删除、修改、查找等操作。数据库基于某种目的以及规则进行管理的数据汇总。

SQL(Structured Query Language): 用于操作数据库的语言。

**数据库的分类:**分为层次型、网型、关系型。

层次型数据库:数据由一对多的亲子节点所连接,类似于数据结构中的树结构,是一种很古老的数据库形态,很难对信息进行击中管理。

网型数据库:数据以多对多的方式进行连接,类似与数据结构中的图结构,虽然可以集中管理数据,但是数据间的关系过于复杂,管理起来非常困难。

关系型数据库:数据通过行和列所构成的表进行管理。各个数据间保持独立、便于管理,并且表之前可以自由组合关联,因此,是现今最广泛应用的数据库类型。

数据库管理系统(Database Management System,DBMS):是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。主要具有数据的插入、更新、删除、排序、查询、共享(由多个软件共享数据)

0.1、关系数据库

关系数据库:通过行(row)和列(column)所构成的表形式来管理数据,即称为表(table)。关系数据库拥有表之间进行关联的运作机制。关系数据库是由名为**关系数据库管理系统(Relational Database Management System,简称RDBMS)**的软件进行管理。关系数据库具体代表有SQL server、Oracle、MySQL、PostgreSQL等。

主键(primary key):是指表中用于标识某一行的列。比如,在一张表中,我们可以对一个学号、职工号等对某人进行标识、区分,避免不同人的属性相同造成的混乱,无法区分。在一个表中只能设置唯一的一个主键。同时,给表设置主键后,能轻松的对表进行关联。

复合主键:有时只把一列设置为主键,无法区分,例如,地址的数据表中,只把区作为主键,会存在市、县等相同的情况,达不到区分,虽然主键在一张表格中只能设置一个,但是可以把多个列组合到一起作为主键使用,称这样的主键为复合主键

视图:在现有的表中提取需要的部分,抛弃原有的格式,作为虚拟的表进行展示的功能,就是视图

1、SQL基础

1.0、SQL功能分类

根据数据库语言的功能可分为:数据定义语言(DDL:Data Definition Language)、数据操作语言(DML:Data Manipulation Language)、数据控制语言(Data Control Language)。

1.1、数据库和表的创建

1.1.1、数据库创建

**数据库创建:**数据存储在表内,而表又保存在数据库中,故首先要创建数据库。创建数据库时使用的是CREATE DATABASE 语句。

代码运行软件:SQL server 2019

CREATE DATABASE 数据库名;  --SQL语句不区分大小写 
--SQL示例 创建COURSE数据库
CREATE DATABASE COURSE; 

1.1.2、选择数据库

选择数据库:RDBMS在连接之后会自动选择默认的数据库。因此想要在SQL server中使用新创建的数据库,需要通过USE来选择。

USE 数据库名; --如果不选择对应的数据库,就无法使用其中的值。

1.1.3、 表的创建

**创建表格:**创建表格时,使用CREATE TABLE语句。

--简单的表结构,其中的变量名就是表中的列名  
CREATE TABLE 表名(
    存储变量名1 变量类型1,
    存储变量名2 变量类型2.....
    存储变量名n 变量类型n
);
--SQL示例 创建course表
CREATE TABLE course(
	courseName VARCHAR(20),
	teacherName VARCHAR(10),
	studentPeople INT,
	teacherID  INT
);

1.2、表约束

1.2.1、约束

约束:是用来保证存入的数据能够一直保持正确状态的条件。创建表时,设置约束,可以对数据的输入进行控制。

约束分类:一种时设置在单列上的列级约束,另一种是同时作用于多个列的表级约束,而复合约束则是属于后者。

列级约束:写在数据类型之后,空格进行分隔。

表级约束:写在所有列的定义后。

--SQL示例  增加约束
CREATE TABLE course(
	courseName VARCHAR(20),
	teacherName VARCHAR(10),
	studentPeople INT UNIQUE,  --列级约束:对学生人数进行约定
	teacherID  INT,
    PRIMARY KEY (teacherName,teacherID)  --表级约束:对老师姓名,以及其职工号进行约束,定义复合主键
);

1.2.2、重要的约束种类

约束的主要几种:

约束功能
PRIMARY KEY (主键)禁止数据重复,禁止NULL值
UNIQUE数据具有唯一性
CHECK(表达式)预先准备表达式,禁止与之不符的数据
NOT NULL禁止NULL 值
DEFAULT = 值预先设置的值将会作为默认值

1.3、添加数据

添加数据:向表中添加数据时,使用INSERT 语句,需要添加数据的目的表则跟在INTO之后。

INSERT INTO 目的表名 (变量名1,变量名2,...,变量名n) VALUES (数据1,数据2,...,数据n);
USE COURSE; --连接COURSE数据库
INSERT INTO course(courseName,teacherName,studentPeople,teacherID) VALUES ('Java语言','TL2',64,981097);

1.4、查询

1.4.1 查询全部

**获取数据:**从表中获取已有的数据时,使用SELECT语句,从什么表中获得,可用FROM语句指定

SELECT * FROM 表名; --星号(*)表示提取全部列
--SQL获取全部数据
USE COURSE;--连接COURSE数据库
SELECT * FROM course;

1.4.2、查询指定的列

  1. 查询指定的一列
SELECT 列名 FROM 表名;
--查询courseName一列
USE COURSE;--连接COURSE数据库
SELECT courseName FROM course;
  1. 查询指定的多列
SELECT 列名1,列名2,..,列名n FROM 表名;
--查询courseName和teacherID
USE COURSE;--连接COURSE数据库
SELECT courseName,teacherID FROM course;

1.4.3、指定条件查询

**指定条件查询:**只提取特定条件的数据时,使用WHERE子句。

--以指定多列为例
SELECT 列名1,列名2,..,列名n FROM 表名 WHERE 表达式;
--查询学生人数大于64的课程
USE COURSE;--连接COURSE数据库
SELECT * FROM course WHERE studentPeople >64;

1.4.4、指定数量进行查询

SQL server的指定方法:

1.使用TOP子句可以指定从前往后提取行数。

--以指定多列为例
SELECT TOP(行数) PERCENT 列名1,列名2,..,列名n FROM 表名;
--查询前五行
USE COURSE;--连接COURSE数据库
SELECT TOP(5) * FROM course;
  1. 指定获取结果时,可以使用百分比代替行数。
--以指定多列为例
SELECT TOP(百分比) PERCENT 列名1,列名2,..,列名n FROM 表名;
--查询前20%
USE COURSE;--连接COURSE数据库
SELECT TOP(20) PERCENT * FROM course;

1.5、数据排序

  1. **ORDER BY 排序:**通过ORDER BY 子句能够以指定的列为基准对数据进行排序。
--以指定多列为例
SELECT 列名1,列名2,..,列名n FROM 表名 ORDER BY 列名 ASC;  --ASC表示降序排序,可以不写
SELECT 列名1,列名2,..,列名n FROM 表名 ORDER BY 列名 DESC;  --DESC表示升序排序
  1. 复杂排序:如果指定了多列作为基准,就能以更加详细的条件进行排序
--以指定多列为例
SELECT 列名1,列名2,..,列名n FROM 表名 ORDER BY 列名1,列名2,...,列名N;  --首先以列名1排序,如果列名1相同,再看列名2,-      															  --一直往下
  1. WHERE条件排序:WHERE子句和ORDER BY子句组合起来使用
--以指定多列为例
SELECT 列名1,列名2,..,列名n FROM 表名 WHERE 表达式 ORDER BY 列名 DESC;
--查询teacherName为TL2的数据,并降序排列
USE COURSE;--连接COURSE数据库
SELECT * FROM course WHERE teacherName= 'TL2' ORDER BY teacherID ASC;

1.6、对数据进行分组

对数据进行分组:使用GROUP BY 之后,指定的列中拥有相同的数据的行,将会分组合并到一行中。要与聚合函数一起使用。

SELECT 列名,聚合函数 FROM 表名 GROUP BY 列名;
--对teacherName进行分组
USE COURSE;--连接COURSE数据库
SELECT teacherName,COUNT(teacherName) FROM  course  GROUP BY teacherName; 

1.7、去除重复的数据

去除重复的数据:使用DISTINCT可以去除数据中重复的部分。

--以指定多列为例
SELECT DISTINCT 列名1,列名2,..,列名n FROM 表名;
--去除teacherName相同的部分,数据库里并没用去除,只是显示的时候去除显示
USE COURSE;--连接COURSE数据库
SELECT DISTINCT teacherName FROM course;

1.8、改变显示列名

改变显示列名:利用AS运算符可以把现有的列名变成其他名称,但生效的位置只是显示名称,并不会改变原来的列名。

SELECT 原有列名 AS 更改改后的列名 FROM 表名;

1.9、数据类型

1.9.1、整数型

整数类型表:处理整数

使用方法可处理的数据
INT整数
SMALLINT比INT范围更下的正数

1.9.2 实数型

实数型表:处理带有小数点的数值

使用方法可处理数据
DECIMAL(m,n)可以决定数值精度,其中m表示总位数,而n表示小数点以后的位数,m、n可以省略,如果省略,则小数部分四舍五入。
NUMERIC(m,n)可以决定数值精度,其中m表示总位数,而n表示小数点以后的位数,m、n可以省略,如果省略,则小数部分四舍五入。
REAL单精度浮点数
FLOAT(n)浮点数,如果n<24,则与REAL相同。
FLOAT(53)双精度浮点数

1.9.3、字符串型

字符串型:处理字符串

使用方法可处理数据
CHAR(n)长度固定的字符串(n字节内)
VARCHAR(n)长度可变的字符串(n字节内)
TEXT文本类的大量字符串
NCHAR(n)长度固定的UNICODE字符串(n字节内)
NVARCHAR(n)长度可变的UNICODE字符串(n字节内)
NTEXT文本类的大量UNICODE字符串

1.9.4、日期和时间类型

**日期和时间类型:**处理日期和时间

使用方法可处理数据
DATA日期(YYYY-MM-DD)
TIME时间(HH:MM:SS)
SMALLDATATIME自动更新的日期和时间(精确分钟)
DATATIME自动更新的日期和时间(精确毫秒)
DATATIME2自动更新的日期和时间(精确纳秒)

1.9.5、布尔型

布尔型:处理真假判断

使用方法可处理数据
BOOLEANTRUE(真)、FALSE(假)、UNKNOW(未知)其中之一

1.9.6、二进制型

**二进制型:**处理图像数据、声音数据等无法用文本或数值来表示的数据,由于本文以SQL server为基础编译的数据库,故有部分可能与SQL99有出入,但相差不大

使用方法可处理的数据
BIT/BINARY长度固定的bit列(上限为n bit)SQL server不能指定长度n
VARBINARY长度可变的bit列(上限为n bit)SQL server不能指定长度n
VARBINARY二进制数据

2、运算符

2.1、算术运算符

  1. 计算数值的运算符:
运算符和功能使用方法
+(加法)a+b
-(减法)a-b
*(乘法)a*b
/(除法)a/b
%(求余)a%b
  1. **使用方法:**使用算术运算符时,将数值和列名与运算符组合起来。可以利用()设置优先级。
--以乘法举例
列名 * 数值
列名 * 列名
--将学生人数加33并改变列名显示
USE COURSE;--连接COURSE数据库
SELECT courseName,(studentPeople + 33) AS  studentSUM FROM course;

2.2、比较运算符

比较运算符:在WHERE子句中加入值或数值之间进行比较的条件表达式,会改变语句的处理方式。条件成立时,表达式返回运算结果“true”,反之结果为“false”。

运算符使用方法含义
=a=ba等于b
<a<ba小于b
<=a<=ba小于等于b
>a>ba大于b
>=a>=ba大于等于b
<> 或者 !=a<>b 或者 a!=ba不等于b
--建立学生数据库,并进行运算符操作
--CREATE DATABASE STUDENT;

USE STUDENT;

--CREATE TABLE student(
--	id INT,
--	[name] VARCHAR(10),
--	ENGLISH INT,
--	MATH INT
--);

INSERT INTO student (id,[name],ENGLISH,MATH) VALUES (201212,'TL1',86,70);
INSERT INTO student (id,[name],ENGLISH,MATH) VALUES (202014,'TL2',90,90);
INSERT INTO student (id,[name],ENGLISH,MATH) VALUES (202014,'TL3',87,84);
INSERT INTO student (id,[name],ENGLISH,MATH) VALUES (202014,'TL4',86,86);
INSERT INTO student (id,[name],ENGLISH,MATH) VALUES (202014,'TL5',82,73);
INSERT INTO student (id,[name],ENGLISH,MATH) VALUES (202014,'TL6',79,86);
INSERT INTO student (id,[name],ENGLISH,MATH) VALUES (202014,'TL7',91,95);
--使用WHERE子句把条件为false的踢出,选出满足true的数据
USE STUDENT;--连接COURSE数据库
SELECT [NAME],MATH FROM student WHERE MATH >= 90; 

2.3、逻辑运算符

逻辑运算符:可以把多个条件组合起来,形成更加复杂的条件。

运算符使用方法含义
AND (与)(a>10)and (a<20)a大于10且a小于20
OR(或)(a=5) or (a=10)a等于5或10
NOT(非)not (a=20)a不等于20
--选出数学大于80且小于90时的数据
USE STUDENT;--连接COURSE数据库
SELECT [NAME],MATH FROM student WHERE (MATH < 90) AND (MATH > 80); 

2.4、字符处理运算符

2.4.1、字符串联运算符

字符串联运算符:把字符连接起来,SQL server 用+运算符。

列名 + 列名
--例如:
SELECT 列名1+列名2 FROM 表名;

2.4.2、字符串比较选取

字符串比较:想获取字符串中包含特定的字符串的数据时,需要使用LIKE 运算符。

设定方法

运算符功能使用方法含义
%相当与0~任意长度的文字列%T%包含T的任何字符串
_(下划线)相当于一个字符T_以T开头的两个字符的字符串
--选取出name中含T开头的数据
USE STUDENT;--连接COURSE数据库
SELECT *  FROM student WHERE [name] LIKE 'T%';  --其中name为进行比较的列名,T%表示以T开头的字符串

2.5、其他字符串

2.5.1、BETWEEN运算符

BETWEEN运算符:使用between~and可以指定范围,可用比较运算符替换

列名 BETWEEN  小范围数 AND 大范围数
--选出数学大于80且小于90时的数据
USE STUDENT;--连接COURSE数据库
SELECT [NAME],MATH FROM student WHERE MATH BETWEEN 80 AND 90; 

2.5.2、IS NULL运算符

IS NULL运算符:判断指定列的值是否为NULL。

列名 IS NULL        ....指定列的值为NULL,则为true,否则为false
列名 IS NOT NULL    ....指定列的值不为NULL,则为true,否则为false

2.5.3、IN运算符

**IN运算符:**使用IN运算符,仅会从特定的数据里面提取与()中某项值相同的数据,判断数据是否在IN后面的数据中。其中NOT IN 则表示指定值意外的数据,可用比较运算符替换

列名 IN (数据1,数据2,...,数据N)
列名 NOT IN (数据1,数据2,...,数据N)
--选出数学为80或90的数据
USE STUDENT;--连接COURSE数据库
SELECT [NAME],MATH FROM student WHERE MATH IN (80 , 90); 

更多推荐