SQL数据库基础(七)
这些都是存到内存中的数据,都是临时存储!!!
软件重开或者电脑重启数据就会丢失!!
问题:如果要永久保存数据,怎么办?
解决办法:用数据库保存!!
2、数据库:database,简称DB。用于存储数据一个仓库。
有哪些常见数据库软件:
SQL Server(微软)、MySQL、Oracel等。
数据库系统:简称DBS。指一个能支持数据库的完整的计算机系统,包含了硬件、操作系统、其它系统软件、数据库管理系统、数据库管理员等。
数据库管理系统:简称DBMS。指的是数据库软件。
比如SQL Server(微软)、MySQL、Oracel等。
数据库管理员:简称DBA。
3、登录SQL Server数据库:
1)登录前,要先开启数据库引擎服务:
a、第一种:
SQL Server配置管理器中找到服务--
SQL Server(MSSQLSERVER),右键启动
b、第二种:
win+r打开运行栏输入control,打开控制面板。
找到管理工具-->服务:
从服务列表中找到引擎服务,右键开启。(直接运行栏输入services.msc快速打开服务)
c、第三种:用DOS命令
运行栏输入cmd,打开dos界面:
net start mssqlserver(开启服务:mssqlserver是服务名)
net stop mssqlserver(停止服务)
2)登录:
a、服务器名称:
本地服务器:本机,服务器名称一般写:
计算机名、(local)、localhost、.
如果命名实例,还要在后面加上实例名:
eg: ./xiaoming (xiaoming是命名实例)
远程服务器:一般写对方计算机的IP地址
b、身份验证:windows身份验证和SQL Server身份验证。
windows身份验证:使用操作系统管理账号进行登录,不需要输入密码。
SQL Server身份验证:软件本身的验证方式。
登录名是sa (系统管理员)
要输入密码:安装时设置的密码!
如果忘记密码,怎么修改?
先用windows身份验证登录,
安全性-->登录名-->双击sa进去修改密码!
4、数据库类型有两类:
系统数据库:4个
master: 核心数据库,存储很多关于服务器配置、账号等数据。
model:模板数据库,提供定义数据库的一种模板。
msdb: 提供关于错误提示等信息。
tempdb:临时数据库,用于保存操作过程中一些临时数据。
用户自定义数据库:
数据库基本操作:创建数据库、重命名、删除、分离、附加
5、数据库的组成:
1)数据库本质是由文件组成;
2)常见的数据库文件有3种类型:
a、主数据文件: 文件扩展名是.mdf,最大的作用就是用于存储数据。每个数据库有且只有一个 主数据文件。 b、次数据文件:文件扩展名是.ndf,也是用于存储数据的。每个数据库可以0个以上的次数据文件。 c、日志文件:文件扩展名是.ldf,用于存储日志信息。每个数据库有1个以上的日志文件。
3)文件组(了解):相当于文件夹 (分类管理文件)用于分类管理数据库的2种数据文件(主要和次要)。
文件组分成两类: a、第一种:叫Primary,这是主文件组(系统提供) 主数据文件只能放主文件组。 b、第二种:用户自定义文件组。 次数据文件可以放主文件组或自定义文件组中。 注意:日志文件不适用文件组!
6、数据库代码操作:
1、
--SQL脚本语言:不区分大小写 /* 数据库管理的 代码操作! */ --1)、创建数据库:所有设置默认 create database StudentDB go --2)、切换数据库:在使用某个数据库前,要切换到它 use StudentDB go --3)、重命名数据库(了解) alter database StudentDB modify name=NFStudentDB --新名称 go --4)、删除数据库:没有在使用时才能删除 drop database NFStudentDB go --5)、分离数据库:移动数据库文件之前一定要分离 exec sp_detach_db StudentDB go --6)、附加数据库:把数据库文件重新加入服务器中 exec sp_attach_db StudentDB,'D:\StudentDB.mdf' go
2、
--创建数据库 create database PersonDB go --分离数据库 exec sp_detach_db PersonDB go --附加数据库 exec sp_attach_db PersonDB,'d:\mydb\PersonDB.mdf','d:\mydb\PersonDB_log.ldf' go --重命名数据库 alter database PersonDB modify name=MyPersonDB go --切换数据库 use MyPersonDB go --创建员工表 create table EmpInfo ( Eid int, --工号 Ename varchar(50), --姓名 Sex char(2), --性别 JoinTime datetime, --入职日期 WorkYears int, --工作年限 Postion varchar(50), --职位 BaseMoney money, --基本工资 Remark text --简介 ) go create table WorkInfo ( Wid int, --考勤编号 Eid int, --工号 WorkTime datetime,--上班打卡时间 OutTime datetime --下班打卡时间 ) go
7、类型
1、整型:int、bigint、smallint、tinyint(0-255)、bit(0和1) 2、浮点型:float/real、numeric(18,2)/decimal(18,2) 3、字符型:char(50)、varchar(50)、nchar(50)、nvarchar(50) 4、文本型:text、ntext 5、日期时间:datetime、date(只有日期)、smalldatetime 6、货币:money、smallmoney 7、图像:image(二进制) 8、二进制:binary(100)、varbinary(100)
1)创建了数据库后,就可以考虑往里面存储数据了。
2)数据库中把数据保存在数据表中,保存前,要创建数据表。
3)建表前,要考虑数据的类型。常见的数据类型有:
a、整型:
int、bigint、smallint、tinyint(0~255)、 bit(位,表示0或1,相当于false或true)
b、浮点型:
float、real、decimal(m,n)或numeric(m,n):一样的含义 eg: decimal(10,2):10是总位数,2是小数位数
c、字符型:
a、char(n): n表示最多能存储多少个字符,n范围1~8000.表示定长的字符数据。适用于长度固定的字符数据。 eg: char(10):最多存10个字符的数据。 存了'hello',5个字符,占了5个位置。 剩余的位置用空格补齐。事实上,真正存的是'hello '。 b、varchar(n):表示变长的字符数据。 eg: varchar(10):最多存10个字符的数据。 存了'hello',5个字符,占了5个位置。 剩余的位置不会用空格补齐。真正存的是'hello'。 c、nchar(n)、nvarchar(n):表示国际化,前面的n表示使用Unicode编码。
d、日期时间类型:
datetime:范围更大 smalldatetime:1900~2079范围小
e、货币类型:
存货币值,比如:¥100,$100 money:范围更大 smallmoney:范围小
e、文本类型:
存大量的文本数据。 text:文本 ntext:国际化
f、图像类型:
存储图片数据。(了解) image
g、二进制类型:
存二进制数据 binary(n):固定长度,n表示字节数 varbinary(n):可变长度 nbinary(n),nvarbinary(n):国际化
8、创建数据表:一种事物的数据用一张表存。
比如:学生、老师、班级数据用3张表。 表名: dbo.StudentInfo dbo:database owner 数据库所有者
9、约束
1)约束的概念
1、约束:对数据的限制条件,比如性别只能是男或女。 可以更好保证数据的可靠性和准确性。
2)约束大概有7类:
a、主键约束:(primary key)
目的要保证表中的每一条数据都是唯一的。 不会出现两条一模一样的数据。 (数据冗余:出现重复的数据!如果设置了主键,减少数据冗余。) 一般选择编号这样的列作为主键列(加主键约束)。 主键列的值不能出现重复值和空值(null)。
b、自增约束:(identity(初值,每次增加多少))
自动增长(标识列),由系统给出值,用户不能修改。 标识种子:初值 标识增量:每次增加多少 注意:只有整型的列才能设置自增。 一张表只能有1个自增列。
c、非空约束:(not null)
不允许有null值。
d、默认值约束:(default 值)
当某列有默认值,输入时没有填写数据,会自动取值为默认值。 datetime default getdate()--默认当前时间
e、唯一约束: (unique)
不允许出现重复值,允许出现一个null值。 比如身份证号是唯一的。
f、检查约束:(check(条件))
check(len(Code)=18)--长度必须18位 限制数据的取值范围。 比如:性别只能是男或女 check(列名='男' or 列名='女') check(列名 in('男','女')) 成绩在0到100之间 check(列名>=0 and 列名<=100) 写条件表达式需要用到运算符: 1、关系运算符: >、>=、<、<=、=(等于)、!=(不等于)、<>(不等于) 2、逻辑运算符: and:与,多条件同时成立 or:或,多条件只要满足一个 not:非
g、外键约束:(foreign key references 表名(列名))
外键:指的是某个列在一张表中是主键,在另一张表不是主键列,那叫外键。 外键:体现表与表之间的关系。 外键的数据只能来源于主键表出现过的数据; 外键允许null值。
10、创建 数据库 数据表
1、
--创建数据库SchoolDB create database SchoolDB go --切换到SchoolDB use SchoolDB go --创建学生信息表StudentInfo create table StudentInfo ( --列名 数据类型 [约束] StuId int, --学号:整型 StuName varchar(50), -- 姓名:字符型,变长 Gender char(2), --性别:字符型,定长 Birthday datetime, --生日 Phone char(11), --手机号 [Address] varchar(100) --家庭住址 ) go
2、
--创建数据库并切换 create database BookDB go use BookDB go --建表:图书类型表 create table TypeInfo ( TypeId int primary key, --主键:primary key,值不能重复、不允许空值 TypeName varchar(50) unique not null --唯一:unique,值不能重复,允许出现一个空值 ) go --图书信息表 create table BookInfo ( BookID int primary key identity(1000,1), --identity(1000,1):从1000开始自增,每次增加1 BookName varchar(50) not null, --非空:not null Author varchar(50) null, --允许空:可以不写,或者写null Price money check(Price>=0), --检查约束:check(条件) Pub varchar(50) default '南方IT', --默认值:default 值 Remark varchar(max) null, TypeId int foreign key references TypeInfo(TypeId) --类型编号:外键(值允许重复,允许空, 如果要写值,那么就要填对应主键表中出 现过的值) ) go
11、数据的功能
1)添加
[ɪnˈsɜːt ] 1、用insert 语句来实现添加 基本语法:insert [into] 表名[(列名1,列名2,....)] values(值1,值2,....) go 2、增加数据: 1)insert into ...values语句 into 可以省略,默认给所有列添加数据 自增列不能给数据 default表示使用默认值 getdate()默认当前时间 null表示空值 一次性添加多条数据 如果要指定列:自增列不能写,非空列一定要写!! 用insert 语句来实现添加 基本语法:insert [into] 表名[(列名1,列名2,....)] values(值1,值2,....) go --默认给所有列添加数据 insert into StudentInfo values(1,'tom',18), (2,'jack',10) go --一次性添加多条数据 insert into TypeInfo values(2,'科幻'), (3,'玄幻'), (4,'言情') go --如果要指定列:自增列不能写,非空列一定要写!! insert into BookInfo(BookName) values('小林传奇') go insert into BookInfo(BookName,Author,Price) values('小莫总裁','小秦',100) go 3、insert into ...select语句实现添加 union连接下一条数据 default关键字不能使用 insert into TypeInfo select 5,'历史' union --union连接下一条数据 select 6,'悬疑' union select 7,'计算机' go insert into StudentInfo select 1,'tom',18 union select 2,'jack',10 go [sɪˈlekt] 在insert...select中,default关键字不能使用 insert into BookInfo select '计算机基础','张三',9.9,'清华大学',2008,null,1 go
2)备份
可以用insert..select语句实现数据备份: --从一张表查询数据出来放入另一张表备份起来 --先创建备份表: create table TypeInfo_bak --图书类型的备份表 ( TypeId int primary key, TypeName varchar(50) unique not null ) go --把图书类型表TypeInfo数据备份到TypeInfo_bak中 insert into TypeInfo_bak select * from TypeInfo go select....into语句:实现备份 --把所有图书查询出来,备份到新表BookInfo_bak中 select * into BookInfo_bak --备份表(自动创建出来) from BookInfo
3)修改
1、修改数据 基本语法:update 表名 set 列名1=值1,列名2=值2,.... [where 条件] go 加where语句,定位到具体的行 不加where,整列值都改成一样的了 同时修改多列:自增列不允许修改 修改后的数据也要满足约束 --加where语句,定位到具体的行 --把类型编号为1的类型名称改成编程 update TypeInfo set TypeName='编程' where TypeId=1 go update studentInfo set name='小明',age=30 where sid=1 go --不加where,整列值都改成一样的了 update BookInfo set Author='李四',Price=10 go --同时修改多列:自增列不允许修改 --修改后的数据也要满足约束 update TypeInfo set TypeID=10,TypeName='COMPUTER' where TypeID=7 go update BookInfo set BookName='SQL SERVER',Author='王 五',Price*=1.2,Pub='NF' where BookID=1005 go --修改主键表主键列的值: --如果外键有引用的时候,不能直接修改 --怎么办?先把外键引用的地方修改成null(去除引用) --再去修改主键表主键列的值 --第一步:先把外键引用设置成null update BookInfo set TypeId=null --外键设置成null where TypeId=1 go --第二步:再把主键表主键进行修改 update TypeInfo set TypeId=8 where TypeId=1 go
4)删除
[dɪˈliːt] 1、删除数据:delete [from] 表名 [where 条件] go 不加条件,删除所有数据(from 可以省略) 删除某些数据 delete from studentInfo where sid=1 go --不加条件,删除所有数据(from 可以省略) delete from BookInfo go --删除某些数据 delete from BookInfo where BookId=1008 go --删除所有数据(清空表) [trʌŋˈkeɪt][ˈteɪbl] truncate table 表名 go truncate table TypeInfo_bak go --删除表:先删外键表,再删主键表 drop table BookInfo go drop table TypeInfo go --要删除主键被引用的数据? --先把外键修改成NULL update BookInfo set TypeId=null where TypeID=10 go delete from TypeInfo where typeId=10 go
5)查询
一、SQL:结构化查询语言,分成4类 1)数据操纵语言:DML 包含insert、update、delete、select 2)数据定义语言:DDL 包含create、alter、drop、truncate create database alter database xxx... drop database ... create table alter table drop table ... truncate table xxx 清空表 3) 数据控制语言:DCL 包含grant、revoke(权限的赋予和移除) 4)事务控制语言:TCL 包含commit、rollback 二、SQL的应用方式: 交互式SQL:现在在服务器用SQL完成各种操作 嵌入式SQL:嵌入计算机编程语言中使用 1、单表查询数据: 查询语句的语法: select 列名 from 表名 [where 条件表达式] --数据筛选 [ɡruːp] [group by 分组依据] --分组查询 [having 条件表达式] --分组后的筛选 [order by 排序依据] --排序(放最后) 在where子句中,写条件常用到的运算符: 1)关系运算符: >、>=、<、<=、=(等于)、!=或<>(不等于) 2)逻辑运算符: and:与 or:或 not:非,常用的有: not null(非空) not between ... and...: 不在两者之间 not in(...):不匹配里面出现的值 not like:不像...一样 3)特殊的匹配运算符: between...and...:两者之间 in(值1,值2,....):匹配()中任意一个值即可 比如:检查约束 check(sex in ('男','女')) like:像...一样,用于模糊查询。 比如:要找出姓李的所有同学 包含一个“小”字的同学 要配合通配符使用: 1)%:匹配任意个字符: eg: %a%:可以匹配a,xay,ab,abcd,xxxxayyyy 2)_:匹配一个字符 eg: a_:可以匹配:ab、ac、a1 不可以匹配:abc,a1234234 3)[]: 匹配[]出现的任意一个字符 eg: a[xyz]可以匹配:ax,ay,az 其它的都不能匹配 aa a[A-Za-z]:第二个位置可以出现大小写字母 a[^xyz]:除了xyz以外都匹配 2、查询语句 --1)查询全部列的数据,*代表所有列 select * from ClassInfo --2)查询指定列的数据,写出列名 select Cid,Grade from ClassInfo --3) 给列指定别名 select Cid as 班级编号,Grade as 年级 -- as取别名,as可以省略 from ClassInfo select 班级编号=Cid,年级=Grade -- = 取别名,别名在前 from ClassInfo --4)查询前n条数据:top n/top n percent select top 2 * from ClassInfo --前2条数据 [pəˈsɛnt] select top 50 percent * from ClassInfo --前50%的数 据 [dɪˈstɪŋkt] --5)去掉重复项:distinct select distinct Gender from StudentInfo --where子句:在查询中,用于数据的筛选 select * from StudentInfo --where Sid=1 --等于 --where Sid!=1 --不等于 --where Sid<>1 --不等于 --where Sid>=2 and Sid<=5 --and:并且 --where Sid between 2 and 5 --学号在2到5之间,跟Sid>=2 and Sid<=5 一样 --where Sid=1 or Sid=3 --or:或者 --where Sid in(1,3) --学号匹配1或3都可以,跟Sid=1 or Sid=3 --where Phone is null --空与非空不能用=,要用is --where Phone is not null go 3、 --模糊查询 select * from StudentInfo --where Sname like '张%' --找出所有姓张的,以张开头 --where Sname like '%三%' --包含三的学生 --where Sname not like '%三%' --不包含三的 --where Address like '%斗门' --以斗门结尾 --where Sname like '张_' --下划线匹配单个字符 go
6)排序
--排序 select * from StudentInfo --order by Sname --默认升序 --order by Sname asc --asc表示升序 --order by Sname desc --desc表示降序 order by Gender desc,Sid asc --按多列排序,先按性别,再按学号 go
7)聚合函数
1、--聚合函数: [sʌm] select sum(Age) 年龄和 from StudentInfo select avg(Age) 年龄平均 from StudentInfo [mæks] select max(Age) 最大年龄 from StudentInfo select min(Age) 最小年龄 from StudentInfo [kaʊnt] select count(*) 学生人数 from StudentInfo 2、 SQL中常见的聚合函数:用于统计的函数 sum():求和 avg():平均值 max():最大值 min():最小值 count():计数
8)统计
--分组查询:group by子句,分组经常要配合聚合函数一起使用 --按照性别分组,统计男生、女生的人数 select Gender 性别,COUNT(*) 人数 from StudentInfo group by Gender --按照性别分组 go --分组时,select后只能跟两种列: --1)group by后出现的列(用于分组的列) --2)聚合函数列 (用于统计的列) --按照班级分组,统计每个班有多少人 select Cid 班级编号,COUNT(*) 人数 from StudentInfo group by Cid go --分组之后的筛选:having select Cid 班级编号,COUNT(*) 人数 from StudentInfo group by Cid --having Cid is not null --一定要用在group by后 having COUNT(*)>1 go --全部子句用上的案例: select Address 地区,COUNT(*) 人数 from StudentInfo where Sid>1 group by Address having COUNT(*)>=1 order by 人数 desc --排序可以使用别名 go
9)基本连接查询
--基本连接查询:返回两张表匹配的数据 select Sid,Sname,B.Cid,Grade,Term --所需要的列 from ClassInfo A,StudentInfo B --给表取别名 where A.Cid=B.Cid --连接条件:主外键的值相等 go
10)内连接
--内连接:返回两张表匹配的数据 --关键字:inner join ... on select Sid,Sname,B.Cid,Grade,Term from StudentInfo A inner join ClassInfo B --给表取别名 on A.Cid=B.Cid --连接条件:主外键的值相等 go
11)外连接
--外连接: --左外连接:返回两张表匹配的数据, --还可以返回左表有,右表没有的数据(不匹配的数据, 会在右表的列用NULL替代) -- 关键字:left [outer] join ...on:outer可以省略 select A.*,B.* from StudentInfo A --学生表是左表 left join ClassInfo B --班级表是右表 on A.Cid=B.Cid --where A.Cid is null --可以查询哪些学生没有被分配班级 go select * from ClassInfo A --班级表是左表 left join StudentInfo B --学生表是右表 on A.Cid=B.Cid --where Sid is null --找出哪些班级没有学生 go --右外连接:返回两张表匹配的数据, --还可以返回右表有,左表没有的数据(不匹配的数据, 会在左表的列用NULL替代) select * from StudentInfo A --学生表是左表 right join ClassInfo B --班级表是右表 on A.Cid=B.Cid go --左外和右外下面写法是等价的 --select * from A left join B on .... --select * from B right join A on .... --全外连接:完整外连接 --全外=左外+右外 select * from StudentInfo A left join ClassInfo B on A.Cid=B.Cid go select * from StudentInfo A [dʒɔɪn] right join ClassInfo B on A.Cid=B.Cid go select * from StudentInfo A [fʊl][dʒɔɪn] full join ClassInfo B on A.Cid=B.Cid go
12、数据综合
1)增加、修改、删除、查询、单表查询、聚合函数
1、增加数据: 1)insert into ...values语句 insert into StudentInfo values(1,'tom',18), (2,'jack',10) go 2)insert into ...select语句 insert into StudentInfo select 1,'tom',18 union select 2,'jack',10 go 3)select into 语句:生成一张表实现备份 select * into student_BAK from studentInfo 2、修改数据: update 表名 set 列1=值1,列2=值2,.... where 条件 go update studentInfo set name='小明',age=30 where sid=1 go 3、删除数据: delete from 表名 where 条件 go delete from studentInfo where sid=1 go 第四章 查询 1、SQL:结构化查询语言,分成4类 1)数据操纵语言:DML 包含insert、update、delete、select 2)数据定义语言:DDL 包含create、alter、drop、truncate create database alter database xxx... drop database ... create table alter table drop table ... truncate table xxx 清空表 3) 数据控制语言:DCL 包含grant、revoke(权限的赋予和移除) 4)事务控制语言:TCL 包含commit、rollback 2、SQL的应用方式: 交互式SQL:现在在服务器用SQL完成各种操作 嵌入式SQL:嵌入计算机编程语言中使用 3、单表查询数据: 查询语句的语法: select 列名 from 表名 [where 条件表达式] --数据筛选 [group by 分组依据] --分组查询 [having 条件表达式] --分组后的筛选 [order by 排序依据] --排序(放最后) 在where子句中,写条件常用到的运算符: 1)关系运算符: >、>=、<、<=、=(等于)、!=或<>(不等于) 2)逻辑运算符: and:与 or:或 not:非,常用的有: not null(非空) not between ... and...: 不在两者之间 not in(...):不匹配里面出现的值 not like:不像...一样 3)特殊的匹配运算符: between...and...:两者之间 in(值1,值2,....):匹配()中任意一个值即可 比如:检查约束 check(sex in ('男','女')) like:像...一样,用于模糊查询。 比如:要找出姓李的所有同学 包含一个“小”字的同学 要配合通配符使用: 1)%:匹配任意个字符: eg: %a%:可以匹配a,xay,ab,abcd,xxxxayyyy 2)_:匹配一个字符 eg: a_:可以匹配:ab、ac、a1 不可以匹配:abc,a1234234 3)[]: 匹配[]出现的任意一个字符 eg: a[xyz]可以匹配:ax,ay,az 其它的都不能匹配 aa a[A-Za-z]:第二个位置可以出现大小写字母 a[^xyz]:除了xyz以外都匹配 4、SQL中常见的聚合函数:用于统计的函数 sum():求和 avg():平均值 max():最大值 min():最小值 count():计数
2)删除、添加、备份、查询、修改、删除、查询
--创建数据库并切换 create database BookDB go use BookDB go --建表:图书类型表 create table TypeInfo ( TypeId int primary key, --主键:primary key,值不能重复、不允许空值 TypeName varchar(50) unique not null --唯一: unique,值不能重复,允许出现一个空值 ) go --图书信息表 create table BookInfo ( BookID int primary key identity(1000,1), --identity(1000,1):从1000开始自增,每次增加1 BookName varchar(50) not null, --非空:not null Author varchar(50) null, --允许空:可以不写,或者写null Price money check(Price>=0), --检查约束:check(条件) Pub varchar(50) default '南方IT', --默认值:default 值 PubYear int, Remark varchar(max) null, TypeId int foreign key references TypeInfo(TypeId) --类型编号:外键(值允许重复,允许空, 如果要写值,那么就要填对应主键表中出 现过的值) ) go --删除表:先删外键表,再删主键表 drop table BookInfo go drop table TypeInfo go ---数据操作:添加、修改和删除 --添加数据: --1)用insert 语句来实现添加 -- 基本语法:insert [into] 表名[(列名1,列名2,....)] -- values(值1,值2,....) go --into 可以省略,默认给所有列添加数据 insert into TypeInfo values(1,'软件开发') go --一次性添加多条数据 insert into TypeInfo values(2,'科幻'), (3,'玄幻'), (4,'言情') go --自增列不能给数据 --default表示使用默认值 --null表示空值 insert into BookInfo values('计算机基础','张三',9.9,default,2008,null,1) go insert into BookInfo values('SQL','张三',19.9,'清华大学出版社',2021,'这是一本好书',1), ('CS架构','张三',39.9,'清华大学出版社',2020,'张三威武',2) go --如果要指定列:自增列不能写,非空列一定要写!! insert into BookInfo(BookName) values('小林传奇') go insert into BookInfo(BookName,Author,Price) values('小莫总裁','小秦',100) go --2、insert...select 语句实现添加 insert into TypeInfo select 5,'历史' union --union连接下一条数据 select 6,'悬疑' union select 7,'计算机' go --在insert...select中,default关键字不能使用 insert into BookInfo select '计算机基础','张三',9.9,'清华大学',2008,null,1 go --可以用insert..select语句实现数据备份: --从一张表查询数据出来放入另一张表备份起来 --先创建备份表: create table TypeInfo_bak --图书类型的备份表 ( TypeId int primary key, TypeName varchar(50) unique not null ) go --把图书类型表TypeInfo数据备份到TypeInfo_bak中 insert into TypeInfo_bak select * from TypeInfo go --3)select....into语句:实现备份 --把所有图书查询出来,备份到新表BookInfo_bak中 select * into BookInfo_bak --备份表(自动创建出来) from BookInfo --查询所有数据 select * from TypeInfo select * from BookInfo select * from TypeInfo_bak --2、修改数据 --基本语法:update 表名 -- set 列名1=值1,列名2=值2,.... -- [where 条件] go --不加where,整列值都改成一样的了 update BookInfo set Author='李四',Price=10 go --加where语句,定位到具体的行 --把类型编号为1的类型名称改成编程 update TypeInfo set TypeName='编程' where TypeId=1 go --同时修改多列:自增列不允许修改 --修改后的数据也要满足约束 update TypeInfo set TypeID=10,TypeName='COMPUTER' where TypeID=7 go update BookInfo set BookName='SQL SERVER',Author='王五',Price*=1.2,Pub='NF' where BookID=1005 go --编号1000或1003的图书涨价20% update BookInfo set Price*=1.2 where BookID=1000 or BookID=1003 go --写条件时,常以主键列作为条件,但也可以用其它列 update BookInfo set Price*=1.2 where BookName='SQL' --书名作为条件 go --修改主键表主键列的值: --如果外键有引用的时候,不能直接修改 --怎么办?先把外键引用的地方修改成null(去除引用) --再去修改主键表主键列的值 --第一步:先把外键引用设置成null update BookInfo set TypeId=null --外键设置成null where TypeId=1 go --第二步:再把主键表主键进行修改 update TypeInfo set TypeId=8 where TypeId=1 go --3、删除数据:delete [from] 表名 [where 条件] go --不加条件,删除所有数据(from 可以省略) delete from BookInfo go --删除某些数据 delete from BookInfo where BookId=1008 go --要删除主键被引用的数据? --先把外键修改成NULL update BookInfo set TypeId=null where TypeID=10 go delete from TypeInfo where typeId=10 go --清空表:truncate table 表名 go --删除所有数据 truncate table TypeInfo_bak go --查询 select * from TypeInfo select * from BookInfo
3)修改、删除、查询、模糊查询、排序、聚合函数、分组查询
/* 小学生的成绩管理数据库: 班级表:班级编号PK、所在年级、学期 学生表:学号PK、姓名、性别、联系电话、住址、班级编号FK 课程表:课程编号PK、课程名称、备注 成绩表:成绩编号PK、学号FK、课程编号FK、考试成绩、考试时间 */ create database ScoreDB --创建数据库 go use ScoreDB --切换数据库 go --班级表 create table ClassInfo ( Cid int primary key, --班级编号:主键 Grade varchar(50) not null, --年级 Term varchar(50) not null --学期 ) go insert into ClassInfo values(2101,'一年级','上'), (2102,'一年级','上'), (2103,'一年级','上') go --学生表 create table StudentInfo ( [Sid] int identity(1,1) primary key, --学号:主键、自增 Sname varchar(50) not null, --姓名:非空 Gender char(2) default '男' check(Gender='男' or Gender='女'), --性别:默认、检查 Age int, --年龄 --SchoolTime datetime default getdate(), --默认当前时间 Phone varchar(50), --联系电话 [Address] varchar(500), --地址 Cid int foreign key references ClassInfo(Cid) --班级编号:外键 ) go insert into StudentInfo values('张三疯','男',10,null,'珠海斗门',null), ('李四','男',20,'1568798961','珠海斗门',2101), ('王五','女',30,'1000','广州',2101), ('赵六','男',15,null,'深圳',2102), ('小黄','女',18,null,'珠海香洲',2102) go --修改数据 update ClassInfo set Grade='二年级',Term='下' where Cid=2102 go --如果修改主键,且有被外键引用 --那么先把外键改成null,再修改主键 update StudentInfo set Cid=null where Cid=2101 go update ClassInfo set Cid=2201 where Cid=2101 go --删除数据 delete from StudentInfo where Sid=5 go --查询 select * from ClassInfo select * from StudentInfo --查询语句 --1)查询全部列的数据,*代表所有列 select * from ClassInfo --2)查询指定列的数据,写出列名 select Cid,Grade from ClassInfo --3) 给列指定别名 select Cid as 班级编号,Grade as 年级 -- as取别名,as可以省略 from ClassInfo select 班级编号=Cid,年级=Grade -- =取别名,别名在前 from ClassInfo --4)查询前n条数据:top n/top n percent select top 2 * from ClassInfo --前2条数据 select top 50 percent * from ClassInfo --前50%的数据 --5)去掉重复项:distinct select distinct Gender from StudentInfo --where子句:在查询中,用于数据的筛选 select * from StudentInfo --where Sid=1 --等于 --where Sid!=1 --不等于 --where Sid<>1 --不等于 --where Sid>=2 and Sid<=5 --and:并且 --where Sid between 2 and 5 --学号在2到5之间,跟Sid>=2 and Sid<=5 一样 --where Sid=1 or Sid=3 --or:或者 --where Sid in(1,3) --学号匹配1或3都可以,跟Sid=1 or Sid=3 --where Phone is null --空与非空不能用=,要用is --where Phone is not null go --模糊查询 select * from StudentInfo --where Sname like '张%' --找出所有姓张的,以张开头 --where Sname like '%三%' --包含三的学生 --where Sname not like '%三%' --不包含三的 --where Address like '%斗门' --以斗门结尾 --where Sname like '张_' --下划线匹配单个字符 go --排序 select * from StudentInfo --order by Sname --默认升序 --order by Sname asc --asc表示升序 --order by Sname desc --desc表示降序 order by Gender desc,Sid asc --按多列排序,先按性别,再按学号 go ---聚合函数: select sum(Age) 年龄和 from StudentInfo select avg(Age) 年龄平均 from StudentInfo select max(Age) 最大年龄 from StudentInfo select min(Age) 最小年龄 from StudentInfo select count(*) 学生人数 from StudentInfo --分组查询:group by子句,分组经常要配合聚合函数一起使用 --按照性别分组,统计男生、女生的人数 select Gender 性别,COUNT(*) 人数 from StudentInfo group by Gender --按照性别分组 go --分组时,select后只能跟两种列: --1)group by后出现的列(用于分组的列) --2)聚合函数列 (用于统计的列) --按照班级分组,统计每个班有多少人 select Cid 班级编号,COUNT(*) 人数 from StudentInfo group by Cid go --分组之后的筛选:having select Cid 班级编号,COUNT(*) 人数 from StudentInfo group by Cid --having Cid is not null --一定要用在group by后 having COUNT(*)>1 go --全部子句用上的案例: select Address 地区,COUNT(*) 人数 from StudentInfo where Sid>1 group by Address having COUNT(*)>=1 order by 人数 desc --排序可以使用别名 go
4)添加、查询
--创建数据库NewsDB create database NewsDB go --切换 use NewsDB go --创建管理新闻类型表NewsInof create table NewsType ( TypeId int primary key identity(1,1),--类型编号:主键、自增 TypeName varchar(50)unique not null --类型名称:唯一、非空 ) go --创建新闻信息表News create table News ( Nid int primary key, --新闻编号:主键 Title varchar(50) not null, --新闻标题:非空 Author varchar(50), --作者 PubTime datetime default getdate(), --发布时间:默认当前时间 Content text, --新闻内容:文本型 Ncount int check(Ncount>0), --新闻字数: 整型,字数必须大于0 TypeId int foreign key references NewsType(TypeId)--所属新闻类型:外键 ) go --给每张表添加5条以上测试数据 --1)添加NewsType表 insert into NewsType select '电竞'union select '中国是'union select '电影'union select '股票'union select '国务' go select*from NewsType --添加News表 insert into News values(1001,'王者荣耀','张三',default,null,1520,1), (1002,'《长津湖》','吴京',2020,'方法广东夫妇',4653,3), (1003,'XXX绯闻','李四',2021,'高富帅',5456,2), (1004,'发货','张三',2021,'新时代',34423,5), (1005,'中国','王五',2019,null,1999,3) go select*from News --1)查询所有新闻类型,分别用as和=给列取中文别名; select TypeId 类型编号,TypeName 类型名称 from NewsType go select 类型编号=TypeId ,类型名称=TypeName from NewsType go -- 2)查询前2条新闻类型的数据,查询前20%新闻类型的数据 select top 2 * from NewsType go select top 20 percent * from NewsType go --3)查询作者"张三"发布的所有新闻 select * from News where Author='张三' go --4)查询新闻字数在5000到10000字之间的新闻信息:分别用and或between...and实现 select * from News where Ncount>=5000 and Ncount<=10000 go select * from News where Ncount between 5000 and 10000 go --5)查询新闻类型分别是1,3,5的新闻信息:分别用or或in()实现 select * from News where typeId=1 or typeId=3 or typeId=5 go select * from News where typeId in(1,3,5) go -- 6)查询新闻标题包含"中国"的新闻信息 select * from News where Title like '%中国%' go --7)查询新闻内容包含"新时代"的新闻信息 select * from News where Content like '%新时代%' go --8)查询所有新闻信息,按照新闻字数降序排序 select * from News order by Ncount desc --asc升序,desc降序 go -- 9)查询所有新闻中,最多字数、最少字数、平均字数、字数之和分别是多少。 select SUM(Ncount) 字数和,AVG(Ncount) 平均字数,MAX(Ncount) 最多字数,MIN(Ncount) 最少字数 from News go --10)查询总共有多少条新闻信息 select COUNT(*) 新闻数量 from News go --11)查询作者"张三"发布了多少条新闻信息 select COUNT(*) 新闻数量 from News where Author='张三' go --12)按照作者分组,统计每个作者发布的新闻数量 select Author 作者,COUNT(*) 数量 from News group by Author --having COUNT(*)>1 --分组后的筛选 go --13)按照新闻类型分组,统计每种类型新闻的平均字数 select TypeId 类型,AVG(Ncount) 平均字数 from News group by TypeID go
5)基本连接查询、内连接、外连接(左外连接、右外连接、全外连接)
--切换 use ScoreDB go select * from ClassInfo select * from StudentInfo --基本连接查询:返回两张表匹配的数据 select Sid,Sname,B.Cid,Grade,Term --所需要的列 from ClassInfo A,StudentInfo B --给表取别名 where A.Cid=B.Cid --连接条件:主外键的值相等 go --内连接:返回两张表匹配的数据 --关键字:inner join ... on select Sid,Sname,B.Cid,Grade,Term from StudentInfo A inner join ClassInfo B --给表取别名 on A.Cid=B.Cid --连接条件:主外键的值相等 go --外连接: --左外连接:返回两张表匹配的数据, --还可以返回左表有,右表没有的数据(不匹配的数据, 会在右表的列用NULL替代) -- 关键字:left [outer] join ...on:outer可以省略 select A.*,B.* from StudentInfo A --学生表是左表 left join ClassInfo B --班级表是右表 on A.Cid=B.Cid --where A.Cid is null --可以查询哪些学生没有被分配班级 go select * from ClassInfo A --班级表是左表 left join StudentInfo B --学生表是右表 on A.Cid=B.Cid --where Sid is null --找出哪些班级没有学生 go --右外连接:返回两张表匹配的数据, --还可以返回右表有,左表没有的数据(不匹配的数据, 会在左表的列用NULL替代) select * from StudentInfo A --学生表是左表 right join ClassInfo B --班级表是右表 on A.Cid=B.Cid go --左外和右外下面写法是等价的 --select * from A left join B on .... --select * from B right join A on .... --全外连接:完整外连接 --全外=左外+右外 select * from StudentInfo A left join ClassInfo B on A.Cid=B.Cid go select * from StudentInfo A right join ClassInfo B on A.Cid=B.Cid go select * from StudentInfo A full join ClassInfo B on A.Cid=B.Cid go
===================================================================
6、数据库代码操作:
--SQL脚本语言:不区分大小写
/*
数据库管理的
代码操作!
*/
--1)、创建数据库:所有设置默认
[kriˈeɪt]
create database StudentDB
go
--2)、切换数据库:在使用某个数据库前,要切换到它
use StudentDB
go
--3)、重命名数据库(了解)
[ˈɔːltə(r)]
alter database StudentDB
[ˈmɒdɪfaɪ]
modify name=NFStudentDB --新名称
go
--4)、删除数据库:没有在使用时才能删除
[drɒp]
drop database NFStudentDB
go
--5)、分离数据库:移动数据库文件之前一定要分离
[ɪɡˈzek][dɪˈtætʃ]
exec sp_detach_db StudentDB
go
--6)、附加数据库:把数据库文件重新加入服务器中
[ɪɡˈzek][əˈtætʃ]
exec sp_attach_db StudentDB,'D:\StudentDB.mdf'
go
类型
1、整型:int、bigint、smallint、tinyint(0-255)、bit(0和1)
2、浮点型:float/real、numeric(18,2)/decimal(18,2)
3、字符型:char(50)、varchar(50)、nchar(50)、nvarchar(50)
4、文本型:text、ntext
5、日期时间:datetime、date(只有日期)、smalldatetime
6、货币:money、smallmoney
7、图像:image(二进制)
8、二进制:binary(100)、varbinary(100)
1、创建了数据库后,就可以考虑往里面存储数据了。
2、数据库中把数据保存在数据表中,保存前,要创建数据表。
3、建表前,要考虑数据的类型。常见的数据类型有:
[bɪɡ] [smɔːl] [ˈtaɪni]
1)整型:int、bigint、smallint、tinyint(0~255)、
[bɪt] [fɔːls]
bit(位,表示0或1,相当于false或true)
[fləʊt] [ˈriːəl]
2)浮点型: float、real
[ˈdesɪml] [nju(ː)ˈmɛrɪk]
decimal(m,n)或numeric(m,n):一样的含义
eg:
decimal(10,2):10是总位数,2是小数位数
3)字符型:
[tʃɑː(r)]
a、char(n): n表示最多能存储多少个字符,
n范围1~8000.表示定长的字符数据。适用于长度固定的字 符数据。
eg:
char(10):最多存10个字符的数据。
存了'hello',5个字符,占了5个位置。
剩余的位置用空格补齐。事实上,真正存的是'hello '。
[var]
b、varchar(n):表示变长的字符数据。
eg:
varchar(10):最多存10个字符的数据。
存了'hello',5个字符,占了5个位置。
剩余的位置不会用空格补齐。真正存的是'hello'。
c、nchar(n)、nvarchar(n):表示国际化,前面的n表示使
[kəʊd]
用 Unicode编码。
4)日期时间类型:
[deɪt]
datetime:范围更大
smalldatetime:1900~2079范围小
5)货币类型:存货币值,比如:¥100,$100
money:范围更大
smallmoney:范围小
6)文本类型: 存大量的文本数据。
text:文本
ntext:国际化
7)图像类型:存储图片数据。(了解)
image
8)二进制类型:存二进制数据
[ˈbaɪnəri]
binary(n):固定长度,n表示字节数
[var]
varbinary(n):可变长度
nbinary(n),nvarbinary(n):国际化
4、创建数据表:一种事物的数据用一张表存。
比如:学生、老师、班级数据用3张表。
表名: dbo.StudentInfo
[ˈəʊnə(r)]
dbo:database owner 数据库所有者
约束
[ˈpraɪməri][kiː]
1)主键约束(primary key):目的要保证表中的每一条数据都是唯一的。
不会出现两条一模一样的数据。
(数据冗余:出现重复的数据!如果设置了主键,减少数据冗余。)
一般选择编号这样的列作为主键列(加主键约束)。
主键列的值不能出现重复值和空值(null)。
[aɪˈdentəti]
2)自增(identity(初值,每次增加多少)):自动增长(标识列),由系统给出值,用户不能修改。
标识种子:初值
标识增量:每次增加多少
注意:只有整型的列才能设置自增。
一张表只能有1个自增列。
[nʌl]
3)非空约束(not null):不允许有null值。
[dɪˈfɔːlt]
4)默认值约束(default 值): 当某列有默认值,输入 时没有填写数据,会自动取值为默认值。
datetime default getdate()--默认当前时间
[juˈniːk]
5)唯一约束(unique): 不允许出现重复值,允许出现一个null值。
比如身份证号是唯一的。
[tʃek]
6)检查约束(check(条件)): 限制数据的取值范围。
[tʃek][lɛn]
check(len(Code)=18)--长度必须18位
比如:性别只能是男或女
check(列名='男' or 列名='女')
成绩在0到100之间
check(列名>=0 and 列名<=100)
写条件表达式需要用到运算符:
a、关系运算符:
>、>=、<、<=、=(等于)、!=(不等于)、<>(不等于)
b、逻辑运算符:
and:与,多条件同时成立
or:或,多条件只要满足一个
not:非
[ˈfɒrən] [ˈrefrənsɪz]
7)外键约束(foreign key references 表名(列名)):
外键:指的是某个列在一张表中是主键,在另一张表不是主键列,那叫外键。
外键:体现表与表之间的关系。
外键的数据只能来源于主键表出现过的数据;
外键允许null值。
1、创建数据库
--1)、创建数据库:所有设置默认
create database StudentDB
go
2、切换数据库
--2)、切换数据库:在使用某个数据库前,要切换到它
use StudentDB
go
3、创建数据表
--创建员工表
create table EmpInfo
(
Eid int, --工号
Ename varchar(50), --姓名
Sex char(2), --性别
JoinTime datetime, --入职日期
WorkYears int, --工作年限
Postion varchar(50), --职位
BaseMoney money, --基本工资
Remark text --简介
)
go
4、添加
[ɪnˈsɜːt ]
1)用insert 语句来实现添加
基本语法:insert [into] 表名[(列名1,列名2,....)]
values(值1,值2,....)
go
1、增加数据:
1)insert into ...values语句
into 可以省略,默认给所有列添加数据
自增列不能给数据
default表示使用默认值
getdate()默认当前时间
null表示空值
一次性添加多条数据
如果要指定列:自增列不能写,非空列一定要写!!
用insert 语句来实现添加
基本语法:insert [into] 表名[(列名1,列名2,....)]
values(值1,值2,....)
go
--默认给所有列添加数据
insert into StudentInfo
values(1,'tom',18),
(2,'jack',10)
go
--一次性添加多条数据
insert into TypeInfo
values(2,'科幻'),
(3,'玄幻'),
(4,'言情')
go
--如果要指定列:自增列不能写,非空列一定要写!!
insert into BookInfo(BookName)
values('小林传奇')
go
insert into BookInfo(BookName,Author,Price)
values('小莫总裁','小秦',100)
go
2)insert into ...select语句实现添加
union连接下一条数据
default关键字不能使用
insert into TypeInfo
select 5,'历史' union --union连接下一条数据
select 6,'悬疑' union
select 7,'计算机'
go
insert into StudentInfo
select 1,'tom',18 union
select 2,'jack',10
go
[sɪˈlekt]
在insert...select中,default关键字不能使用
insert into BookInfo
select '计算机基础','张三',9.9,'清华大学',2008,null,1
go
5、备份
可以用insert..select语句实现数据备份:
--从一张表查询数据出来放入另一张表备份起来
--先创建备份表:
create table TypeInfo_bak --图书类型的备份表
(
TypeId int primary key,
TypeName varchar(50) unique not null
)
go
--把图书类型表TypeInfo数据备份到TypeInfo_bak中
insert into TypeInfo_bak
select * from TypeInfo
go
select....into语句:实现备份
--把所有图书查询出来,备份到新表BookInfo_bak中
select *
into BookInfo_bak --备份表(自动创建出来)
from BookInfo
6、修改
2、修改数据 基本语法:update 表名 set 列名1=值1,列名2=值2,.... [where 条件] go 加where语句,定位到具体的行 不加where,整列值都改成一样的了 同时修改多列:自增列不允许修改 修改后的数据也要满足约束 --加where语句,定位到具体的行 --把类型编号为1的类型名称改成编程 update TypeInfo set TypeName='编程' where TypeId=1 go update studentInfo set name='小明',age=30 where sid=1 go --不加where,整列值都改成一样的了 update BookInfo set Author='李四',Price=10 go --同时修改多列:自增列不允许修改 --修改后的数据也要满足约束 update TypeInfo set TypeID=10,TypeName='COMPUTER' where TypeID=7 go update BookInfo set BookName='SQL SERVER',Author='王 五',Price*=1.2,Pub='NF' where BookID=1005 go --修改主键表主键列的值: --如果外键有引用的时候,不能直接修改 --怎么办?先把外键引用的地方修改成null(去除引用) --再去修改主键表主键列的值 --第一步:先把外键引用设置成null update BookInfo set TypeId=null --外键设置成null where TypeId=1 go --第二步:再把主键表主键进行修改 update TypeInfo set TypeId=8 where TypeId=1 go
7、删除
[dɪˈliːt] 3、删除数据:delete [from] 表名 [where 条件] go 不加条件,删除所有数据(from 可以省略) 删除某些数据 delete from studentInfo where sid=1 go --不加条件,删除所有数据(from 可以省略) delete from BookInfo go --删除某些数据 delete from BookInfo where BookId=1008 go --删除所有数据(清空表) [trʌŋˈkeɪt][ˈteɪbl] truncate table 表名 go truncate table TypeInfo_bak go --删除表:先删外键表,再删主键表 drop table BookInfo go drop table TypeInfo go --要删除主键被引用的数据? --先把外键修改成NULL update BookInfo set TypeId=null where TypeID=10 go delete from TypeInfo where typeId=10 go
8、查询
3、单表查询数据: 查询语句的语法: select 列名 from 表名 [where 条件表达式] --数据筛选 [ɡruːp] [group by 分组依据] --分组查询 [having 条件表达式] --分组后的筛选 [order by 排序依据] --排序(放最后) 查询语句 --1)查询全部列的数据,*代表所有列 select * from ClassInfo --2)查询指定列的数据,写出列名 select Cid,Grade from ClassInfo --3) 给列指定别名 select Cid as 班级编号,Grade as 年级 -- as取别名,as 可以省略 from ClassInfo select 班级编号=Cid,年级=Grade -- = 取别名,别名在前 from ClassInfo --4)查询前n条数据:top n/top n percent select top 2 * from ClassInfo --前2条数据 [pəˈsɛnt] select top 50 percent * from ClassInfo --前50%的数 据 [dɪˈstɪŋkt] --5)去掉重复项:distinct select distinct Gender from StudentInfo --where子句:在查询中,用于数据的筛选 select * from StudentInfo --where Sid=1 --等于 --where Sid!=1 --不等于 --where Sid<>1 --不等于 --where Sid>=2 and Sid<=5 --and:并且 --where Sid between 2 and 5 --学号在2到5之间,跟 Sid>=2 and Sid<=5 一样 --where Sid=1 or Sid=3 --or:或者 --where Sid in(1,3) --学号匹配1或3都可以,跟 Sid=1 or Sid=3 --where Phone is null --空与非空不能用=,要用is --where Phone is not null go --模糊查询 select * from StudentInfo --where Sname like '张%' --找出所有姓张的,以张开头 --where Sname like '%三%' --包含三的学生 --where Sname not like '%三%' --不包含三的 --where Address like '%斗门' --以斗门结尾 --where Sname like '张_' --下划线匹配单个字符 go
9、排序
--排序 select * from StudentInfo --order by Sname --默认升序 --order by Sname asc --asc表示升序 --order by Sname desc --desc表示降序 order by Gender desc,Sid asc --按多列排序,先按性别, 再按学号 go
10、聚合函数
--聚合函数: [sʌm] select sum(Age) 年龄和 from StudentInfo select avg(Age) 年龄平均 from StudentInfo [mæks] select max(Age) 最大年龄 from StudentInfo select min(Age) 最小年龄 from StudentInfo [kaʊnt] select count(*) 学生人数 from StudentInfo
11、统计
--分组查询:group by子句,分组经常要配合聚合函数一起使用 --按照性别分组,统计男生、女生的人数 select Gender 性别,COUNT(*) 人数 from StudentInfo group by Gender --按照性别分组 go --分组时,select后只能跟两种列: --1)group by后出现的列(用于分组的列) --2)聚合函数列 (用于统计的列) --按照班级分组,统计每个班有多少人 select Cid 班级编号,COUNT(*) 人数 from StudentInfo group by Cid go --分组之后的筛选:having select Cid 班级编号,COUNT(*) 人数 from StudentInfo group by Cid --having Cid is not null --一定要用在group by后 having COUNT(*)>1 go --全部子句用上的案例: select Address 地区,COUNT(*) 人数 from StudentInfo where Sid>1 group by Address having COUNT(*)>=1 order by 人数 desc --排序可以使用别名 go
12、基本连接查询
--基本连接查询:返回两张表匹配的数据 select Sid,Sname,B.Cid,Grade,Term --所需要的列 from ClassInfo A,StudentInfo B --给表取别名 where A.Cid=B.Cid --连接条件:主外键 的值相等 go
13、内连接
--内连接:返回两张表匹配的数据 --关键字:inner join ... on select Sid,Sname,B.Cid,Grade,Term from StudentInfo A inner join ClassInfo B --给表取 别名 on A.Cid=B.Cid --连接条件:主外键的值相等 go
14、外连接
--外连接: --左外连接:返回两张表匹配的数据, --还可以返回左表有,右表没有的数据(不匹配的数据, 会在右表的列用NULL替代) -- 关键字:left [outer] join ...on:outer可以省略 select A.*,B.* from StudentInfo A --学生表是左表 left join ClassInfo B --班级表是右表 on A.Cid=B.Cid --where A.Cid is null --可以查询哪些学生没有 被分配班级 go select * from ClassInfo A --班级表是左表 left join StudentInfo B --学生表是右表 on A.Cid=B.Cid --where Sid is null --找出哪些班级没有学生 go --右外连接:返回两张表匹配的数据, --还可以返回右表有,左表没有的数据(不匹配的数据, 会在左表的列用NULL替代) select * from StudentInfo A --学生表是左表 right join ClassInfo B --班级表是右表 on A.Cid=B.Cid go --左外和右外下面写法是等价的 --select * from A left join B on .... --select * from B right join A on .... --全外连接:完整外连接 --全外=左外+右外 select * from StudentInfo A left join ClassInfo B on A.Cid=B.Cid go select * from StudentInfo A [dʒɔɪn] right join ClassInfo B on A.Cid=B.Cid go select * from StudentInfo A [fʊl][dʒɔɪn] full join ClassInfo B on A.Cid=B.Cid go
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏