赞
踩
结构化查询语言(Structured Query Language)简称,是用来操作关系型数据库的一门语言,是一个关系型数据库通用的操作语言。
https://dev.mysql.com/downloads/mysql/
如:mysql-8.0.26-macos11-x86_64.dmg
双击*.dmg,一路next,中间会弹出一个对话框,提示输入root的密码,done.
点击右上角苹果按钮,进入系统偏好设置,点击mysql,开启MySQL服务
进入/usr/local/mysql/bin,查看此目录下是否有mysql
执行 vim ~/.bash_profile 在该文件中添加mysql/bin的目录
PATH=$PATH:/usr/local/mysql/bin
添加完成后,按esc,然后输入:wq保存。
在命令行输入:
source ~/.bash_profile
注意:你可以通过以下方法来查看当前使用的是哪个 shell:
echo $SHELL 命令: 打开终端并输入以下命令:
echo $SHELL
这会输出当前 shell 的路径,例如 /bin/bash
或 /bin/zsh
。
登录MySQL
mysql -uroot -p 输入默认密码
指定数据库地址,默认为本地地址,也可以登录远程数据库
mysql -h127.0.0.1 -uroot -p
修改密码:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
对数据库的使用,从本质上来说分为三个维度:
查看数据库:
show databases;
查看数据库后,mysql会有4个默认的数据库,一般不能动:
创建数据库:
create DATABASE test;
使用某个数据库:
use test;
查看当前数据库里的数据表:
show tables;
创建数据表:
create table comment(
id int primary key auto_increment,
content varchar(200)
);
接下来就是对数据表进行操作:
插入一条数据:
INSERT INTO comment (content) VALUES ('This is a sample comment.');
例如查询数据表
select * from comment;
删除数据表:
drop table tableName
删除数据表中的指定数据:
delete from urls where url="www.baidu.com";
保证保存到数据库中的数据都是正确的。
什么是实体? 表中的一行数据就是一个实体(entity)。
如何保证实体完整性?保证实体完整性就是保证每一行数据的唯一性。
实体完整性的约束类型
主键用于唯一标识表中的每一条数据, 和现实生活中的身份证很像。
我们通过将表中的某个永远不重复的字段设置为主键, 从而达到保证每一行数据的唯一性(实体完整性)。但是在企业开发中有时候我们可能找不到不重复的字段, 此时我们还可以通过联合主键的方式来保证每一行数据的唯一性
联合主键就是同时将多个字段作为一个主键来使用。
设置主键有两种方式,第一种在某个字段后面注明是primary key;第二种是在所有字段之后通过primary key来标注;联合主键采用第二种方式,即标注多个字段来作为联合主键。如下:
create table persion(
name varchar(20),
age int,
primary key(name, age) // 设置联合主键。
);
唯一约束用于保证某个字段的值永远不重复
create table person(
id int unique,
name varchar(20)
);
主键和唯一键异同:
如果某个字段是自动增长的, 那么这个字段必须是主键才可以
create table person(
id int auto_increment primary key,
name varchar(20)
);
insert into person values (1, 'lnj');
insert into person values (null, 'lnj');
insert into person values (default, 'lnj');
如果仅仅是主键, 那么取值不能是null, 但是如果主键还是自动增长的, 那么取值就可以是null或者default
alter table 表名 add primary key(字段);
alter table 表名 add unique(字段);
alter table 表名 modify 字段名称 数据类型 auto_increment;
什么是域?一行数据中的每个单元格都是一个域。
如何保证域的完整性?保证域的完整性就是保证每个单元格数据的正确性。
create table person(
id int,
name varchar(20) default 'it666'
);
参照完整性又称引用完整性, 主要用于保证多表之间引用关系的正确性。
为什么要进行表的拆分?如果将所有的数据都放到一张表中, 会出现大量冗余数据。
什么时候会出现冗余数据?
表与表之间的关系可以分为三种: 一对一、一对多、多对多。
为了保证表与表之间参照完整性, 我们可以通过’外键’来保证参照完整性。
如果一张表中有一个字段指向了别一张表中的主键,就将该字段叫做外键
例如: 成绩表中的uid引用了学生表中的id, 那么成绩表中的uid我们就称之为外键。
show create table 表名称;
严格操作:
置空操作(null) :
create table grade2(
id int auto_increment primary key,
km varchar(20),
score double,
uid int,
foreign key(uid) references stu(id) on delete set null
);
insert into grade values (null, '语文', 100, 1);
delete from stu where id=1;
级联操作(cascade):
create table grade3(
id int auto_increment primary key,
km varchar(20),
score double,
uid int,
foreign key(uid) references stu(id) on update cascade
);
insert into grade values (null, '语文', 100, 1);
update stu set id=1 where id=3;
格式:
select 字段 from 表名 where 字段 like ‘条件’;
select 字段 from 表名 order by 字段 [asc | desc];
select * from stu order by age; #默认按照升序进行排序
select * from stu order by age asc; # 升序排序
select * from stu order by age desc; # 降序排序
select * from stu order by age desc, score asc; #如果年龄相同, 那么还可以继续按照其它字段来排序
count(); 统计 select count(*) from stu; select count(*) from stu where score >= 60; sum(); 求和 select sum(id) from stu; avg(); 求平均值 select avg(id) from stu; # 21 / 6 = 3.5 select avg(score) from stu; max(); 获取最大值 select max(score) from stu; min(); 获取最小值 select min(score) from stu;
注意点:
select city from stu group by city;
select name from stu group by city;
select city, group_concat(name) from stu group by city;
select * from stu where city='北京';
select * from stu having city='北京';
select name, age from stu where city='北京';
select name, age from stu having city='北京';
#Unknown column 'city' in 'having clause'
select 字段 from 表 limit 索引, 个数;
select * from stu limit 0, 3;
select * from stu limit 3, 3;
select [查询选项] 字段名称 from 表名;
all: 显示所有查询出来的数据[默认]
distinct: 去除结果集中重复的数据之后再显示
select name from stu;
select all name from stu;
select distinct name from stu;
注意点:
如果是通过distinct来对结果集中重复的数据进行去重,那么只有所有列的数据都相同才会去重。
多表查询只需要在单表查询基础上增加一张表即可:
select * from 表名1, 表名2;
select * from stu, grade;
注意点:默认情况下多表查询的结果是笛卡尔集。
在纵向上将多张表的结果结合起来返回给我们
select * from 表名1 union select * from 表名2;
select id, name from stu union select id, score from grade;
注意点:
select * from stu, grade where stu.id = grade.stuId;
select * from 表名1 inner join 表名2 on 条件;
select * from stu inner join grade on stu.id = grade.stuId;
注意点:
左外连接 left join
select stu.id, stu.name, grade.score from stu left join grade on stu.id = grade.stuId;
右外连接 right join
select stu.id, stu.name, grade.score from stu right join grade on stu.id = grade.stuId;
为了简化上面的连接,还有个自然连接,自然连接(natural)就是用来简化’内连接和外连接’的,如果多张表需要判断的条件字段名称一致, 那么不用编写条件, 自然连接会自动判断。例如:
select * from 表名1 inner join 表名2 on 条件;
select * from stu inner join grade on stu.id = grade.stuId;
select * from 表名1 natural join 表名2;
select * from stu natural join grade;
同理,自然连接也有自然左外连接和自然右外连接。
如果多张表需要判断的条件字段名称一致, 那么除了可以使用自然连接来简化以外,还可以使用using
关键字来简化
// 内连接
select * from stu inner join grade on stu.stuId = grade.stuId;
select * from stu inner join grade using(stuId);
// 返回的结果只有一个
select stuId from grade where score = 100;
select name from stu where stuId = 3;
select name from stu where stuId = (select stuId from grade where score = 100);
// 返回的结果有多个
select stuId from grade where score >= 60;
select name from stu where stuId = 3 OR stuId = 1;
select name from stu where stuId in(3, 1);
select name from stu where stuId in(select stuId from grade where score >= 60);
select name, city, score from person where score >= 60;
select name, city, score from (select name, city, score from person where score >= 60) as t;
注意点:
如果要将一个查询语句查询的结果作为另一个查询的表来使用, 那么必须给子查询起一个别名。
银行卡转账案例。
开启事务: start transaction
提交事务: commit
回滚事务: rollback
注意点:
事务的本质是开启事务的时候拷贝一张一模一样的表,然后执行相关的操作都是在拷贝的这张表中做操作,
如果失败了, 如果执行了rollback, 那么系统就会自动删除拷贝的这张表
所以失败了不会影响到原有的数据。
如果成功了, 如果执行了commit, 那么系统就会自动利用拷贝表中最新的数据覆盖原有表中的数据,所以成功了会影响到原有的数据。
另外,如何整体回滚外,也可以设置事务回滚点,这样如果失败就可以回滚到指定的地方。
原子性(关注的是状态):
事务开启后的所有操作,要么全部成功,要么全部失败,不可能出现部分成功的情况。事务执行过程中如果出错,哪怕我们不手动回滚, 系统也会自动帮我们回滚
一致性(关注数据可见性):
事务开始前和结束后,数据库的完整性约束没有被破坏
例如 A向B转账,不可能A扣了钱,B却没收到
持久性:
事务完成后,事务对数据库的所有操作是永久的, 操作完成之后就不能再回滚
隔离性:
数据库允许多个并发事务同时对其数据进行读写和修改的能力,
隔离性可以防止多个事务并发时由于交叉执行而导致数据的不一致。
问题:脏读
。问题:在一个事务范围内多次查询的结果不同,即不可重复读
。问题:幻读
。create view 视图名称 as select 语句;
SELECT name, city FROM person;
CREATE VIEW person_view as SELECT name, city FROM person;
SELECT * FROM person_view;
INSERT INTO person_view values ('it666', '武汉');
UPDATE person_view set city='香港' WHERE name='it666';
DELETE FROM person_view WHERE name='it666';
注意点:
由于视图保存的是结果集, 由于结果集是基于原始表的,所以操作视图中的数据, 本质上操作的是原始表中的数据。
另外,也可以对视图进行修改和删除。
所以只有原始表中存在的原始数据才可以更新,通过其它方式生成的数据都不可以更新。
所谓的预处理技术,最初也是由MySQL提出的一种减轻服务器压力的一种技术!
select * from stu where id=1;
select * from stu where id=2;
弊端:
prepare 预处理名称 from 'sql语句';
prepare stmt from 'select * from stu where id=?;';
优点:
存储过程和其它编程语言的函数很像, 可以用于封装一组特定功能的SQL语句集;用户通过’call 存储过程的名称()’ 来调用执行它。
create procedure 存储过程名称(形参列表)
begin
// sql语句
// ... ...
end;
示例:
create procedure show_stu_by_id(stuId int)
begin
select * from stu where id=stuId;
end;
drop procedure show_stu;
自定义函数和存储过程很像,只不过自定义函数不需要手动通过call调用, 而是和其它的聚合函数一样会在SQL语句中自动被调用
,例如自定义函数名为add_stu,那么执行的时候不需要call,只需要select add_stu() from dual;
即:自定义函数需要和其他SQL语句配合使用,而存储过程需要手动call一下。
create function 函数名(形参列表) returns 数据类型 函数特征
begin
sql语句;
... ...
return 值;
end;
备注:在MySQL中也有if语句、switch语句、循环语句。
将来怎么使用?是配合其它SQL语句使用, 还是单独使用?
create procedure add_stus(num int)
begin
declare currentId int default 0;
declare currentAge int default 0;
declare currentName varchar(255) default '';
while currentId < num do
set currentId = currentId + 1;
set currentAge = floor(rand() * 30);
set currentName = concat('it', currentAge);
insert into stu values(currentId,currentName,currentAge);
end while;
end;
call add_stus(10000); #48.428s
注意点:
以上封装存在的问题, 默认情况下每生成一条插入语句, 就会立即执行这条插入的语句。所以整个过程我们生成了一万条插入语句, 我们解析了一万条插入的语句, 我们编译了一万条插入的语句, 我们执行了一万条插入的语句
所以整个过程就比较耗时
create procedure add_stus4(num int) begin set @currentId = 0; set @currentAge = 0; set @currentName = ''; prepare stmt from 'insert into stu values(?,?,?);'; set autocommit = 0; while @currentId < num do set @currentId = @currentId + 1; set @currentAge = floor(rand() * 30); set @currentName = concat('it', @currentAge); execute stmt using @currentId, @currentName, @currentAge; end while; commit; end;
call add_stus(10000); #2.017s
只要在循环前面加上set autocommit = 0;,在循环后面加上commit;
那么就不会生成一条插入语句就执行一条插入语句了,会等到所有的插入语句都生成之后, 再统一的解析, 统一的编译, 统一的执行。
create procedure add_stus2(num int) begin declare currentId int default 0; declare currentAge int default 0; declare currentName varchar(255) default ''; set autocommit = 0; while currentId < num do set currentId = currentId + 1; set currentAge = floor(rand() * 30); set currentName = concat('it', currentAge); insert into stu values(currentId,currentName,currentAge); end while; commit; end;
call add_stus2(10000); #1.713s
SELECT * FROM stu WHERE id=999999; #0.695s
SELECT * FROM stu2 WHERE id=999999; #0.008s
EXPLAIN 查询语句;
如果返回的结果集中的key有值, 那么就表示当前的查询语句中用到了索引
如果返回的结果集中的key没有值, 那么就表示当前的查询语句中没有用到索引
给表设置主键 - 自动添加, 只要设置了主键, 那么系统就会自动创建对应的索引
给表设置外键 - 自动添加, 只要设置了外键, 那么系统就会自动创建对应的索引
给表设置唯一键 - 自动添加, 只要设置了某一个字段的取值是唯一的, 也会自动创建对应的索引
创建表的时候指定给哪个字段添加索引 - 手动添加
create table test1(
id int,
name varchar(20),
index idx_name(id) #创建索引
);
create table test2(
id int,
name varchar(20),
);
create index idx_name on test2(id); #创建索引
create table test3(
id int,
name varchar(20),
);
alter table test3 add index idx_name(id);
drop index 索引名称 on 表名;
索引算法决定了如何创建索引,索引算法决定了如何查找索引对应的数据。
1, 2, 3, 4, 5
4
|-------------|
2 6
|----|----| |----|----|
1 3 5 7
BTree索引:
BTree索引是基于平衡多叉排序树实现的, 能够缩短查找的次数
哈希索引是基于哈希表实现的, 只能用于memory存储引擎, 可以一次性定位到指定数据
https://dev.mysql.com/doc/refman/8.0/en/index-btree-hash.html
JDBC代表Java数据库连接(Java Database Connectivity)。它是一种Java编程语言用于与关系型数据库进行交互的API(应用程序接口)。JDBC允许Java应用程序通过标准的SQL语句访问数据库,执行查询、更新和管理数据库中的数据。
JDBC提供了一组Java类和接口,使Java应用程序能够执行以下任务:
建立连接: 通过JDBC,Java应用程序可以与数据库建立连接,这是执行任何数据库操作的第一步。
执行SQL语句: 通过JDBC,可以执行SQL查询、更新和删除等操作。JDBC支持预编译的语句,也可以执行动态生成的语句。
处理结果集: 当执行查询时,JDBC提供了一种方式来处理返回的结果集。开发人员可以迭代结果集,检索数据并进行相应的处理。
事务管理: JDBC允许在Java应用程序中管理事务,确保数据库操作的原子性、一致性、隔离性和持久性(ACID属性)。
处理异常: 通过捕获和处理JDBC异常,开发人员可以更好地处理与数据库连接和操作相关的问题。
使用JDBC,Java开发人员可以编写与数据库无关的代码,因为JDBC提供了一个标准的接口,允许在不同的数据库系统上运行相同的Java代码,只需更改数据库连接的配置。
总体而言,JDBC为Java应用程序与关系型数据库之间的通信提供了一种灵活、可扩展的方式。
mysql忘记密码处理:https://blog.csdn.net/weixin_43922901/article/details/109570089
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。