DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。
DB:数据库(Database)
SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。
如果把数据库比作盘子,那数据就是盘子里的菜,SQL则是你的筷子。
数据库类型:数据库经过几十年的发展,出现了多种类型。目前最常见的数据库模型主要是:关系型数据库和(noSQL)非关系型数据库。
MySQL:其中的一款关系型数据库管理系统
关系型数据库模型是将复杂的数据结构用较为简单的二元关系(二维表)来表示,如图所示。在该类型数据库中,对数据的操作基本上都建立在一个或多个表格上,我们可以采用结构化查询语言(SQL)对数据库进行操作。关系型数据库是目前主流的数据库技术,其中具有代表性的数据库管理系统有:Oracle、DB2、SQL Server、MySQL等。
非关系型数据库:
MySQL数据库最初是由瑞典MySQL AB公司开发,2008年1月16号被Sun公司收购。2009年,SUN又被Oracle收购。MySQL是目前IT行业最流行的开放源代码的数据库管理系统,同时它也是一个支持多线程高并发多用户的关系型数据库管理系统。MySQL之所以受到业界人士的青睐,主要是因为其具有以下几方面优点:
MySQL最强大的优势之一在于它是一个开放源代码的数据库管理系统。开源的特点是给予了用户根据自己需要修改DBMS的自由。MySQL采用了General Public License,这意味着授予用户阅读、修改和优化源代码的权利,这样即使是免费版的MySQL的功能也足够强大,这也是为什么MySQL越来越受欢迎的主要原因。
MySQL可以在不同的操作系统下运行,简单地说,MySQL可以支持Windows系统、UNIX系统、Linux系统等多种操作系统平台。这意味着在一个操作系统中实现的应用程序可以很方便地移植到其他的操作系统下。
MySQL的核心程序完全采用多线程编程,这些线程都是轻量级的进程,它在灵活地为用户提供服务的同时,又不会占用过多的系统资源。因此MySQL能够更快速、高效的处理数据。
MySQL分为社区版和企业版,社区版是完全免费的,而企业版是收费的。即使在开发中需要用到一些付费的附加功能,价格相对于昂贵的Oracle、DB2等也是有很大优势的。其实免费的社区版也支持多种数据类型和正规的SQL查询语言,能够对数据进行各种查询、增加、删除、修改等操作,所以一般情况下社区版就可以满足开发需求了,而对数据库可靠性要求比较高的企业可以选择企业版。
见《MySQL5.7安装文档.md》
“我的电脑/计算机”–>右键–>“管理”–>“服务”–>启动和关闭MySQL服务
“开始菜单”–>“控制面板”–>“管理工具”–>“服务”–>启动和关闭MySQL
“任务管理器”–>“服务”–>启动和关闭MySQL
或者
命令行(使用命令行的前提需要配置mysql的环境变量)
1、命令行客户端:
如果访问本机,-h localhost可以省略
如果端口号没有修改,-P 3306可以省略
除了-p与密码之间不要空格外,其他的-h,-P,-u与后面的参数值之间可以有空格
想要连接成功,必须保证服务开启的
2、其他客户端,例如:可视化工具Navicat或SQLyog等
int(M),必须和unsigned zerofill一起使用才有意义
double(M,D):表示最长为M位,其中小数点后D位
例如:double(5,2)表示的数据范围[-999.99,999.99],如果超过这个范围会报错。
decimal(M,D):表示最长为M位,其中小数点后D位
字节范围是:1-8,值范围是:bit(1)~bit(64),默认bit(1) 将传入的数值转为二进制存入
用来存储二进制数。对于位字段,直接使用select命令将不会看到结果。可以使用bit()函数进行插入。插入bit类型字段时,使用bit()函数转为二进制值再插入,使用bin()函数进行读取。
timestamp和datetime的区别:
MySQL中提供了多种对字符数据的存储类型,不同的版本可能有所差异。常见的有:
char,varchar,xxtext,binary,varbinary,xxblob,enum,set等等
char如果没有指定宽度,默认为1个字符
varchar(M),必须指定宽度
(1)mysql的sql语法不区分大小写
MySQL的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。
_ci(大小写不敏感),_cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关,区分大小写)
(2)命名时:尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号
(3)建议不要使用mysql的关键字等来作为表名、字段名等,如果不小心使用,请在SQL语句中使用`(飘号)引起来
(4)数据库和表名、字段名等对象名中间不要包含空格
(5)同一个mysql软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名
(6)标点符号:
必须成对
必须英文状态下半角输入方式
字符串和日期类型可以使用单引号’’
列的别名可以使用双引号"",给表名取别名不要使用双引号。取别名时as可以省略
如果列的别名没有包含空格,可以省略双引号,如果有空格双引号不能省略。
(7)SQL脚本中如何加注释
单行注释:#注释内容
单行注释:–空格注释内容 其中–后面的空格必须有
多行注释:/* 注释内容 */
DDL (Data Definition Language) :数据定义语言,定义库,表结构等,包括create,drop,alter等
DML (Data Manipulation Language) :数据操作语言,增删改查数据,包括insert,delete,update,select等
DQL(Data query Language):数据查询语言 select
DCL(Data Control Language) :数据控制语言,权限,事务等管理。
1、查看所有数据库
2、指定使用某个数据库
3、创建数据库
4、删除数据库
5、查看某个库下的所有表格
6、创建表格
7、删除表格
8、查看某个表结构
9、增加一列
10、删除一列
11、修改列数据类型
12、修改列名
13、修改列的位置
14、修改表名称
1、添加数据
2、修改数据
如果没有加where条件,表示修改所有行,这个字段的值
3、删除数据
如果没有where条件,表示删除整张表的数据;
用delete删除整张表和用truncate删除整张表的数据的区别?
(1)truncate速度快
(2)truncate无法回滚
truncate因为底层是把表drop掉,然后新建了一张空表。
delete因为底层是一行一行删数据。
4、简单查询数据
使用distinct可以对查询结果进行去重
mysql5.5
例如:
mysql5.7版
本机操作可以省略主机名和端口号
不要再写–database
例如:
1、算术运算符
2、比较运算符
3、逻辑运算符(建议用单词,可读性来说)
4、范围
5、模糊查询和正则匹配(只针对字符串类型,日期类型)
6、位运算符(很少使用)
7、特殊的null值处理
约束是用来对数据业务规则和数据完整性进行实施、维护。约束的作用范围仅限在当前数据库,约束可以被当做数据库对象来处理,它们具有名称和关联模式,是逻辑约束,不会因为设置约束而额外占用空间。
1、数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。
数据的完整性要从以下四个方面考虑:
2、根据约束的特点,分为几种:
3、约束(CONSTRAINTS)与索引(INDEX)
索引是一个单独、物理的存储在数据页上的数据库结构,它是表中一列或若干列值的集合和相应的指向表中数据值的物理标识数据页的逻辑指针清单(类似于新华字典的目录索引页)。索引的存在会增加数据库的存储空间,也会使插入、修改数据的时间开销变多(因为插入和修改数据时,索引也要随之变动),但是可以大大提高查询速度。因此应该在键列、或其他经常要查询、排序、按范围查找的列上建立索引,而对于在查询中很少使用和参考的列、修改非常频繁的列,值很少的列(例如性别只有男和女)等列上不应该创建索引。
Mysql会在主键、唯一键、外键列上自动创建索引,其他列需要建立索引的话,需要手动创建。
其中主键删除,对应的索引也会删除
删除唯一键的方式是通过删除对应的索引来实现的
删除外键,外键列上的索引还在,如果需要删除,需要单独删除索引
主键分为单列主键和复合主键:
主键的特点:(1)唯一并且非空(2)一个表只能有一个主键约束(3)主键约束名就叫做PRIMARY(4)创建主键会自动创建对应的索引,同样删除主键对应的索引也会删除。
(1)如何在建表时指定主键约束
(2)如何在建表后指定主键约束
(3)如何删除主键约束
(1)唯一键约束特点
(2)如何在建表时指定唯一键约束
(3)如何在建表后增加唯一键约束
(4)如何删除唯一键约束
NOT NULL 非空约束,规定某个字段不能为空
(1)如何在建表时给某个字段指定非空约束
(2)如何在建表后指定某个字段非空
(3)如何在建表后取消某个字段非空
(1)如何在建表时给某个字段指定默认约束
(2)如何在建表后指定某个字段的默认值约束
(3)如何在建表后取消某个字段的默认值约束
检查约束,mysql暂不支持
(1)关于自增长auto_increment:
(2)如何在建表时指定自增长列
(3)如何在建表后指定自增长列
(4)如何删除自增约束
外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。
外键是指表中某个字段的值依赖于另一张表中某个字段的值,而***被依赖的字段必须具有主键约束或者唯一约束***。被依赖的表我们通常称之为父表或者主表,设置外键约束的表称为子表或者从表。
举个例子:如果想要表示学生和班级的关系,首先要有学生表和班级表两张表,然后学生表中有个字段为stu_clazz(该字段表示学生所在的班级),而该字段的取值范围由班级表中的主键cla_no字段(该字段表示班级编号)的取值决定。那么班级表为主表,学生表为从表,且stu_clazz字段是学生表的外键。通过stu_clazz字段就建立了学生表和班级表的关系。
(1)外键特点
(2)要求
(3)约束关系:约束是针对双方的
(4)5个约束等级
如果没有指定等级,就相当于Restrict方式
(5)如何在建表时指定外键约束
(6)如何在建表后指定外键约束
(7)如何删除外键约束
1、如果某列有自增约束,怎么添加该字段的值
添加数据时,对于自增列
2、如果某列有默认值约束,怎么添加、修改该字段的值
添加数据时,对于有默认值列
修改数据
两种SQL函数
函数
用法
CONCAT(S1,S2,…,Sn)
连接S1,S2,…,Sn为一个字符串
CONCAT_WS(s, S1,S2,…,Sn)
同CONCAT(s1,s2,…)函数,但是每个字符串之间要加上s
CHAR_LENGTH(s)
返回字符串s的字符数
LENGTH(s)
返回字符串s的字节数,和字符集有关
INSERT(str, index , len, instr)
将字符串str从第index位置开始,len个字符长的子串替换为字符串instr
UPPER(s) 或 UCASE(s)
将字符串s的所有字母转成大写字母
LOWER(s) 或LCASE(s)
将字符串s的所有字母转成小写字母
LEFT(s,n)
返回字符串s最左边的n个字符
RIGHT(s,n)
返回字符串s最右边的n个字符
LPAD(str, len, pad)
用字符串pad对str最左边进行填充,直到str的长度为len个字符
RPAD(str ,len, pad)
用字符串pad对str最右边进行填充,直到str的长度为len个字符
LTRIM(s)
去掉字符串s左侧的空格
RTRIM(s)
去掉字符串s右侧的空格
TRIM(s)
去掉字符串s开始与结尾的空格
TRIM(【BOTH 】s1 FROM s)
去掉字符串s开始与结尾的s1
TRIM(【LEADING】s1 FROM s)
去掉字符串s开始处的s1
TRIM(【TRAILING】s1 FROM s)
去掉字符串s结尾处的s1
REPEAT(str, n)
返回str重复n次的结果
REPLACE(str, a, b)
用字符串b替换字符串str中所有出现的字符串a
STRCMP(s1,s2)
比较字符串s1,s2
SUBSTRING(s,index,len)
返回从字符串s的index位置其len个字符
函数
结果
LOWER(‘SQL Course’)
sql course
UPPER(‘SQL Course’)
SQL COURSE
这类函数改变字符的大小写。
函数
结果
CONCAT(‘Hello’,‘World’)
HelloWorld
SUBSTR(‘HelloWorld’,1,5)
Hello
LENGTH(‘HelloWorld’)
10
INSTR(‘HelloWorld’,‘W’)
LPAD(salary,10,’*’)
*****24000
RPAD(salary,10, ‘*’)
24000*****
TRIM(‘H’ FROM ‘HelloWorld’)
elloWorld
REPLACE(‘abcd’,‘b’,‘m’)
amcd
函数
用法
ABS(x)
返回x的绝对值
CEIL(x)
返回大于x的最小整数值
FLOOR(x)
返回小于x的最大整数值
MOD(x,y)
返回x/y的模
RAND()
返回0~1的随机值
ROUND(x,y)
返回参数x的四舍五入的有y位的小数的值
TRUNCATE(x,y)
返回数字x截断为y位小数的结果
SQRT(x)
返回x的平方根
POW(x,y)
返回x的y次方
函数
用法
CURDATE() 或 CURRENT_DATE()
返回当前日期
CURTIME() 或 CURRENT_TIME()
NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() / LOCALTIMESTAMP()
YEAR(date) / MONTH(date) / DAY(date) / HOUR(time) / MINUTE(time) / SECOND(time)
WEEK(date) / WEEKOFYEAR(date)
返回一年中的第几周
DAYOFWEEK()
返回周几,注意:周日是1,周一是2,。。。周六是7
WEEKDAY(date)
返回周几,注意,周1是0,周2是1,。。。周日是6
DAYNAME(date)
返回星期:MONDAY,TUESDAY…SUNDAY
MONTHNAME(date)
返回月份:January,。。。。。
DATEDIFF(date1,date2) / TIMEDIFF(time1, time2)
DATE_ADD(datetime, INTERVAL expr type)
DATE_FORMAT(datetime ,fmt)
按照字符串fmt格式化日期datetime值
STR_TO_DATE(str, fmt)
按照字符串fmt对str进行解析,解析为一个日期
其中:
(1)DATE_ADD(datetime,INTERVAL expr type)
表达式类型:
参数类型
参数类型
YEAR
YEAR_MONTH
MONTH
DAY_HOUR
DAY
DAY_MINUTE
HOUR
DAY_SECOND
MINUTE
HOUR_MINUTE
SECOND
HOUR_SECOND
MINUTE_SECOND
举例:
(2)DATE_FORMAT(datetime,fmt) 和 STR_TO_DATE(str, fmt)
格式符
说明
格式符
说明
%Y
4位数字表示年份
%y
表示两位数字表示年份
%M
月名表示月份(January,…)
%m
两位数字表示月份(01,02,03。。。)
%b
缩写的月名(Jan.,Feb.,…)
%c
数字表示月份(1,2,3,…)
%D
英文后缀表示月中的天数(1st,2nd,3rd,…)
%d
两位数字表示月中的天数(01,02…)
%e
数字形式表示月中的天数(1,2,3,4,5…)
%H
两位数字表示小数,24小时制(01,02…)
%h和%I
两位数字表示小时,12小时制(01,02…)
%k
数字形式的小时,24小时制(1,2,3)
%l
数字形式表示小时,12小时制(1,2,3,4…)
%i
两位数字表示分钟(00,01,02)
%S和%s
两位数字表示秒(00,01,02…)
%W
一周中的星期名称(Sunday…)
%a
一周中的星期缩写(Sun.,Mon.,Tues.,…)
%w
以数字表示周中的天数(0=Sunday,1=Monday…)
%j
以3位数字表示年中的天数(001,002…)
%U
以数字表示年中的第几周,(1,2,3。。)其中Sunday为周中第一天
%u
以数字表示年中的第几周,(1,2,3。。)其中Monday为周中第一天
%T
24小时制
%r
12小时制
%p
AM或PM
%%
表示%
函数
用法
IF(value,t ,f)
如果value是真,返回t,否则返回f
IFNULL(value1, value2)
如果value1不为空,返回value1,否则返回value2
CASE WHEN 条件1 THEN result1 WHEN 条件2 THEN result2 … [ELSE resultn] END
相当于Java的if…else if…else…
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 … [ELSE 值n] END
相当于Java的switch…case…
函数
用法
database()
返回当前数据库名
version()
返回当前数据库版本
user()
password(str)
返回字符串str的加密版本,41位长的字符串
md5(str)
返回字符串str的md5值,也是一种加密方式
对一组数据进行运算,针对一组数据(多行记录)只返回一个结果,也称分组函数。
可以对数值型数据使用AVG 和 SUM 函数。
可以对任意数据类型的数据使用 MIN 和 MAX 函数。
COUNT(*)count(1返回表中记录总数,适用于任意数据类型。
•COUNT(expr) 返回expr不为空的记录总数。
(1)A∩B
(2)A
(3)A - A∩B
(4)B
(5)B - A∩B
(6)A ∪ B
(7)A∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B)
(1)内连接
(2)外连接:左外连接、右外连接、全外连接(mysql使用union代替全外连接)
代码示例:
代码示例:
代码示例:
代码示例:
两个关联查询的表是同一张表,通过取别名的方式来虚拟成两张表
代码示例:
(1)from:从哪些表中筛选
(2)on:关联多表查询时,去除笛卡尔积
(3)where:从表中筛选的条件
(4)group by:分组依据
(5)having:在统计结果中再次筛选
(6)order by:排序
(7)limit:分页
必须按照(1)-(7)的顺序【编写】子句。
可以使用GROUP BY子句将表中的数据分成若干组
明确:WHERE一定放在FROM后面GROUP BY 前面
在SELECT列表中所有未包含在分组函数中的列都应该包含在 GROUP BY子句中
包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
使用多个列分组
having与where的区别?
(1)where是从表中筛选的条件,而having是分组(统计)结果中再次筛选
(2)where后面不能加“分组/聚合函数”,而having后面可以跟分组函数
order by:
降序:desc
升序:要么默认,要么加asc
limit:
limit m,n
m = (第几页 - 1)*每页的数量
n = 每页的数量
代码示例:
嵌套在另一个查询中的查询,根据位置不同,分为:where型,from型,exists型。注意:不管子查询在哪里,子查询必须使用()括起来。
①子查询是单值结果,那么可以对其使用(=,>等比较运算符)
②子查询是多值结果,那么可对其使用(【not】in(子查询结果),或 >all(子查询结果),或>=all(子查询结果),<all(子查询结果),<=all(子查询结果),或 >any(子查询结果),或>=any(子查询结果),<any(子查询结果),<=any(子查询结果))
子查询的结果是多行多列的结果,类似于一张表格。
必须给子查询取别名,即临时表名,表的别名不要加“”和空格。
1、事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
例如转账操作:A账户要转账给B账户,那么A账户上减少的钱数和B账户上增加的钱数必须一致,也就是说A账户的转出操作和B账户的转入操作要么全部执行,要么全不执行;如果其中一个操作出现异常而没有执行的话,就会导致账户A和账户B的转入转出金额不一致的情况,为而事实上这种情况是不允许发生的,所以为了防止这种情况的发生,需要使用事务处理。
2、事务的ACID属性:
(1)原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
(2)一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
(3)隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
(4)持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
1、mysql默认是自动提交,执行一句就提交一句。
即默认情况下,每一条sql都是一个独立的sql。
2、我想要手动提交事务:
(1)set autocommit=false;
接下来所有语句都必须手动提交,否则就不会永久生效
(2)start transaction;
commit; 或 rollback; 此次事务结束 想要事务保证数据安全需要再次进行开启
3、注意:
事务的回滚只对DML语句有效,对于DDL语句无效。
对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
不可重复度和幻读区别:
不可重复读的重点是修改,幻读的重点在于新增或者删除。
解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导致A再读自己的工资时工资变为 2000;这就是不可重复读。
例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次读取时查到的记录就变为了5条,这样就导致了幻读
数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题。**一个事务与其他事务隔离的程度称为隔离级别。**数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱。
数据库提供的 4 种事务隔离级别:
隔离级别
描述
read-uncommitted
允许A事务读取其他事务未提交和已提交的数据。会出现***脏读、不可重复读、幻读***问题
read-committed
只允许A事务读取其他事务已提交的数据。可以避免脏读,但仍然会出现***不可重复读、幻读***问题
repeatable-read
确保事务可以多次从一个字段中读取相同的值。在这个事务持续期间,禁止其他事务对这个字段进行更新。可以避免脏读和不可重复读。但是幻读问题仍然存在。
serializable
确保事务可以从一个表中读取相同的行,相同的记录。在这个事务持续期间,禁止其他事务对该表执行插入、更新、删除操作。所有并发问题都可以避免,但性能十分低下。
注意:这里的隔离级别中间是减号,不是下划线。
(1)IP+用户名作为身份验证
例如:
建立用户时,用于身份验证的IP地址,是连接你的服务的客户端的IP地址
例如:root@192.168.11.56,表示客户端在192.168.11.56的机器上可以访问你的mysql服务
而这个客户端,要连接你的服务时,-h后面的主机的IP地址是,服务器所在的机器的IP地址。
例如:mysql服务在192.168.11.11机器上,客户端在192.168.11.56上,那么客户端可以用root@192.168.11.56或root@%,连接时填写mysql -h192.168.11.11 -u root -p密码
(2)密码
(1)全局
(2)数据库
(3)表
(4)字段
依次校验权限,如果前面通过了,后面就不校验了:
全局 > 数据库 > 表 > 字段
注意:root@localhost,这个用户始终保留所有的全局权限。
对应的语句:
对应语句:
例如:
收回权限:
• 必须保证数据库设计的合理性
数据库设计关系整个系统的架构,关系到后续开发效率和运行效率
数据库的设计主要包含了设计表结构和表之间的联系
• 如何是合理数据库
结构合理
冗余较小
尽量避免插入删除修改异常
• 如何才能保证数据库设计水平
遵循一定的规则
在关系型数据库中这种规则就称为***范式***
• 什么是范式(NF= NormalForm)
范式是符合某一种设计要求的总结。
要想设计一个结构合理的关系型数据库,必须满足一定的范式。
• 第一范式
• 第二范式
• 第三范式
• 各个范式是依次嵌套包含的
• 范式越高,设计质量越高,在现实设计中也越难实现
• 一般数据库设计,只要达到第三范式,即可避免异常的出现
• 要求
• 示例
• 要求
• 示例
• 解决
学生表 选课表 课程表
• 要求
• 示例1:学生班级表
学号(主键)
学生姓名
班级编号
班级名称
班级信息
023145
张三
987654
3班
特招班
023146
李四
987654
3班
特招班
023147
王五
987655
4班
普通班
023258
赵六
987654
3班
特招班
完善之后的方案:
学号(主键)
学生姓名
班级编号
023145
张三
987654
023146
李四
987654
023147
王五
987655
023258
赵六
987654
班级编号(主键)
班级名称
班级信息
987654
3班
特招班
987655
4班
普通班
• 示例2:订单明细表
编号(主键)
图书id
图书名称
价格
作者
出版社
出版日期
数量
023145
精通Java
60.00
张三
清华出版社
2007
023146
Oracle
65.00
李四
机械出版社
2009
023147
JSP
87
王五
电子出版社
2014
023258
精通Java
60.00
张三
清华出版社
2007
023259
Oracle
65.00
李四
机械出版社
2009
完善之后的方案:分割成图书表和订单表两种表
图书id
图书名称
价格
作者
出版社
出版日期
精通Java
60.00
张三
清华出版社
2007
Oracle
65.00
李四
机械出版社
2009
JSP
87
王五
电子出版社
2014
Struts2
56
赵六
清华出版社
2005
编号(主键)
图书id
数量
023145
023146
023147
023258
023259
• 优点
• 缺点
• 示例:
比如经常购物车条目的中除了条目编号,商品编号,商品数量外,可以增加经常使用的商品名称,商品价格等
图书表
图书id
图书名称
价格
作者
出版社
出版日期
精通Java
60
张三
清华出版社
2007
Oracle宝典
65
李四
机械出版社
2009
JSP
87
王五
电子出版社
2014
Struts2
56
赵六
清华出版社
2005
编号(主键)
图书id
图书名称
价格
数量
023145
精通Java
60
023146
Oracle宝典
65
023147
JSP
87
023258
精通Java
60
• 范式是指导数据设计的规范化理论,可以保证数据库设计质量
• 第一范式:字段不能再分
• 第二范式:不存在局部依赖
• 第三范式:不含传递依赖(间接依赖)
• 使用范式可以减少冗余,但是会降低性能
• 特定表的的设计可以违反第三范式,增加冗余提高性能
查看编码命令
原因:按照刚才的配置,服务器端认为你的客户端的字符集是utf-8,而实际上你的客户端的字符集是GBK。
查看所有字符集:SHOW VARIABLES LIKE ‘character_set_%’;
解决方案,设置当前连接的客户端字符集 “SET NAMES GBK;”
set names gbk;是为了告诉服务器,客户端用的GBK编码,防止乱码。
有的时候,这样还不能解决,例如,某些win10操作系统环境下,那么修改命令行的属性-》选项-》勾选使用旧版控制台,然后重启电脑
1:通过任务管理器或者服务管理,关掉mysqld(服务进程)
2:通过命令行+特殊参数开启mysqld
mysql5.5
mysql5.7版
此处路径以你自己的世界路径为准
3:此时,mysqld服务进程已经打开,并且,不需要权限检查.
4:mysql -uroot 无密码登陆服务器.另启动一个客户端进行
5: 修改权限表
(1) use mysql;
(2)
mysql5.5版
mysql5.7版
(3)flush privileges;
6:通过任务管理器,关掉mysqld服务进程.
7:再次通过服务管理,打mysql服务。
8:即可用修改后的新密码登陆.
关于SQL的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。
_ci(大小写不敏感),_cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关)
(1)查看所有字符集和校对规则
(2)查看GBK和UTF-8字符集的校对规则
show collation like ‘gbk%’;
show collation like ‘utf8%’;
utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。 utf8_general_ci 校对速度快,但准确度稍差。 utf8_unicode_ci 准确度高,但校对速度稍慢。
如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。一般用utf8_general_ci就够了。
(3)查看服务器的字符集和校对规则
(4)查看和修改某个数据库的字符集和校对规则
修改数据库的字符集和校对规则:
ALTER DATABASE 数据库名称 DEFAULT CHARACTER SET 字符集名称 【COLLATE 校对规则名称】;
例如:
ALTER DATABASE ceshi_db DEFAULT CHARACTER SET utf8 collate utf8_general_ci;
注意:修改了数据库的默认字符集和校对规则后,原来已经创建的表格的字符集和校对规则并不会改变,如果需要,那么需要单独修改。
(5)查看某个表格的字符集和校对规则
查看字符集:show create table users;
如果要查看校对规则:show table status from bookstore like ‘%users%’ ;
修改某个表格的字符集和校对规则:
修改表的默认字符集:
ALTER TABLE 表名称 DEFAULT CHARACTER SET 字符集名称 【COLLATE 校对规则名称】;
把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集:
ALTER TABLE 表名称 CONVERT TO CHARACTER SET 字符集名称 【COLLATE 校对规则名称】;
例如:ALTER TABLE ceshi_table DEFAULT CHARACTER SET gbk collate gbk_chinese_ci;
设置当前连接的客户端字符集 “SET NAMES GBK;”
set names gbk;是为了告诉服务器,客户端用的GBK编码,防止乱码。
[外链图片转存中…(img-UcHQnBCA-1606381608553)]
有的时候,这样还不能解决,例如,某些win10操作系统环境下,那么修改命令行的属性-》选项-》勾选使用旧版控制台,然后重启电脑
[外链图片转存中…(img-c7zXEHVQ-1606381608555)]
1:通过任务管理器或者服务管理,关掉mysqld(服务进程)
2:通过命令行+特殊参数开启mysqld
mysql5.5
mysql5.7版
此处路径以你自己的世界路径为准
3:此时,mysqld服务进程已经打开,并且,不需要权限检查.
4:mysql -uroot 无密码登陆服务器.另启动一个客户端进行
5: 修改权限表
(1) use mysql;
(2)
mysql5.5版
mysql5.7版
(3)flush privileges;
6:通过任务管理器,关掉mysqld服务进程.
7:再次通过服务管理,打mysql服务。
8:即可用修改后的新密码登陆.
关于SQL的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。
_ci(大小写不敏感),_cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关)
(1)查看所有字符集和校对规则
[外链图片转存中…(img-JjD3DY21-1606381608556)]
(2)查看GBK和UTF-8字符集的校对规则
show collation like ‘gbk%’;
[外链图片转存中…(img-r7GfOfNr-1606381608556)]
show collation like ‘utf8%’;
[外链图片转存中…(img-lncm5027-1606381608557)]
utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。 utf8_general_ci 校对速度快,但准确度稍差。 utf8_unicode_ci 准确度高,但校对速度稍慢。
如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。一般用utf8_general_ci就够了。
(3)查看服务器的字符集和校对规则
[外链图片转存中…(img-zcV0wEqx-1606381608558)]
(4)查看和修改某个数据库的字符集和校对规则
[外链图片转存中…(img-DW8nlF8I-1606381608559)]
[外链图片转存中…(img-gZ7yI6Du-1606381608560)]
修改数据库的字符集和校对规则:
ALTER DATABASE 数据库名称 DEFAULT CHARACTER SET 字符集名称 【COLLATE 校对规则名称】;
例如:
ALTER DATABASE ceshi_db DEFAULT CHARACTER SET utf8 collate utf8_general_ci;
[外链图片转存中…(img-yaiDkcNr-1606381608561)]
注意:修改了数据库的默认字符集和校对规则后,原来已经创建的表格的字符集和校对规则并不会改变,如果需要,那么需要单独修改。
(5)查看某个表格的字符集和校对规则
查看字符集:show create table users;
[外链图片转存中…(img-85RfrdXF-1606381608562)]
如果要查看校对规则:show table status from bookstore like ‘%users%’ ;
[外链图片转存中…(img-3PuwuNd7-1606381608563)]
修改某个表格的字符集和校对规则:
修改表的默认字符集:
ALTER TABLE 表名称 DEFAULT CHARACTER SET 字符集名称 【COLLATE 校对规则名称】;
把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集:
ALTER TABLE 表名称 CONVERT TO CHARACTER SET 字符集名称 【COLLATE 校对规则名称】;
例如:ALTER TABLE ceshi_table DEFAULT CHARACTER SET gbk collate gbk_chinese_ci;
在配置DMS进行数据库迁移的过程中,难免会遇到一些源库和目标库的差异性或者表结构的问题。一般出现此类的问题的时候,DMS都会提供相对明确的报错原因以及给出对应的解决方案,来帮助用户快速完成DMS迁移的配置步骤。今天我们主要会带着大家来看下在配置DMS进行数据库迁移的过程中,经常会遇到的几个问题,从而帮助大家提前进行相关问题的规避
一对多关系多个学生对应一个班级,是一对多这种情况我们会把外键列放在多方的表格中一对一关系学生信息表 与 学生详情表是一对一的关系外键在任意一方都可一般把外键放在常用表中多对多关系学生与科目是多对多关系多对多的关系下会用第三张表来记录他们之间的关联
安装MySQLworkbench以及环境配置的详细教程
# DBeaver与MySQL的关系DBeaver是一个强大的数据库管理工具,通过其可视化界面,用户能够以更简便的方式管理数据库。MySQL作为一种流行的开源关系数据库管理系统,DBeaver为MySQL提供了极佳的支持。这篇文章将介绍DBeaver与MySQL的关系,并通过代码示例展示如何使用DBeaver连接和操作MySQL数据库。## DBeaver与MySQL连接在使用DBea
# MySQL与DBeaver的深入探讨在数据库管理领域,MySQL以其开源、高性能和可靠性备受推崇,而DBeaver则是一个跨平台的数据库管理工具,支持多种数据库类型,包括MySQL。本文将介绍如何使用DBeaver连接MySQL,并展示一些基本的操作示例以及涉及的序列图和关系图。## 1. MySQL简介MySQL是一个广泛使用的关系数据库管理系统(RDBMS),使用结构化查询语言
# DB2 与 MySQL DDL 对应关系的实现在开发数据库相关应用时,了解不同数据库间的 DDL(数据定义语言)对应关系是非常重要的。DB2 和 MySQL 是两种常见的关系型数据库,每种数据库都有其独特的 DDL 语法。本文将指导你如何实现 DB2 和 MySQL DDL 的转换过程,让我们一步一步来。## 流程概述下面是实现 DB2 和 MySQL DDL 对应关系的基本流程:
02 MySQL介绍一、sql、DB、DBMS分别是什么,它们的关系DB:DataBase(数据库,实际上是在硬盘上以文件的形式存在)DBMS:DataBase Management System(数据库管理系统,常见的有:MySQl,Oracle,DB2,Sybase,SqlServer····)SQL:结构发查询语言,是一门标准的语言。标准的sql适合所有的数据库产品。sql属于高级语言,编写
Oracle、DB2、MSSQL、MySQL:这4个主流数据库,我都用过并开发过项目。今天也看了一下Oracle的OCA认证考试指南(1Z0-051),本来想考这个认证,可是实在贵了点,而且OCA要考2门,管理我不是很精通,要考试还得花时间。所以写下本文,做个总结,不去考OCA了。1 数据库选择 大项目 选Oracle DB2 中项目MSSQL 小项目 MySQL2 易用性 MSSQL >
Dbunit 【概念】 dbunit是一个基于junit扩展的数据库测试框架。它提供了大量的类对与数据库相关的操作进行了抽象和封装,虽然在80%的情况,你只需使用它极少的api。它通过使用用户自定义的数据集以及相关操作使数据库处于一种可知的状态,从而使得测试自动化、可重复和相对独立。虽然不用dbunit也可以达到这种目的,但是我们必须为此付出代价(编写大量代码,测试及维护),既然有了这么优秀的
DBeaver连接mysql数据库:点击“数据库”,然后点击第一个“新建连接”; 选择一个数据库类型,点击就好。第一次连接数据库可能要下载驱动。傻瓜式操作,点击就好。通过DBeaver工具链接数据库后,我们就可以通过菜单或者命令功能来实现我们想要的目的。(一)创建数据库 新建数据库,如下图所示:在点击“确定”按钮后,可能会遇到失败,此时,我们可以直接通过sql语句来实现,在SQL控制台中输入CRE
一、 DBeaver介绍dbeaver是免费和开源(GPL)为开发人员和数据库管理员通用数据库工具。DBeaver 是一个通用的数据库管理工具和 SQL 客户端,支持 MySQL, PostgreSQL, Oracle, DB2, MSSQL, Sybase, Mimer, HSQLDB, Derby, 以及其他兼容 JDBC 的数据库。DBeaver 提供一个图形界面用来查看数据库结构、执行SQ
Oracle修改db_name的方法整体操作步骤如下:生成重建空间语句相关的trace,以及生成数据库实例的pfile文件关闭数据库修改参数文件内容执行创建控制文件的语句并启动数据库到mount打开数据库到open状态查看数据库的名称修改db_name过程中涉及到的隐含内容创建控制文件过程中的参数区别redolog损坏的情况下,恢复数据库的方法物理修改数据库文件位置之后,快速的恢复数据库的方法上面
SQL介绍一、SQL是什么?1.1数据库模型1.2主流关系数据库 一、SQL是什么?SQL是结构化查询语言的缩写,用来访问和操作数据库,对数据库进行管理和维护操作。SQL是访问和处理关系数据库的计算机标准语言,换言之,不管使用什么语言(python,C++还是JAVA),只要涉及到操作关系数据库,都必须通过SQL来完成。 数据库作为一款专门管理数据的软件,给用户提供接口来读写数据,大大简化数据的
本文系统讲解了C++面向对象编程中的几个进阶概念:初始化列表、类型转换、静态成员、友元机制、内部类、匿名对象以及对象拷贝优化。重点解析了初始化列表的三种必用场景、explicit关键字的作用、静态成员的使用规范、友元的封装控制、内部类的特性、匿名对象的生命周期,以及编译器对对象拷贝的优化机制。这些概念虽零散但实用,能显著提升代码效率和可读性,建议合理运用这些特性来优化C++程序设计。
题目传送门 题目传送门2 博客传送门 这俩题互为双倍经验,所以我们只讲其中一道。以 P3052 为例。 状压 dp 好题。我第一次做这个题的时候还以为要枚举子集的来着,然后就T了。后来想想其实没这么麻烦的。 (但凡是枚举子集也不能是 18) 原题稍微转换一下,就是让我们开最小数量的电梯,使每个电梯都 ...
讲一下echarts的用法,列举了两个图表,一个是单柱图,一个是多柱图,至于饼状图,只许更改echarts的类型就好了 一、首先是要两个div,用来存放两个图表<div class="div-frm" style="height: 275px; font-family: Microsoft YaHei, Verdana, Arial;"><div id="ba
1.早上吃了昨晚买的糕点和俩鸡蛋,收拾收拾回学校。看见俞奶奶陪姥姥去外面溜达,和姥爷打完招呼回学校实验室。 2.整理了昨天DDPM模型学习过程。中午买了个馅饼肉夹馍坐湖边吃了,挺惬意。下午去做实验,回来跑会儿diffusion代码,在MNIST上敲出来了。不开会了很爽。 3.晚上和师兄们吃饭,吃完饭 ...
大家好,我是煎鱼的朋友草莓。继之前我们在编程语言遭遇的滑铁卢后,经过一段时间的沉淀,今天重新梳理了一下信创现在比较高频见到和允许的组件。希望对大家有所帮助,也便于翻阅。信创是什么信创是一个统称概念,实际是把现有与信息技术相关的行业结合在一起,命名为“信息技术应用创新产业”,简称“信创”。信创包括:基础硬件、基础软件、应用软件、信息安全四大板块。其中,基础硬件主要包括:芯片、服务器/PC、存储等;基