数据库:数据库就是一组经过计算机整理后的数据,存储在一个或多个文件中,而管理这个数据库的软件就称之为数据库管理系统。一般一个数据库系统(Database System)可分为数据库(Database)与数据管理系统(Database Management System,DBMS)两个部分。
DBS:数据库,管理员,数据库管理系统组成
DB:按照数据结构来组织、存储和管理数据的仓库.将数据存在硬盘上
DBA:管理数据库的专业人员
DBMS:指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
作用:既便于数据的集中管理,控制冗余,提高数据的利用率和一致性,又利于应用程序的开发和维护。
分类:
网状结构数据库:美国通用电气公司IDS,以节点形式存储和访问。层次结构数据库:IBM公司IMS定向有序的树状结构实现存储和访问。关系结构数据库:Oracle、DB2、MySQL、SQL Server,以表格(Table)存储,多表间建立关联关系,通过分类、合并、连接、选取等运算实现访问。非关系型数据库:ElastecSearch、MongoDB、Redis,多数使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据。关系型数据库的组成:数据库的表,表与表之间关系,对象
设置MySql编码:C:\ProgramData\MySQL\MySQL Server 5.7修改my.ini中编码:
https://blog.csdn.net/x775229836/article/details/51831853
(Structured Query Language/结构化查询语言)用于访问和处理数据库的标准的计算机语言
组成部分:
DDL(Data Definition Language/数据库的定义语言):对数据库和表作创建,修改和删除操作. DML(Data Definition Language/数据管理语言):对数据库表中数据作增加,修改,删除操作. DQL(Data Query Language/数据查询语言):对数据库表中数据作查询操作. DCL(Data Control Language/数据控制语言):创建用户,给用户授权,撤消权限,备份和还原. TPL(事务控制语言):操作数据库的事务,确保被DML语句影响的表的所有行及时得以更新 CCL(指针控制语言):用于对一个或多个表单独行的操作
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE 子句组成的查询块: SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>
查询的总语法: select 列名1,列名2... from 表名1 [inner/left/right] join 表名2 on 表名1.公共列=表名2.公共列 [where 条件] //边查询边筛选 [group by 列名] //对结果进行分组 [having 条件] //分组后再筛选 [order by 列名 asc/desc] //最后再排序 [limit count1 [,count2]] //限制输出条件或分页在一个查询语句中嵌套另一个查询语句
1.执行顺序:由内到外执行. 2.子查询可以多层嵌套,一般用到二到三层嵌套 3.子查询不能用在limit和order by后面 4.能用子查询解决的问题,也可以用联表查询;能用联表查询的问题,不一定能用子查询解决. 5.如果一个问题既可以子查询也可以联表查询,首选子查询. 6.在查询中,能用精确查询就不要用模糊查询. eg:#子查询:查询所有学生信息->先在班级表中查询对应的班级编号,再根据班级编号查询学生表中信息 select * from t_student where cid=(select cid from t_class where cname='初三一班'); select s.* from t_student s inner join t_class c on s.cid=c.cid where c.cname='初三一班';查询的列名相同,才能用联合查询.
1.UNION合并结果并去重: #查询年龄小于等于18岁所有学生信息,再查询年龄大于15岁所有学生信息,将两个结果合并 select * from t_student where sage<=18 union select * from t_student where sage>15; 2.UNION all合并结果不去重 #查询年龄小于等于18岁所有学生信息,再查询年龄大于15岁所有学生信息,将两个结果合并 select * from t_student where sage<=18 union all select * from t_student where sage>15;数据操纵语言DML主要有三种形式:
插入:INSERT 向表添加一条记录: 语法一:insert into 表名(列名1,列名2...) values(值1,值2...) (推荐) 语法二:insert into 表名 values(值1,值2,值3...); 向表中插入多条记录: 语法:insert into 表名(列名1,列名2...) values(值1,值2...),(值1,值2...),(值1,值2...); 更新:UPDATE 修改表中数据:语法:update 表名 set 列名1=新值1,列名2=新值2...[where 条件] 删除:DELETE 删除表中数据:语法: delete from 表名 [where 条件] 删除表中所有记录: 1.delete from 表名; (delete from t_class;) 只删除表中所有数据,表的结构和标识种子还在,一行一行的删除,所以删除效率最低也是删除最不彻底的 2.TRUNCATE table 表名;(TRUNCATE table t_class;) 删除表中所有数据及标识种子和表的结构,一页一页删除,再创建一个与原表相同结构的表.删除效率最高 3.drop table 表名; (drop table t_class;) 删除表的所有东西,包括结构和标识种子.删除最彻底.数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如: 创建数据库:create database [if not exists] 数据库名 [defalut charset utf-8] 查看数据库的创建:show create database 数据库名 删除数据库:drop database 数据库名 进入数据库中(使用数据库):use 数据库名; 查看当前数据库的所有表:show tables;
创建表: create table 表名( 列名1 数据库类型1 列的特征, 列名2 数据库类型2 列的特征, ... 列名n 数据库类型n 列的特征 ); create table 【数据名.】表名( 字段名1 数据类型 primary key , .... ); 或 create table 【数据名.】表名( 字段名1 数据类型, ...., primary key(字段名1) ); 或 create table 【数据名.】表名( 字段名1 数据类型, 字段名2 数据类型, ...., ); primary key(复合主键字段列表)#如果是复合主键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加primary key 主键约束:primary key 指定主键约束 alter table 表名称 add primary key (主键字段列表); 删除主键约束 alter table 表名称 drop primary key; 建表后增加唯一键约束 alter table表名称 add 【constraint 约束名】 unique 【key】 (字段名列表); #如果没有指定约束名,(字段名列表)中只有一个字段的,默认是该字段名,如果是多个字段的默认是字段名列表的第1个字段名。也可以通过show index from 表名;来查看 删除唯一键约束 ALTER TABLE 表名称 DROP INDEX 唯一性约束名; #注意:如果忘记名称,可以通过“show index from 表名称;”查看 主键的特点: (1)唯一并且非空 (2)一个表只能有一个主键约束 (3)主键约束名就叫做PRIMARY (4)创建主键会自动创建对应的索引,同样删除主键对应的索引也会删除。 注意:主键列 VS 唯一键 相同点:确保列值不重复. 不同点: 主键列不能为空;唯一键可以为空 主键列可以由一列或多列组成,但是唯一键一般都是用来限制一个列. 由多个列组成主键叫复合主键,复合主键列要求组成的列有一个列值不 同就是不同的主键,复合主键要求组成的列的所有列值相同就是重复主键. 唯一键约束:unique key 1)唯一键约束特点 同一个表可以有多个唯一约束。 唯一约束可以是某一个列的值唯一,也可以多个列组合值的唯一。 MySQL会给唯一约束的列上默认创建一个唯一索引。 删除唯一键只能通过删除对应索引的方式删除,删除时需要指定唯一键索引名 2)如何在建表时指定唯一键约束 create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型 unique key, .... ); create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型, 字段名3 数据类型, ...., unique key(复合唯一字段列表)#如果是复合唯一键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加 3)如何在建表后增加唯一键约束 alter table表名称 add 【constraint 约束名】 unique 【key】 (字段名列表); #如果没有指定约束名,(字段名列表)中只有一个字段的,默认是该字段名,如果是多个字段的默认是字段名列表的第1个字段名。也可以通过show index from 表名;来查看 4)如何删除唯一键约束 ALTER TABLE 表名称 DROP INDEX 唯一性约束名; #注意:如果忘记名称,可以通过“show index from 表名称;”查看 外键约束:foreign key 1)外键特点 * 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的 两个字段之间的参照关系。 * 在创建外键约束时,如果不给外键约束名称,默认名不是列名,而是自动产生一个外键名(例如 student_ibfk_1;),也可以指定外键约束名。 * 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是列名,不是外 键的约束名。 * 删除外键时,关于外键列上的普通索引需要单独删除 2)要求 * 在从表上建立外键,而且主表要先存在。 * 一个表可以建立多个外键约束 * 从表的外键列,在主表中引用的只能是键列(主键,唯一键,外键)。 * 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样 3)约束关系:约束是针对双方的 添加了外键约束后,主表的修改和删除受约束 添加了外键约束后,从表的添加和修改受约束 4)5个约束等级 * Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录 * Set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要 注意子表的外键列不能为not null * No action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操 作 * Restrict方式:同no action, 都是立即检查外键约束 * Set default方式(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置 成一个默认的值,但Innodb不能识别 5)如何在建表时指定外键约束 create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型 【unique key】, ...., foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【 #外键只能在所有字段列表后面单独指定 ); create table 【数据名.】表名( 字段名1 数据类型, 字段名2 数据类型, ...., primary key(复合主键字段列表),#如果是复合主键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加primary key unique key(复合唯一字段列表),#如果是复合唯一键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加unique key foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【 #外键只能在所有字段列表后面单独指定 ); 6)如何在建表后指定外键约束 alter table表名称 add 【constraint 约束名】 foreign key (从表字段名) references 主表名(主表被参照字段名) 【on update xx】[on delete xx]; 7)如何删除外键约束 ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名; #查看约束名 SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称'; #删除外键约束不会删除对应的索引,如果需要删除索引,需要用ALTER TABLE 表名称 DROP INDEX 索引名; #查看索引名 show index from 表名称; 非空约束:not null NOT NULL 非空约束,规定某个字段不能为空 1)如何在建表时给某个字段指定非空约束 create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型 【unique key】 【not null】, ...., foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【 #外键只能在所有字段列表后面单独指定 ); create table 【数据名.】表名( 字段名1 数据类型 【not null】, 字段名2 数据类型 【not null】, ...., 建立函数索引 方式一: create index test_id_fbi_idx on test(round(id)); 方式二: alter table tb_products add index idx_product_keyword(tb_web_keyword); 删除: drop index idx_product_keyword on tb_products; 展示: show index from tb_products; primary key(复合主键字段列表),#如果是复合主键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加primary key unique key(复合唯一字段列表),#如果是复合唯一键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加unique key foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【 #外键只能在所有字段列表后面单独指定 ); 2)如何在建表后指定某个字段非空 ALTER TABLE 表名称 MODIFY 字段名 数据类型 NOT NULL 【default 默认值】; #如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失 3)如何在建表后取消某个字段非空 ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】; #如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失 默认值约束:default 1)如何在建表时给某个字段指定默认约束 create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型 【unique key】 【not null】 【default 默认值】, ...., foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【 #外键只能在所有字段列表后面单独指定 ); create table 【数据名.】表名( 字段名1 数据类型 【not null】 【default 默认值】, 字段名2 数据类型 【not null】 【default 默认值】, ...., primary key(复合主键字段列表),#如果是复合主键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加primary key unique key(复合唯一字段列表),#如果是复合唯一键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加unique key foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【 #外键只能在所有字段列表后面单独指定 ); 2)如何在建表后指定某个字段的默认值约束 ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】 【NOT NULL】; #如果该字段原来设置了非空约束,要跟着一起再写一遍,否则非空约束会丢失 3)如何在建表后取消某个字段的默认值约束 ALTER TABLE 表名称 MODIFY 字段名 数据类型 【NOT NULL】; #如果该字段原来设置了非空约束,要跟着一起再写一遍,否则非空约束会丢失 检查约束:check 检查约束,mysql暂不支持 自增约束:auto_increment 1)关于自增长auto_increment: * 一个表最多只能有一个自增长列 * 自增长列必须是键列(主键列,唯一键列,外键列),并且要求非空。 * 自增列必须是整数类型 * InnoDB表的自动增长列可以手动插入,但是插入的值如果是空或者0,则实际插入的将是自动增 长后的值。 2)如何在建表时指定自增长列 create table 【数据名.】表名( 字段名1 数据类型 primary key auto_increment, 字段名2 数据类型 【unique key】 【not null】 【default 默认值】, .... ); 或 create table 【数据名.】表名( 字段名1 数据类型 primary key , 字段名2 数据类型 【unique key not null】 auto_increment, .... ); 3)如何在建表后指定自增长列 alter table 【数据名.】表名 modify 自增字段名 数据类型 auto_increment; 4)如何删除自增约束 alter table 【数据名.】表名 modify 自增字段名 数据类型;数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制 数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
GRANT:授权。
REVOKE:废除数据库中某用户的权限
ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
COMMIT [WORK]:提交。
1.创建用户:create user 用户名 identified by 密码; 2.删除用户:drop user 用户名; 3.给用户授权:grant 权限 on 库名.表名 to 用户名@主机名 identified by 密码; 4.撤消用户权限:revoke 权限 on 库名.表名 from 用户名@主机名 eg:#创建用户--不存在用户,如果用户存在会报错 create user abc IDENTIFIED by '123'; #给用户授权 grant all on db_myschool.* to abc@localhost identified by '123'; #撤消权限 revoke all on db_myschool.t_student from abc@localhost; #删除用户 drop user abc;数据库最重要的就是数据的完整性
完整性:数据的可靠性和准确性.数据完整性:实体完整性,域完整性,引用完整性,自定义完整性.实体完整性:主键约束,唯一约束,标识列. 注意:一般情况下,每张表都要有一个主键.域完整性:数据类型,默认约束,非空,检查约束(check). 注意:MySql5.5之后不支持检查约束引用完整性:外键约束. 外键约束的优点:保护数据的安全性 缺点:效率低 综合外键约束的优缺点:一般不建立外键约束.自定义完整性:规则、存储过程、触发器第一种用sql命令备份:用管理员身份运行cmd->cd MySql安装目录\bin->输入命令: mysqldump -u 用户名 -p 数据库名>文件路径\文件名.sql;
第二种用Navicat备份:在Navicat中选中数据库名->右键->转存为Sql文件->选择文件保存的文件夹->关闭.
第一种用sql命令还原:用管理员身份运行cmd->用sql命令登录MySql数据库->创建 数据库->use 数据库名->用命令还原数据:source 文件路径\文件名.sql;
第二种用Navicat还原:在Navicat中选中链接->创建数据库->选中数据库->右键-> 运行Sql文件->选择之前备份的Sql文件->开始->关闭
数据库的最小的执行单元.由一条到多条Sql语句组成一个逻辑执行单位,事务中Sql语句要么同时执行成功,要么同时执行失败,如果事务中有一条Sql语句执行失败就全部失败.
注意:默认情况,MySql数据库中一条Sql一个事务,自动提交.不想用默认事务,手动开启事务数据库
开启事务 start transaction; 提交事务 commit; 回滚事务 rollback; 设置保存点 savepoint 保存点名 回滚到保存点 rollback [to] 保存点名 eg:#开启手动事务 start TRANSACTION update t_bank set money=money-200 where acount=1; #设置保存点 SAVEPOINT a; update t_bank set money=money+200 where acount=2; #提交事务 commit; #回滚事务 ROLLBACK; #回滚到保存点,记事提交才能生效. ROLLBACK to a;在数据库的事务中不允许出现的现象.但是有的错误不影响Java程序
脏读:一个线程中事务读取另一个线程中事务没有提交数据.(程序不允许)不可重复读:一个线程中事务读到另一个线程中事务刚刚提交修改的数据幻读(虚读):一个线程中事务读取另一个线程中事务刚刚提交的新增的数据安全性越高,执行效率越低,安全性越低,执行效率越高
DEFAULT :这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.串行化的 (serializable) :避免以上所有读问题.Mysql 默认:可重复读 Oracle 默认:读已提交
注意:Oracle数据库默认采用READ COMMITTED隔离级别. MySql数据库默认采用REPEATABLE READ 隔离级别.
查询数据库隔离级别:select @@tx_isolation;//查看当前的隔离级别 设置事务的隔离级别:set global/session transaction isolation level 级别;// 设置当前的事务隔离级别(注意每次修改事务隔离级别后,要重新连接 登录数据库,才能生效) eg:#查看MySql数据库的事务隔离级别 select @@tx_isolation #设置事务隔离级别成功后,要重新登录才能看到 set GLOBAL TRANSACTION ISOLATION LEVEL read UNCOMMITTED; set GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ ; #开启事务 start TRANSACTION; select * from t_bank; update t_bank set money=1200 where acount=1; insert into t_bank(acount,name,money) values('3','王五',1000); #提交事务 COMMIT; #回滚事务 ROLLBACK;原因:安装数据库时选择utf8,服务器端认为你的客户端的字符集是utf-8,而实际上你的客户端的字符集是GBK。
1:通过任务管理器或者服务管理,关掉mysqld(服务进程)
2:通过命令行+特殊参数开启mysqld
mysqld --skip-grant-tables
3:此时,mysqld服务进程已经打开,并且,不需要权限检查.
4:mysql -uroot 无密码登陆服务器.
5: 修改权限表
(1) use mysql;
(2) update user set Password = password(‘123456’) where User = ‘root’;
(3)flush privileges;
6:通过任务管理器,关掉mysqld服务进程.
7:再次通过服务管理,打mysql服务。
8:即可用修改后的新密码登陆.
关于SQL的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。
_ci(大小写不敏感),_cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关)
utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。 utf8_general_ci 校对速度快,但准确度稍差。 utf8_unicode_ci 准确度高,但校对速度稍慢。
如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。一般用utf8_general_ci就够了。
