数据库
-
基本概念、
-
数据(data):数据是数据库中存数据的基本对象,是描述事物的符号记录
-
数据库(database DB):数据库就是存储数据的仓库,长期存储在计算机中有组织可共享的相关数据集合
-
数据库管理系统(database management system DBMS):专门用于数据库创建和管理的软件
-
数据库系统(database system DBS):支出数据库的相关计算机硬件软件人员
-
-
数据库管理技术发展阶段
-
人工管理阶段
-
文件系统阶段
-
数据库系统阶段:数据结构化,数据共享,数据独立性高,数据统一由dbms控制
-
-
三级模式与二级映射
-
外模式
-
外模式/概念模式映像(保障逻辑独立性)
-
概念模式
-
概念模式/内模式映像(保障物理独立性)
-
内模式(存储模式)
-
-
数据模型
-
现实世界
-
信息世界
-
概念模型
-
e-r图
-
实体—矩形框
-
属性—椭圆形
-
联系—菱形
-
1—1(一个学生一个学号)
-
1—n(一个班级多个学生)
-
n—m(多和学生多门课程)
-
-
-
-
SQL
-
定义
-
Structured Query Language:结构化查询语言
-
是用访问和处理数据库的标准计算机语言
-
-
组成
-
DDL
-
Data Definition Language 数据定义语言
-
用来定义数据库对象:数据库,表,列。关键字:CREATE,DROP,ALTER
-
-
DML
-
Data Manipulation Language 数据库模拟语言
-
用来对数据库中的数据进行增删改。关键字:INSERT,DELETE,UPDATA
-
-
DQL
-
Data Query Language 数据库查询语句
-
用来查询数据库中表的记录(数据)。关键字,SELECT
-
-
DCL
-
Data Control Language 数据库控制语言
-
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE,ROLLBACK,COMMIT等
-
-
-
语法
-
语句可以单行或者多行书写,以分隔符(常用分号)结尾
-
不区分大小写,但强烈建议遵循规范
-
关键字与函数名称全部大写
-
数据库名称,表名称,,字段名全部小写
-
-
3钟注释
-
单行注释 -- (杠杠空格)和 #
-
多行注释 /*注释*/
-
-
-
-
SQL的具体使用
-
DDL:数据库,数据操作
-
数据库操作
-
查看数据库
-
查看已有的数据库:SHOW DATABASE;
-
开始和结束输出日志:\T开始,\t结束
-
\T具体路径\文件名.txt
-
-
查看指定数据库的创建信息:SHOW CREATE DATABASE 指定的数据库名称;
-
查询当前正在使用的数据库名称:SELECT DATABASE();
-
-
创建数据库
-
创建数据库:CREATE DATABASE 数据库名称
-
创建数据库,判断不存在,再创建:CREATE DATABASE ID NOT EXISTS
-
查看上一步操作产生二代警告信息:SHOW WARNNGS
-
-
创建数据库,并指定字符集:CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET = "utf-8"
-
修改数据库的字符集:ALTER DATABASE 数据库名称 DEFAULT CHARACTER SET="utf-8"
-
修改数据库的字数集:ALTER DATABASE 数据库名称 CHARSET'UTF8'
-
-
-
选择数据库
-
选择(转到/使用)数据库:USE 数据库名称
-
登录mysql时选择数据库:mysql -uroot -p 数据库名称
-
-
-
删除数据库
-
删除数据库:DROP DATABASE 数据库名称(慎重使用)
-
判断数据库是否存在,存在再删除:DROP DATABASE IF EXISTS 数据库名称
-
-
-
数据表操作
-
查看数据表
-
查看数据库中已有的数据表:SHOW TABLES;
-
查看指定表的表结构:DESC 表名称;
-
DESC即DESCRIBE的缩写,也可完整写出:DESCRIBE 表名称
-
-
查看指定表的表结构:SHOW COLUMNS FROM 表名称;
-
SHOW FULL COLUMNSFROM 表名称
-
-
查看数据表创建语句:SHOW CREATE TABLE 表名称;
-
-
创建数据表
-
数据类型
-
语法
CREATE TABLE 表名称( 列名1 数据类型1, 列名2 数据类型2, ......... 列名n 数据类型n ); 注意:最后一列,不需要加逗号 为列加备注信息,列名1 数据类型1 COMMENT '备注信息',
-
判断不存在再创建表:CREATE TABLE IF NOT EXISTS表名();
-
创建表时指定字符集:CREATE TABLE ID NOT EXISTS 表名() CHARSET utf8;
-
-
-
修改数据表
-
修改字符集
-
ALTER TABLE 表名 CHARSET 字符集名称;
-
ALTER TABLE 表名 DEFAULT CHARACTER SET 字符集名称;
-
-
修改表名称
-
ALTE TABLE 表名 RENAME TO 新表名;
-
RENAME TABLE 表名 TO 新表名;
-
-
新增字段
-
在最后添加一个字段:ALTER TABLE 表名 ADD 字段名称 字段类型;
-
一次添加多个字段:ALTER TABLE 表名 ADD 字段名称1 字段类型1,字段名称2 字段类型2,.....;
-
指定位置添加字段
-
在最前面添加:ALTER TABLE 表名 ADD 字段名称 字段类型 FIRST;
-
在某字段之后添加:ALTER TABLE 表名 ADD 字段名称 字段类型 AFTER 某字段名
-
-
-
修改字段
-
修改字段名:ALTER TABLE 表名 CHANGE 旧字段名称 新字段名称 字段类型;
-
修改字段类型:ALTER TABLE 表名 MODIFY 字段名称 字段类型
-
修改字段的位置:
-
ALTER TABLE 表名 MODIFY 字段名称 字段类型 FIRST;
-
ALTER TABLE 表名 MODIFY 字段名称 字段名称 字段类型;
-
-
修改字段字符集:ALTER TABLE 表名 MODIFY 字段名 字段类型 CHARACTER SET 字符集名称;
-
-
删除字段
-
ALTER TABLE 表名 DROP 字段名称;
-
ALTER TABLE 表名 DROP COLUMN 字段名称;
-
-
-
删除数据表
-
删除数据表:DROP TABLE 表名;
-
判断数据表不存在,存在再删除:DROP TABLE IF EXISTS 表名;
-
一次删除多个表:DROP TABLE 表名1,表名2...;
-
-
-
-
DML:增删改表中的内容
-
添加数据
-
不指定具体的字段名
-
INSERT INTO 表名 VALUES(值1,值2,值3....)
-
除了数字类型,其他类型的值需要使用引导(单双都可以)引起来
-
-
列出指定字段
-
INSERT INTO 表名(字段名1,字段名2,字段名3.....) VALUES(值1,值2,值3.....);
-
-
一次添加多条记录
-
INSERT INTO 表名(字段名1,字段名2,字段名3.....) VALUES(值1,值2,值3.....),(值1,值2,值3.....);
-
-
通过SET形式插入记录
-
INSTER INTO 表名 SET 字段名1=值1,字段名2=值2,字段名n=值n;
-
-
-
修改数据
-
UPDATE 表名 SET 字段名1=值1,字段名2=值我,....[WHERE 条件表达式];
-
注意,如果不加WHERE子句,则修改表中所有的数据
-
-
-
删除数据
-
DELETE FROM 表名 [WHERE 条件表达式];
-
注意,如果不加WHERE子句,则删除表中所有的数据
-
-
彻底清空数据表:TRUNCATE TABLE 表名;效率高
-
-
字符集与校对集
-
字符集:用来定义MySQL存储字符串的方式
-
查看对应字符集:SHOW CHARACTER SET;或SHOW CHARSET;
-
常用的字符集:
-
latin1(iso8859) 最大长度:1 字节 支持西欧字符,希腊字符等;
-
gbk 最大长度:2字节 支持简体和繁体中文、日文、韩文等;
-
utf8 最大长度:3字节 支持世界上大部分国家的文字
-
-
-
-
校对集:用来定义比较字符串的方式,如是否区分大小写等
-
查看校对集信息:SHOW COLLATION
-
校对集组成:字符集名称_国家名称/general_ci/cs/bin
-
ci:Case Insensitive 不区分大小写
-
cs:Case Sensitive 区分大小写
-
bin:binary 以二进制方式进行比较
-
-
-
-
字符集校对集设置
-
查看字符集相关变量:SHOW VARIABLES LIKE 'character%';
-
Variable_name变量名 说明
-
character_set_client 客户端字符集
-
character_set_connection 客户端与服务器连接所用的字符集
-
character_set_database 默认数据库使用的字符集
-
character_set_filesystem 文件系统字符集
-
character_set_results 将查询结果返回给客户端用的字符串
-
character_set_server 服务器默认字符集
-
character_set_system 服务器用来存储标识符的字符集
-
character_set_dir 安装字符集的目录
-
-
可在创建数据库、数据表是指明数据库、数据表、字段的字符集与校对集
-
通过 SET 变量名 = 值;来更改,但修改只对当前对话有效
-
例如:SET charater_set_server = utf8;—将服务器默认字符集设置为utf8
-
同时更改客户机、链接和返回结果字符集:SET NAMES 字符集名;(对应标黄的几个)
-
-
在MySQL配置文件中进行设置:
[mysqld] basedir=mysql路径 basedir=mysql路径/data port=3306 character-set-server=utf8 [client] default-character-set=utf8
-
-
-
DQL:查询表中的数据
-
查询语句语法
-
SELECT
-
字段列表
-
-
FROM
-
表名列表
-
-
WHERE
-
条件列表
-
-
GROUP BY
-
分组字段
-
-
HAVING
-
分组之后的条件
-
-
ORDER BY
-
排序
-
-
LIMIT
-
分页限定
-
-
-
查询表中全部数据: SELECT * FROM 表名:
-
查询指定列:SELECT 字段名1,字段名2...FROM表名;
-
查询是去除重复值:DISTINCT关键字
-
限制结果:LIMIT
-
显示前n条记录:SELECT字段列表 FROM 表名列表 LIMIT n;
-
显示从指定位置开始的n条数据:SELECT 字段列表 FROM 表名列表 LIMIT 查询的条数n OFFSET 开始的索引;
-
注意:开始的索引=第几行记录-1,第一行记录的索引为0
-
举例:SELECT sno,sname FROM student LIMIT 2 OFFSET 3;——显示从第4行还是的2条记录
-
可以省略OFFSET此时格式为:SELECT sno,sname FROM student LIMIT 3,2;
-
-
实现分页查询:SELECT 字段列表 FROM 表名列表 LIMIT 开始的索引,每页显示的条数;
-
开始的索引=(当前页码-1)*每页显示的条数
-
举例(每页显示3条,显示第3页结果数据):SELECT 字段列表 FROM 表名列表LIMIT 6.3;
-
-
-
使用完全限定的表名:在字段名称前加上表名称
-
查询结果排序:ORDER BY
-
注意:ORRDER BY 子句不行是SELECT语句中最后一个子句
-
排序方向:ASC:升序,ASCENDING,默认,可不写出;DESC:降序,DESCENDING,必须指出;
-
举例:
-
SELECT sno,sname,sage FROM student ORDER BY sage DESC,sno;——先按年龄再按学号排序
-
SELECT *FROM student ORDER BY sage;——按年龄升序排序(默认,未给出ASC)
-
SELECT *FROM student ORDER BY sage ASC;——按年龄升序排序
-
SELECT *FROM student ORDER BY sage DESC;——按年龄降序排列
-
SELECT *FROM student ORDER BY sage,sno DESC;——按年龄升序,学号降序排序
-
SELECT *FROM student ORDER BY CONVERT(sname USING gbk);——字符集utf8中文排序方式3
-
-
-
过滤数据(按条件查询):WHERE
-
WHERE子句操作符:
-
逻辑比较,=、>、<、>=、<=、<>、!=(不等于)
-
范围值检查:BETWEEN AND——指定的两个值之间
-
查询年龄介于19到21岁之间的学生信息:SELECT *FROM student WHERE sage BETWEEN 19 AND 21;
-
-
空值检查:IS NULL/IS NOT NULL
-
-
-
多个限定条件查询:使用AND,OR连接多个条件
-
查询星系系的女生信息:SELECT *FROM student WHERE sdept='IS' AND sgender='女';
-
查询学分为3或者4的课程信息:SELECT *FROM course WHERE ccredit=3 OR ccredit=4;
-
AND优先级比OR高
-
SELECT *FROM course WHERE ccredit=3 OR ccredit=4 AND cpno=6;
-
SELECT *FROM course WHERE (ccredit=3 OR ccredit=4) AND cpno=6;
-
IN操作符:SELECT *FROM course WHERE ccredit IN(3,4) AND cpno=6;
-
-
-
模糊查询:LIKE操作符 结合通配符%(百分号)和_(下划线)
-
%代表 任何字符出现任意次数
-
SELECT * FROM student WHERE sname LIKE '%王'——名字 以王为结尾的
-
SELECT * FROM student WHERE sname LIKE '王%'——名字以王为开头的
-
SELECT * FROM student WHERE sname LIKE '%王%'——名字中有王的
-
-
_代表 单个字符
-
SELECT * FROM student WHERE sname LIKE '王_'——名字以王为开头,且后面还有一个字的
-
-
转义字符:反斜杠 \
-
SELECT * FROM student WHERE sname LIKE '%\_%'——名字中有_的
-
-
-
使用正则表达式(regular expression)进行搜索:REGEXP 关键字
-
LIKE配合通配符匹配整个列的值,REGEXP匹配列中的部分数据
-
查询姓名中包含“大”字的学生:SELECT * FROM student WHERE sname REGEXP'大';
-
查询姓名中包含“大海”字或者“大宝”字的学生:SELECT * FROM student WHERE sname REGEXP"大海|大宝";
-
查询课程名称包含英文字母的课程:SELECT * FROM course WHERE cname REGEXP'[a-zA-Z]';
-
查询课程名称包含数字的课程:SELECT * FROM course WHERE cname REGEXP ‘[0-9]’;
-
查询课程名称包含7个以上连续英文字母的课程:SELECT * FROM course WHERE cname REGEXP ‘[a-zA-Z][7]’;
-
查询课程名以“数”开头的课程:SELECT * FROM course WHERE cname REGEXP ‘^数’;
-
查询课程名以“数”结尾的课程:SELECT * FROM course WHERE cname REGEXP ‘数$’
-
-
创建计算字段
-
存储在数据库表中的基础数据一般或者有可能不是所需的最终格式,那么可以检索出相关经过转换、计算或者格式化的数据,这就是计算字段
-
拼接:Concat
-
字段与字段之间的拼接,如学号拼接姓名:SELECT Concat(sno,sname)FROM student;
-
字符与字段拼接,如姓名前加上姓名:SELECT Concat(‘姓名:’sname)FROM student;
-
-
使用别名:AS关键字
-
字段与字段拼接,如:学号拼接姓名:SELECT Concat(sno,sname)AS 学号姓名FROM student;
-
AS关键字可省略:SELECT Concat(sno,sname)学号姓名 FROM student;
-
-
算术运算:+-*/
-
查询学生学号、姓名及出生年信息:SELECT sno.sname,2020-sage AS 出生年 FROM student;
-
查询学生学号、姓名以及出生年信息:SELECT sno,sname,YEAR(NOW())-sage AS 出生年 FROM student;
-
-
-
使用函数
-
文本处理函数
-
SELECT cname,UPPER(cname)AS大写,LOWER(canme)AS小写,LENGTH(canme)AS长度,LEFT(canme,1)AS左起第一位,RIGYHT(canme)AS右起第一位,SUBSTRING(cname,2,3)AS从第二位开始取到第三位,LTRIM(canme)AS去左空格,RTRIM(cname)AS去右空格 FROM course;
-
-
日期和时间处理函数
-
返回当前日期和时间:SELECT NOW();
-
返回当前日期:SELECT CURDATE();
-
返回当前时间:SELECT CURTIME();
-
返回一个日期的年份部分:SELECT YEAR(NOW());
-
-
数值处理函数
-
绝对值:SELECT ABS(-5)
-
平方根:SELECT SQRT(9)
-
-
-
聚集函数
-
将表中的数据做一些汇总,得到汇总之后的结果而不需要将表中原始数据检索出来:借助聚集函数可以完成
-
常见聚合函数
-
COUNT() 计数
-
确定行的数码或符合特定条件行的数目
-
查询总共有多少学生:SELECT COUNT(*) AS 学生总数 FROM student;
-
SELECT COUNT(sno) AS学生总数 FROM student;
-
-
查询总共有多少男学生:SELECT COUNT(sno) 男生总数 FROM student WHERE ssex="男";
-
查询选课记录条数:SELECT COUNT(*) AS 选课记录数 FROM sc;
-
查询已有成绩的选课记录条数:SELECT COUNT(score) AS 有成绩的选课记录 FROM sc;
-
NULL值不参与运算
-
-
查询选课记录条数:SELECT COUNT(sno) AS 选课记录数 FROM sc;——一般选择非空的字段,如主键或主属性
-
-
SUM() 汇总
-
用于返回指定列值的和
-
查询课程表中索引课程的学分总和:SELECT SUM(ccredit) AS 学分总数 FROM course;
-
-
AVG() 平均值
-
返回特点列值的平均值
-
查询所有学生的平均值:SELECT AVG(SAGE) AS 平均年龄 FROM student;
-
查询课程号为02的课程的平均成绩:SELECT AVG(score) AS 学分总数 FROM sc WHERE cno='02';
-
-
MAX() 最大值
-
返回列中的最大值
-
所有选课记录中的最高成绩:SELECT MAX(score) AS 最高成绩 FROM sc;
-
-
MIN() 最小值
-
返回列中的最小值
-
所有选课记录表中的最低成绩:SELECT MIN(score) AS最低成绩 FROM sc;
-
-
-
DISTINCT 关键字在函数中的作用
-
查询已选课人数:SELECT COUNT(sno) AS 已选课人数 FROM sc;
-
查询已选课人数:SELECT COUNT(DISTINCT sno) AS 已选课人数 FROM sc;
-
-
说明:SUM()、AVG()仅对数值类型列值计算,MAX()、MIN()可针对任意类型的列
-
组合使用
-
-
分组数据:GROUP BY
-
查询各个学生的平均分:SELECT sno,AVG(score) AS 平均分 FROM sc GROUP BY sno;
-
查询各课号及相应的选课人数:SELECT cno.COUNT(sno) 人数 FROM sc GROUP BY cno;
-
已选课学生的选课门数、最高分、最低分、平均分、总分:
-
SELECT sno,COUNT(sno) 选课门数, AVG(score) 平均分,MAX(score)最高分,MIN(score)最低分,SUM(score)总分 FROM sc GROUP BY sno;
-
-
WHTH ROLLUP:对分组计算的结果进行汇总级别的计算
-
分组过滤:HAVING 对分组计算出的结果进行过滤
-
统计相同年龄且大于1的字段:SELECT sc,COUNT(*) 人数 FROM student GROUP BY sage HAVING COUNT(*) >1;
-
-
-
子查询,把一个查询嵌入到另外一个查询中
-
不相关子查询:作为查询条件,把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句中
-
查询分数最高的那一位学生的学号
-
查询已选课学生的学号和i姓名
-
查询成绩平均分在80分以上的学生学号,姓名
-
查询选修了‘数学’和‘信息系统’课程的学生
-
-
相关子查询:根据一个查询的结果计算另一个查询结果,作为计算字段使用子查询
-
-
联结表(多表查询)
-
-
DCL:管理用户,授权及事物
-
-
数据库完整性
-
定义:数据库完整性(integrity)指数据的正确性和兼容性
-
分类
-
实体完整性
-
主键约束PRIMARY KEY :限定字段非空且唯一
-
关于键的相关术语
-
超键/超码(super key):在关系中某一属性住能唯一表似乎的一个元组的成该属性组为超键
-
候选键/候选码(candidate key):当超键中不含有多余属性是成为候选键
-
候选键中的属性称之为主属性,不包含在任何候选键中的属性被称为非主属性
-
-
主键/主码(primary key):用户根据需要选定多个候选键中额一个来作为主键
-
外键/外码(foreign key):如果某属性组不是关系R1的码,而在另一个关系R2中是主键则该属性集是关系模式R1的外键,其参照于R2中的主键
-
码:候选键/候选码、主键/主码简称为码
-
举例:有如下关系:
-
学生(学号,姓名,性别,身份证号,专业号,年龄)
-
专业(专业号,专业名)
-
-
-
在创建表时,添加主键约束
-
创建完表之后,添加主键
-
ALTER TABLE student MODIFY sno CHAR(9) PROMARY KEY;——针对列声明
-
ALTER TABLE student ADD PRIMARY KEY(sno);——针对表声明
-
ALTER TABLE sc ADD PRIMARY KEY(sno,cno);
-
-
删除主键
-
ALTER TABLE student DEOP PRIMARY KEY;
-
-
-
参数完整性
-
外键约束 FOREIGN KEY:保证不引用不存在的数据
-
MySQl存储引擎
-
在创建表时,添加外键
-
创建表之后,添加外键
-
删除外键
-
父表中更新、删除数据是外键的应对
-
-
用户自定义完整性
-
非空约束 NOT NULL :限定字段内容不能为空值
-
创建表时添加非空字段
-
格式为:字段名 类型声明 NOT NUll
-
CREATER TABLE IF NOT EXUSTS student(......sname VARCHAR(10) NOT NULL,......);
-
-
创建表完之后,添加非空约束
-
ALTER TABLE student MODIFY sname VARCHAR(10) NOT NULL;
-
-
删除非空约束
-
-
唯一约束 UNIQUE:限定字段值不能有重复(但允许为NULL)
-
创建表是添加的唯一约束
-
格式为:字段名 类型声明 UNIQUE
-
CREATER TABLE IF NOT EXUSTS student(......sname VARCHAR(10) UNIQUE,......);
-
-
创建表后,添加唯一约束
-
ALTER TABLE student MODIFY sname VARCHAR(10) UNIQUE;
-
ALTER TABLE student ADD CONSTRAINT sname UNIQUE(sname);——sname别名可自定义
-
-
删除唯一约束
-
ALTER TABLE student DROP INDEX sname;——通过查看表创建语句查看唯一约束名称
-
SHOW CREATER TABLE stu
-
-
-
-
默认值约束DEFAILT:给字段设定一个默认值
-
检查约束CHECK(MySQL不支持)
-
自动增长AUTO_INCREMENT:实现数值的自动增长
-
-
-