简介
-
数据库的作用:数据存储
数据库本质上就是个文件系统,而且存储的数据可以实现持久化存储
-
DBS:—>数据库系统:由数据库、数据库管理员、数据库管理系统构成
-
DBMS:—>数据库管理系统:是一种用于操纵和管理数据的软件,用于建立、使用、维护数据库。因此数据库的安全性、健壮性、可扩展性都得到了提升
-
DBA:—>数据库管理员:DBA使用DBMS来管理DB
-
DB:—>数据库:本质上是一个个的文件
当前数据库分为两大类:关系型数据库和非关系型数据
-
关系型数据库(relational database):存放数据的结构是表,首先要有数据库,再在数据库中创建表,然后在表中存放数据。关系型数据库内部,表与表之间是可以建立关联的。
- 优点:数据结构鲜明、容易管理
- 缺点:如果数据量过于庞大,那么在操作数据时,效率相对来说过于底下
- 典型软件:oracle,DB2,sqlServer,mysql…
-
非关系型数据库:(NoSql)结构简单,数据与数据之间没有关系。通常用做数据缓存(比如:redis缓存框架)
- 优点:在架构层面做到了易扩展、数据库庞大时,性能也会很高
- 典型软件:Redis、MongoDB
-
-
SQL
SQL就是结构化的查询语言(structured query language)
-
特点:
是一种具有特殊目的的编程语言,是用来完成数据库查询和设计的语言,用于对数据进行更新和查询,创建数据库、创建表等…
想要操作数据库,想要操作数据库,想要完成对数据库的任何改动,必须使用SQL,因为数据库能够识别的语言只有SQL
-
DDL(data definition language)数据定义语言 :
针对数据库或者表结构的创建、修改、删除,通俗来说就是定义数据存储结构的sql语句,关键字:
create,alter,drop,show… -
DML(data manipulation language)数据操作语言:
主要操作数据表中数据的增删改(添加,删除,修改),关键字:
insert,delete,update -
DQL(data query language)数据查询语言:
主要针对数据的查询操作,关键字
select -
DCL(data control language)数据控制语言:主要用来创建用户,设置权限,回收权限等,关键字:
grant(授权),revoke(回收权限)- 重要数据的操作,是会签订保密、安全协议的,这个是具有法律效应的
- 通常其他人没有删除的操作权限
- 数据库都是有备份的
-
TCL(transaction control language)数据事务语言:主要用来数据库操作的事务,关键字:
commit,rollback等 -
CCL(cursor control language)指针控制语言:
-
SQL语句的书写规范:
- sql语句不区分大小写,也就是对大小写不敏感。但是要注意,不区分大小写的是sql语句的关键字,但是自定义的内容严格区分大小写
- sql语句关键字与内容之间使用空格隔开,目的在确保sql语句正确的前提下,提高代码的可读性
- 每一条sql语句中
-
DDL
-
数据库操作
win+r-->cmdmysql -uroot -p密码show databases;#创建数据库 create database 数据库名称; #判断数据是否存在之后再创建 create database if not exists 数据库名; #如果还要考虑数据库中的编码格式的话(编码用""引起来,例:"utf8") create database if not exists 数据库名 character set "编码格式"(gbk|utf8);use 数据库名称;alter database 数据库名称 character set "编码格式";show create database 数据库名称;drop database 数据库名称; -
常用数据类型
-
表结构操作
create table 表名(列名1 数据类型(长度),列名2 数据类型(长度)......); #当列的数据类型为整数和日期的时候,长度是可以省略的desc 表名;alter table 旧表名 rename 新表名;show create table 表名;show tables;alter table 表名 add 列名 数据类型(长度);alter table 表名 add 列名 数据类型(长度) first;alter table 表名 add 列名 数据类型(长度) after 指定的列名;alter table 表名 modify 列名 数据类型;alter table 表名 change 旧列名 新列名 数据类型(长度);alter table 表名 modify 列名 新类型 新约束;alter table 表名 drop 列名;drop table 表名;案例:
#创建一个表 stu,包含学号sno,姓名sname,年龄age,生日bir CREATE TABLE stu( sno INT, sname VARCHAR(100), age INT, bir DATE ); #将stu表改名为stu1 ALTER TABLE stu RENAME stu1; #向stu1中添加一个sex列 ALTER TABLE stu1 ADD sex VARCHAR(10); #将sex列的类型改变为tinyint类型 ALTER TABLE stu1 MODIFY sex TINYINT; #将sex列改变为gender ALTER TABLE stu1 CHANGE sex gender TINYINT; #将gender列删除掉 ALTER TABLE stu1 DROP gender;
DML
数据库操作语言—>增删改
-
添加insert
-
添加一行数据
注意事项:
- 如果只添加一条数据,使用
values,如果想要一次性添加多条数据,使用value - 字段的个数与类型要与值的个数与类型一致
字段=列 - 如果想要为字段赋值为空:不写此字段或直接为此字段赋值为
null - 现在要为表中所有字段完成赋值:将字段挨个写出来或忽略字段的书写,直接写
value,但在写值时要注意个数、顺序与类型要与表中字段完全一致 - 在一次性添加多行数据时,那么数据与数据之间用逗号分隔
- 如果只添加一条数据,使用
insert into 表名(列名1,列名2,...)values(值1,值2,...);insert into 表名(列名1,列名2,...)values(值11,值12,...),(值21,值22,...),...;#这是一个单行注释 -- 这也是一个单行注释(注意:这里--后有空格)/* 这是一个多行注释 */案例
#添加一行数据 INSERT INTO demo01(sno,sname,age,sex,bir)VALUES('001','张三',23,'男','1998-6-16'); #向demo01表中添加一行数据(sno,sname) INSERT INTO demo01(sno,sname)VALUES('002','李四'); /* 当向一行中所有的列添加数据的时候,可以简写成 insert into 表名 values(值1,值2,...); 值1,值2,...等一些值必须按照表的顺序进行添加,不可改变位置 */ INSERT INTO demo01 VALUES ('003',22,'王五','男','1999-3-18'); #添加多行数据 INSERT INTO demo01 VALUES ('004',23,'赵六','女','1998-5-22'),('005',23,'小明','男','1998-10-19'),('006',21,'小红','女','2000-1-18'); -
-
修改update
注意事项:
- 修改时没有条件,那么表中所有的记录修改字段的值都会成为一致状态
- 修改时有条件,先通过条件筛选出满足的记录,修改这些满足条件的记录中字段的值
- 一次性改变多个字段的值时,多个字段之间使用逗号分隔
- 修改后的值,
update 表名 set 列名1=新值,列名2=新值,... where 条件(列名=值);案例:
#将名字为小明的生日修改为1998-11-28 UPDATE demo01 SET bir='1998-11-28' WHERE sname='小明'; #将编号为002的年龄修改为18,生日修改为2003-3-23 UPDATE demo01 SET age='18',bir='2003-3-23' WHERE sno='002'; #将编号为004的学生姓名改为赵小六 UPDATE demo01 SET sname='赵小六' WHERE sno='004'; -
删除delete
注意事项:
-
删除时没有条件,将表中所有记录删除
-
删除时携带条件,将满足条件的记录删除
delete from 表名 where 条件(列名=值); -
-
截断truncate
truncate table 表名;案例:
#删除编号为005的学生信息 DELETE FROM demo01 WHERE sno='005'; #删除男同学信息 DELETE FROM demo01 WHERE sex='男'; #截断表(清空表) TRUNCATE TABLE demo01; #删除表(清空表) DELETE FROM demo01;
DQL
-
查询select
select 列名1,列名2,... from 表名;select distinct 列名 from 表名;#设置列的别名 select 列名1 as 别名1, 列名2 别名2 from 表名; #设置表的别名 select 别名.字段1 , 别名.字段2 from 表名 别名;select * from 表名;select 列名 from 表名 where 条件(列名=值);-
条件中可以使用的关系符号:大于> 大于等于>= 小于< 小于等于<= 不等于!=或<> 等于=或<=>
=和<>只能判断查询该字段值不为null;<=>和!=可以判断查询该字段值为null;判断为空时可以使用is null;判断不为空时可以使用is not null或者not(字段名 <=> null)
案例:
#查询表中所有数据 SELECT sno,sname,age,sex,bir FROM demo01; #查询sno和sname信息 SELECT sno,sname FROM demo01; #给列名取别名(关键字as->但是往往省略不写)select 列名 as 别名 from 表名; #别名类似于绰号,不改变数据库的原名称 SELECT sno AS 学生编号,sname AS 学生姓名 FROM demo01; SELECT age 年龄,bir 生日,sex 性别 FROM demo01; #查询学生编号为004的学生信息 SELECT * FROM demo01 WHERE sno = '004'; #查询学生年龄大于22的学生信息 SELECT * FROM demo01 WHERE age > 22; #查询学生姓名张三之外的其他学生信息 SELECT * FROM demo01 WHERE sname <> '张三';#相当于查询学生姓名不等于张三的学生信息 SELECT * FROM demo01 WHERE sname != '张三'; #查询学生姓名为null的学生信息 SELECT * FROM demo01 WHERE sname <=> NULL; SELECT * FROM demo01 WHERE sname IS NULL; #查询学生姓名不为null的学生信息 SELECT * FROM demo01 WHERE sname != NULL; SELECT * FROM demo01 WHERE sname IS NOT NULL; SELECT * FROM demo01 WHERE sname NOT(sname <=> NULL);-
and|or|not|in|between…and…关键字的用法
and同时满足两个条件or满足两个中的一个条件或两个都个满足not不满足该条件in在给定的数值中选择满足的值–>or的简化写法(同一个列取多个值的时候)between A and B在[A,B]的范围区间内取值,AB的数据类型:数字|日期
案例:
#查询学生性别为男,并且年龄大于20的学生信息 SELECT * FROM demo01 WHERE sex='男' AND age>20; #查新学生编号为002,005,008的学生信息 SELECT * FROM demo01 WHERE sno='002' OR sno='005' OR sno='008'; SELECT * FROM demo01 WHERE sno IN ('002','005','008'); #查询年龄在21到22之间的学生信息 #不用bewteen...and... SELECT * FROM demo01 WHERE age>=21 AND age<=22; #使用bewteen...and... SELECT * FROM demo01 WHERE age BETWEEN 21 AND 22; #查询生日为1998年5月份的学生信息 SELECT * FROM demo01 WHERE bir BETWEEN '1998-05-01' AND '1998-05-31';案例:
#将学生编号为002的学生年龄信息改为空null UPDATE demo01 SET age=NULL WHERE sno='002'; #查询年龄为空的学生信息 SELECT * FROM demo01 WHERE age IS NULL; #查询年龄不为空的学生信息 SELECT * FROM demo01 WHERE age IS NOT NULL;案例:
SELECT DISTINCT(age) FROM demo01; -
-
约束
主要作用:规范表中列的值,让数据更加合理
主键约束、非空约束、默认约束、唯一约束、外键约束
-
主键约束primary key:
- 作用:字段的值非空且唯一,主键的作用就是用来唯一标识一条记录的。主键这个字段与表中正常数据的字段是无关系的,主键是不具备含义的字段。主键的字段名通常都是以
id结尾,而且主键的字段类型通常都是int类型 - 意义:检索的时候速度快
- 注意:一个表中只有一个主键,一个主键可以是多个列
- 在创建表的时候添加约束即可,在列的后边直接添加
primary key
CREATE TABLE demo02( id INT PRIMARY KEY, NAME VARCHAR(100) ); INSERT INTO demo02 VALUES (1,'张三'); #insert into demo03 values (1,'李四');#会报错,主键不能重复- 一般情况下,当一个列作为一个主键列的时候,因为主键是非空且唯一的,那么我们自己手动维护,难免会出现重复值的情况,所以针对主键,提供了一种自增长的机制,可以帮助我们去维护主键的值
- 作用:字段的值非空且唯一,主键的作用就是用来唯一标识一条记录的。主键这个字段与表中正常数据的字段是无关系的,主键是不具备含义的字段。主键的字段名通常都是以
-
自增auto_increment
特点:
- 只有整型主键才可以用自增长修饰
- 只有主键字段才能使用自增长修饰
- 自增长的主键在赋值时,可以给
null,会做值的自动累加 - 初始值为1,每次累加1
- 自增的值一旦出现,不能重复,而且累加默认从最大值往后累加
CREATE TABLE demo03( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(100) ); INSERT INTO demo03 (NAME) VALUE ('张三'); #运行多少次也不会报错 #运行时id值每次在该列中找到最大值(所有该列中出现过的id中的最大值)加一 -
非空约束not null
字段的值不能为空,添加位置与主键约束的添加位置相同;可以创建表的时候添加,也可以创建之后再添加(
null值不等于空字符串)CREATE TABLE demo04( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(100) NOT NULL ); INSERT INTO demo04 (NAME) VALUE ('');#空字符串与字符为空是不同的两个概念,二者不相等 #INSERT INTO demo04 (NAME) VALUE (null);#报错,违反非空约束如果触犯了非空约束:
column '列名' cannot be null -
默认约束default
如果想要选取默认值:
- 忽略此字段的赋值
- 为该字段赋值为default
如果想要改变默认约束字段的值,那么就需要我们手动赋值
CREATE TABLE demo05( id INT PRIMARY KEY AUTO_INCREMENT,#编号为主键 NAME VARCHAR(100) NOT NULL,#姓名值不为空 age INT DEFAULT 18#年龄默认18岁 ); INSERT INTO demo05 (NAME) VALUE ('珊珊'); SELECT * FROM demo05; INSERT INTO demo05 (NAME,age) VALUES ('珊珊',20); SELECT * FROM demo05; INSERT INTO demo05 VALUES ('珊珊',default); SELECT * FROM demo05;CREATE TABLE demo06( id INT PRIMARY KEY AUTO_INCREMENT,#主键 NAME VARCHAR(100) NOT NULL,#值不为空 age INT DEFAULT 18,#默认18岁 tel VARCHAR(50) UNIQUE#电话号码唯一 ); INSERT INTO demo06 (NAME,tel) VALUES ('凉凉',''); #INSERT INTO demo06 (NAME,tel) VALUES ('亮亮','');#报错,违反唯一约束 INSERT INTO demo06 (NAME,tel) VALUES ('亮亮','13813331122'); #INSERT INTO demo06 (NAME,tel) VALUES ('珊珊','13813331122');#报错,违反唯一约束 SELECT * FROM demo06; 如果触犯了唯一约束:
duplicate entry '值' for key '列名' -
-
表关系
一对一、一对多(多对一)、多对多
-
一对一
设计方式:两张表A、B,分别添加主键,选取任意一张表,设置外键关联另一张表的主键,而且作为外键的是当前这张表的主键!通俗来说:主键连主键
特点:在一对一的关系下,两个表中主键值相同的记录就是对应关系
CREATE TABLE hus(#创建丈夫表 hid INT PRIMARY KEY, hname VARCHAR(100) NOT NULL ); CREATE TABLE wife(#创建妻子表 wid INT PRIMARY KEY, wname VARCHAR(100) NOT NULL, FOREIGN KEY(wid) REFERENCES hus(hid)#设置外键的一种方式 #丈夫表的主键作为妻子表的主键,实现一对一关系 ); #一个表中的列作为主键的同时又是外键,如上表中的wife表 INSERT INTO hus VALUES(1,'唐伯虎'); INSERT INTO hus VALUES(2,'张无忌'); INSERT INTO hus VALUES(3,'杨过'); INSERT INTO hus VALUES(4,'景天'); INSERT INTO wife VALUES(1,'秋香'); INSERT INTO wife VALUES(2,'周芷若'); INSERT INTO wife VALUES(3,'小龙女'); INSERT INTO wife VALUES(5,'赵灵儿');#报错,因为主表中没有id为5的值,所以从表是不可以使用的,违反外键约束 #如果两个表中有主从关系,那么删除的时候应该先删除从表数据,然后再删除主表数据CREATE TABLE dept(#部门表 dno INT PRIMARY KEY, dname VARCHAR(100) NOT NULL ); CREATE TABLE emp(#员工表 eno INT PRIMARY KEY, ename VARCHAR(100) NOT NULL, dno INT, FOREIGN KEY(dno) REFERENCES dept(dno)#设置外键的一种方式 );CREATE TABLE stu(#学生表 sid INT PRIMARY KEY, sname VARCHAR(100) NOT NULL ); CREATE TABLE course(#课程表 cid INT PRIMARY KEY, cname VARCHAR(100) NOT NULL ); CREATE TABLE s_c(#中间表:选课表 id INT PRIMARY KEY, sid INT, cid INT, FOREIGN KEY(sid) REFERENCES stu(sid), FOREIGN KEY(cid) REFERENCES course(cid) ); #此时,学生表与课程表之间就是多对多关系 #添加一些数据 INSERT INTO stu VALUES(1,'zs'); INSERT INTO stu VALUES(2,'ls'); INSERT INTO stu VALUES(3,'ww'); INSERT INTO stu VALUES(4,'zl'); INSERT INTO course VALUES(1,'java'); INSERT INTO course VALUES(2,'python'); INSERT INTO s_c VALUES(1,1,1); INSERT INTO s_c VALUES(2,1,2); INSERT INTO s_c VALUES(3,2,1); INSERT INTO s_c VALUES(4,3,2); INSERT INTO s_c VALUES(5,4,1); INSERT INTO s_c VALUES(6,4,2); -
-
连接查询
连接查询可以一次性差询多张表,同时得到多张表中的数据,当你要获取的结果集中的数据来自于不同的表时,就需要使用连接查询来获取
在使用连接查询时,既然需要多表同时进行查询,那么就需要书写多表的连接条件,此时才能建立起查询的关联关系,所以连接条件是必须要写的;书写连接条件是为了正确获取具有对应的关系的多表数据,防止产生冗余错乱的数据
-
内连接查询
先通过连接查询得到数据,在通过
where除连接条件之外的条件对结果集进行筛选select 列名 from 表1,表2 where 关联关系 [and 筛选条件];select 列名 from 表1 inner join 表2 on 关联关系 [where 筛选条件];关联关系:其实就是让两个表实现关联的表达式;关联关系的一般写法:
表1.列名 = 表2.列名-->列名:关联列(外键列)案例:
#查询学生信息以及对应的学生班级信息(隐式内连接) SELECT * FROM stu s,course c,s_c sc WHERE s.sid=sc.sid AND c.cid=sc.cid;#取别名,方便使用,别名的范围只在当前语句中使用,并且取别名就一定要用别名,用原名直接报错 SELECT id,s.sid,sname,c.cid,cname FROM stu s,course c,s_c sc WHERE s.sid=sc.sid AND c.cid=sc.cid AND cname='java'; #查询学生信息以及对应的学生班级信息(显式内连接) SELECT * FROM stu s JOIN s_c sc ON s.sid=sc.sid WHERE cid=1; -
外连接查询
AB两个有关联的表,以一个表A为基准实现查询(A表中的数据,必须全部显示出来),另外一个表B显示与A表对应的所有数据,如果B表没有对应数据,则以null补齐数据
-
左外连接(左连接)left join…on…
特点:以一个左表为基准实现查询(必须全部显示出来),右表显示与左表对应的所有数据,如果右表没有对应数据,则以
null补齐数据select 列名 from 左表 left join 右表 on 关联条件[where 条件...];案例:
# SELECT * FROM stu s LEFT JOIN s_c sc ON s.sid=sc.sid WHERE cid=1; -
右外连接(右连接)right join…on…
特点:以一个右表为基准实现查询(必须全部显示出来),左表显示与右表对应的所有数据,如果左表没有对应数据,则以
null补齐数据select 列名 from 左表 right join 右表 on 关联条件[where 条件...];案例:
# SELECT * FROM stu s RIGHT JOIN s_c sc ON s.sid=sc.sid WHERE cid=1; -
外连接总结
-
外连接可以依附于某一张表进行查询,该表中的数据都可以获取,如果不满足连接条件,另一张表中的数据全部补
null -
外连接因为表的位置不一样,会影响sql语句的执行语义,会改变依附的查询表,所以前后的顺序不能发生改变,与内连接完全不一样
-
左外连接与右外连接其实本质上是一致的,把关键字
left join换成right join,再将表的位置一调换,结果没有区别
-
-
-
-
高级查询
案例:
#查询学生姓名中包含李的学生信息 SELECT * FROM demo01 WHERE sname LIKE '%李%'; #查询学生姓名中第二个字是三的学生信息 SELECT * FROM demo01 WHERE sname LIKE '_三'; #查询学生姓名只有两个字的学生信息 SELECT * FROM demo01 WHERE sname LIKE '__';案例:
#按照学生年龄升序查询 SELECT * FROM demo01 ORDER BY age ASC; SELECT * FROM demo01 ORDER BY age; #按照学生年龄降序查询 SELECT * FROM demo01 ORDER BY age DESC; #按照学生年龄降序查询,查找性别为男的学生信息 SELECT * FROM demo01 WHERE sex='男' ORDER BY age DESC;案例:
#查询前3个学生信息 SELECT * FROM demo01 LIMIT 0,3; SELECT * FROM demo01 LIMIT 3; #查询第2到5行的学生信息 SELECT * FROM demo01 LIMIT 1,4; #查询学生性别为男中年龄最大的学生信息 SELECT * FROM demo01 WHERE sex='男' ORDER BY age DESC LIMIT 1; 分页解决了服务器查询数据的压力,解决了页面显示数据的压力
-
聚合函数
数据库有这么一些有特定功能的函数|方法,其中有一些函数返回的结果是一行或一列当中的一个值,这样的函数,我们称为聚合函数
-
sum(字段):求和,列的类型为数字 -
max(字段):最大值,列的类型为数字或日期 -
min(字段):最小值,列的类型为数字或日期 -
avg(字段):平均值,列的类型为数字 -
count(字段):计数,统计,列的类型为任何类型或者任意列count函数如果传入了具体的某个字段,一旦该字段的值为null,则不计数,哪怕其余字段有值,所以为了避免这种情况,通常直接用count(*)来计数,当所有字段都为null时不计数,只要有一个不为null就计数
#查询学生总人数 SELECT COUNT(*) 总人数 FROM stu; #查询demo01中最大的年龄 SELECT MAX(age) FROM demo01; #查询demo01性别为男的中最大的年龄 SELECT MAX(age) FROM demo01 WHERE sex='男'; -
-
group by … having… 分组查询
group by 列名 having 条件
-
-
查询语句的关键字书写顺序:
select 字段列表、聚合函数 from 表名 where 分组前的条件 group by 分组字段 having 分组后的条件 order by 排序 limit 分页where > group by > 聚合函数 > having > order by > limit案例:
#查询每个学生的选课数量 SELECT sid,COUNT(*) FROM s_c GROUP BY sid; #查询每个学生的选课数量,并且sid降序排列 SELECT sid,COUNT(*) FROM s_c GROUP BY sid ORDER BY sid DESC; #查询每个学生的选课数>1,并且sid降序排列 SELECT sid,COUNT(*) FROM s_c GROUP BY sid HAVING COUNT(*)>1 ORDER BY sid DESC; SELECT sid,COUNT(*) a FROM s_c GROUP BY sid HAVING a>1 ORDER BY sid DESC; -
子查询
查询语句中又有另外一个查询语句,将优先执行的查询用小括号括起来的查询,那么此查询就是子查询,往往子查询是将查询的结果作为父查询的条件来使用的
select 列名 from 表名 where 列名 符号 (select 列名 from 表名 where [条件]);案例:
#查询学生zs SELECT sid FROM stu WHERE sname='zs'; #查询学生zs的选课信息 SELECT * FROM s_c sc WHERE sid IN (SELECT sid FROM stu WHERE sname='zs');#最好用in来取代= -
备份和恢复
-
通过dos命令行进行备份
在没有登录数据库的情况下备份:
mysqldump -uroot -p密码 要备份的数据库名 >备份文件的路径/文件名.sql注:备份的文件中不包含创建数据库的sql语句,所以在恢复数据时,需先创建数据库来接收
-
通过dos命令行进行恢复
在没有登录数据库的情况下还原:
mysql -uroot -p密码 要还原到的数据库名 <已备份文件的路径/文件名.sql在登录数据库的情况下还原:首先登陆
mysql -uroot -p密码,进入数据库use 数据库名,还原source 已备份文件的路径/文件名.sql -
通过可视化工具SQLYog进行备份
鼠标右键点击数据库,选择备份/导出,选择备份数据库、转储到sql,在弹出页面选中结构和数据,包括"CREATE database"语句,选择导出到的路径与名字,最后点击导出,此时接收数据库备份的文件可以不用提前创建,会自动创建
-
通过可视化工具SQLYog进行恢复
在左侧数据库管理的区域,右键选择执行sql脚本,选择备份的文件,点击执行即可完成恢复
-
本文详细介绍了MySQL数据库的基础知识,包括数据库系统概念、数据库管理系统DBMS、数据库管理员DBA的角色,以及关系型数据库和非关系型数据库的区别。重点讲解了SQL语言,包括DDL、DML、DQL和DCL,以及数据类型、表结构操作和数据操作。此外,还涵盖了SQL语句的书写规范、数据库操作示例和约束。最后,讨论了表关系设计、连接查询、外连接和高级查询技巧,如分页、模糊查询、排序和聚合函数的使用。
425

被折叠的 条评论
为什么被折叠?



