数据库:DataBase简称DB。按照一定的格式存储数据的一些文件的组合。顾名思义,就是存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。
数据库中最基本的单元是表:table,数据库当中是以表的形式表示数据的。因为表比较直观!任何表都有行和列,其中行(row) 被称作数据/记录,列(column)被称作字段。
每个字段都有字段名、数据类型(字符串,整型等)、约束(类似于用户名不能重复)等属性
数据库管理系统:DataBaseManagement,简称DBMS。数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中数据进行增删改查!
常见的数据库管理系统:MySQL、Oracle、MS等
SQL:结构化查询语言
程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。
三者之间的关系?
DBMS-执行->SQL–进行相关操作->DB-存储!
数据库远程连接登录命令, 不输入IP和prot就是默认
mysql -h 127.0.0.1 -P 3306 -u root -p
开启和关闭数据库服务
net start mysql
net stop mysql
初始化mysql
mysqld --initialize --console
安装mysql
mysqld --install
用于卸载MySQL时删除已经安装好的MySQL服务
sc delete mysql
查看mysql配置命令
show variables like 'char%';
show databases;
SHOW ENGINES;
show tables; # 查看该数据库中的所有表
SHOW CREATE DATABASE NAME; # 查看此数据库的定义信息
status; -- 列出当前所有信息
mysql自带四个数据库!
use 数据库名称
create database 数据库名称;
# COLLATE utf8_general_ci 不区分大小写 utf8_bin区区分大小写
# DROP用的好, 跑路少不了 从入门到跑路
DROP DATABASE NAME; # 删除数据库 默认排列不区分大小写
CREATE DATABASE NAME CHARACTER SET utf8 COLLATE utf8_bin
- 3 查询语句:
# SELECT 代表查询 * 表示所有字段 FROM 来自哪个表 WHERE 从哪个字段
SELECT * FROM TABLE WHERE NAME = '';
SELECT ID, NAME FROM STUDUENT; -- 指定字段范围进行查找
select distinct from student; -- 过滤表中重复元素
SELECT NAME, (chinese + english + math) FROM student; -- 计算总分
SELECT NAME AS '名称', (chinese + english + math) as total_score FROM student; -- 计算总分并且取别名 as 可以有也可以没有
SELECT * FROM student WHERE english > 90; -- 查找英语大于90分选手
SELECT id, name, (chinese + english + math) AS total_score FROM student WHERE (chinese + english+ math) > 200 and
math < chinese and name like '赵%';
-- like 是模糊语句
SELECT * FROM student WHERE english BETWEEN 80 AND 90; -- 查询区间
SELECT * FROM student WHERE english in (80, 81, 82, 83) -- 指定集合查找
SELECT * FROM student ORDER BY math; -- 默认通过升序排列数学 ASC
SELECT * FROM student ORDER BY math DESC; -- 通过降序排列数学 DESC
USE mysql_study;
CREATE TABLE `user`(
id INT UNSIGNED, # 不加 unsigned 的默认有符号
`name` VARCHAR(200),
`password` VARCHAR(32),
`birthday` DATE,
`login_time` TIMESTAMP
NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
-- 如果希望timestamp时间自动更新,就加入该语句
) CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB || MYISAM;
INSERT INTO user VALUES(66, 'dd', 'dd', '2021'); # 插入新数据
INSERT INTO user(id, name) VALUES(1, '22'), (2, '44');
ALTER TABLE EMP
ADD `IMAGE` VARCHAR(255) -- 添加一个image列表
NOT NULL DEFAULT '' -- 不能为空 并且指定默认值
AFTER resume; -- 添加在谁的后边
DESC emp; -- 可以查看表的所有字段
ALTER TABLE emp
MODIFY JOB VARCHAR(60) -- 修改job字段的长度
NOT NULL DEFAULT '';
ALTER TABLE EMP DROP SEX; -- 删除表单中的行
RENAME TABLE EMP TO EMPLOYEE; -- 修改名字
ALTER TABLE EMPLOYEE CHARACTER SET UTF8; -- 修改表的字符集
DESC EMPLOYEE;
ALTER TABLE EMPLOYEE -- 改变表单中数据名
CHANGE NAME USER_NAME VARCHAR(255)
NOT NULL DEFAULT '';
DESC EMPLOYEE;
UPDATE EMPLOYEE SET salary = 421 -- 将所有薪水都改为421
UPDATE EMPLOYEE SET salary = 222 WHERE user_name = '张三'
-- 指定修改用户的数据
UPDATE EMPLOYEE SET salary = salary + 100, job = '喜欢'
WHERE user_name = '张三'
-- 修改指定用户的多个字段值
DELETE FROM EMPLOYEE WHERE user_name = '张三' -- 删除数据
DELETE FROM EMPLOYEE -- 删除表中所有数据
# 备份sql文件 -B 指的是连续几个数据库备份
mysqldump -uroot -p -B mysql_study > C:\Users\18446\Desktop\dbsrc\study.sql
mysqldump -uroot -p mysql_study 表1 表2 > C:\Users\18446\Desktop\dbsrc\study.sql
# 导入sql文件
source 文件路径 #备份方法是在dos中实行 导入方法实在dos mysql中执行
# 直接复制后在datagrip中run也可
SELECT count(*) FROM student; -- 返回有多少行
SELECT count(列) FROM student; -- 返回有多少行,但是不包括空
SELECT SUM(math) FROM student; -- 统计一个班级的数学总成绩
SELECT AVG(math) FROM student; -- 返回某一列的平均值
SELECT MAX(math), MIN(math) FROM student; -- 返回某一列的最大/小值
// -- 根据部门进行分组
SELECT AVG(sal), MAX(sal), deptno FROM emp GROUP BY deptno
// -- 分组的基础上进行过滤
SELECT AVG(sal), deptno FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;
SELECT USER() FROM DUAL; -- 查询登录mysql的所有用户以及IP地址
SELECT DATABASE(); -- 查询当前使用数据库的名称
SELECT MD5('root') FROM DUAL;-- MD5加密 32位字符串
INSERT INTO hsp_user VALUES(100, '张三', MD5('zhangsan'));
SELECT * FROM hsp_user WHERE name = '张三' AND pwd = MD5('zhangsan');-- 使用MD5进行解密
PASSWORD('') -- 一种mysql默认加密方法
LAST_DAY(NOW()); -- 返回日期所在月份的最后一天
SELECT IF(TRUE, 'TRUE', 'FALSE') FROM DUAL; -- 三元运算符
SELECT IF(NULL, 'TRUE') FROM DUAL; -- 如果第一个为NULL,就返回第二个
SELECT CASE WHEN expr1 THEN expr2
WHEN expr3 THEN expr4
ELSE expr5 END;
-- 多重分支结构
SELECT IF(comm IS NULL, 0.0, comm) FROM emp;
-- 判断空要用IS 判断不为空要用 IS NOT
3.11 mysql SELECT加强AND多表查询
# %表示0 - 任意长度 _表示单个任意字符 order by 排序 Group by 分组
SELECT * FROM EMP ORDER BY deptno ASC, sal DESC;
-- 按照部门升序,部门中薪资降序排列
-- LIMIT START, LENGTH 从什么位置开始,展示多少个
SELECT * FROM EMP ORDER BY id LIMIT 0, 3;
-- 降序排列,并且分页
SELECT * FROM student ORDER BY ID DESC,
name LIMIT 0, 2 ;
-- mysql 多表查询
SELECT * FROM DATABASE1, DATABASE2; -- 默认情况下两表会合并
-- 自连接特点 把同一张表当作两个表来使用
SELECT worker.ename , boss.ename FROM emp worker, emp boss
WHERE worker.mgr = boss.ename;
-- 子查询 单行子查询
SELECT deptno FROM emp WHERE ename = 'SMITH';-- 查询smith的部门号
SELECT * FROM emp WHERE deptno = (
SELECT deptno
FROM emp
WHERE ename = 'SMITH';
); -- 查询到smith所在部门的所有信息
SELECT ename, job, sal, deptno
FROM emp
WHERE job IN (
SELECT DISTINCT job
FROM emp
WHERE deptno = 10
) AND deptno <> 10 (!=)
-- 查询job在该范围内的情况并且deptno不等于(!=)10
-- 子表作为查询对象
SELECT DISTINCT id, name, math FROM (
SELECT chinese FROM student WHERE chinese > 60
) tmp ,student WHERE math > tmp.chinese
# ALL和 ANY ALL表示全部 ANY表示其中一个
INSERT INTO my_db (id, name, sal, job, deptno)
SELECT empno, ename, sal, job, deptno FROM emp;
# 将查到的表插入到自己创建的表中,实现自我复制
> # 如何去除掉表中重复的数据
CREATE TABLE my_tmp LIKE my_db; -- 先创建一个和db一模一样的表
INSERT INTO my_tmp SELECT DISTINCT * FROM my_db; -- 将数据复制进tmp中
DELETE FROM my_db; -- 此时可以将tmp改名为db,删除db中的数据
INSERT INTO my_db SELECT * FROM my_tmp; -- 复制tmp进入db中
DROP TABLE my_tmp; -- 删除临时表tmp
INSERT ...
UNION ALL -- 将两个查询结果进行合并为一张表,但是不会去重
INSERT ...
UNION -- 将两个查询结果进行合并为一张表,并且
# 左右外连接 即使查询到为null 左右侧也会显示信息
SELECT * FROM TABLE1 LEFT JOIN TABLE2 ON 条件
SELECT * FROM TABLE1 RIGHT JOIN TABLE2 ON 条件
-- 主键列的值是不能重复的 而且不能为空值
CREATE TABLE T1 (
id INT PRIMARY KEY,
name varchar(255),
email varchar(255)
); -- 表示id列为主键,不能重复id号,id号不能为空
-- 一张表只能有一个主键,但可以使用复合主键
CREATE TABLE T1 (
id INT,
name varchar(255),
email varchar(255),
PRIMARY KEY (id, name)
); > -- 复合主键, 但是id 或 name可以重复,而 id和name不能同时重复
> NOT NULL(不能为NULL) UNIQUE(禁止重复) 一张表可以有多个 UNIQUE
-- 外键约束 将两张表的某个信息进行外键关联 关联的某一字段必须有禁止重复的约束
CREATE TABLE my_test (
id INT PRIMARY KEY,
name varchar(32)
);
CREATE TABLE my_tmp (
id INT PRIMARY KEY,
address varchar(32),
class_id INT,
FOREIGN KEY (class_id) REFERENCES my_test(id)
);
-- check 约束
CREATE TABLE TMP (
id INT PRIMARY KEY,
name varchar(32),
sex varchar(6) CHECK (sex IN(man, woman)),
sal DOUBLE CHECK (sal > 1000 AND sal < 2000 )
); -- 进行z约束
AUTO_INCREMENT = 1 -- 默认自增长值为1,可以进行调整
ALTER TABLE TMP AUTO_INCREMENT = 100
CREATE TABLE TMP (
id INT PRIMARY KEY AUTO_INCREMENT
);
INSERT TABLE TMP VALUES(NULL);
SELECT * FROM TMP; -- 1 插入值会随着插入自动增长
-- 如果你赋的值并不为NULL,以分配的值为主
3.16 mysql 索引机制
-- CREATE 索引 索引名称 ON 表名 列; 速度直接翻几个数量级
CREATE INDEX tmp_index ON tmp (ID);
-- 添加普通索引
ALTER TABLE tmp ADD INDEX tmp_index (id);
-- 添加主键索引
ALTER TABLE tmp ADD PRIMARY KEY (id);
-- 删除索引
DROP INDEX id_index ON tmp
-- 删除主键索引
ALTER TABLE tmp DROP PRIMARY KEY -- 一张表只有一个主键,所以不用指定
索引的代价
- 索引会占用磁盘
- 索引会对dml语句(update delete insert)造成影响
注:由于select的用法大多都大于udi的用法,所以索引是很有必要的3.16 .1 索引的类型
- 主键索引,主键自动的为主索引 (Primary key)
- 唯一索引 UNIQUE
- 普通索引 INDEX
- 全文索引 FULLTEXT 适用于 MylSAM 一般开发不使用mysql自带的全文索 引,一般都使用 Solr 和 ElasticSearch (ES)这两个全文索引框架
-- 查询是否有索引
SHOW INDEX FROM TMP
SHOW INDEXES FROM TMP
SHOW KEYS FROM TMP
DESC TMP
3.17 mysql事务(transaction)
-- 开启事务
start transaction
set autocommit = off;
-- 保存事务点
savepoint a
-- 回滚事务到事务点a
rollback to a
-- 回滚全部事务
rollback
-- 提交事务 所有事务全部生效,不能回滚
commit
> mysql 事务在 engine = innodb存储引擎下才能使用, 在 myisam 不支持
事务隔离级别
脏读 就是一方还未提交只是进行更改的代码,你这边受到了影响并且进行了提交。结果对方将日志信息回滚重新更改,造成你提交的部分出现脏读现象!
不可重复读 意思是你正在修改一个值的时候并进行了提交时,另一边进行了查询,造成查询结果有误。
幻读 意思是你这边正在进行表的修改后进行查询,另一方突然插入或者删除一行语句,结果你查询到的其他行都已经修改完毕,而新插入的那一行没有修改,就像发生了幻觉一样。
查看和设置系统隔离级别
查看mysql当前会话隔离级别
SELECT @@transaction_isolation;
查看系统当前隔离级别
SELECT @@global.transaction_isolation;
设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
设置系统当前隔离级别
set global transaction isolation level repeatable read;
mysql默认的事务隔离级别是 repeatable read
mysql的存储引擎有六大类:
-- 创建视图 emp 为视图名称 emp1为表名
CREATE VIEW emp AS SELECT id, name FROM emp1; -- 该视图仅拥有id和name
DESC emp; -- 查看视图
ALTER VIEW emp as SELECT id FROM emp1; -- 更新为新的视图
SHOW CREATE VIEW emp; -- 查看创建视图的指令
update emp set name = '小白' WHERE id = 1; -- 通过视图修改基表数据
DROP VIEW emp; -- 删除视图
mysql中的用户都存在于mysql数据库的user库中
user库中存放的密码为password函数加密后的密码,不是明文存放密码
如果创建用户时不指定用户登录限制,则默认为%,表示任意IP都可以登录。
也可以 192.168.% 。表示开头为192.168的IP地址都可以登录
-- 创建用户并且指定用户密码 和 限制登陆地址
CREATE USER 'username'@'localhost' IDENTIFIED BY 'pwd';
-- 删除用户需要写明登陆地址和用户
DROP USER 'username'@'localhost';
-- 修改用户的密码 第一种方法需要权限
set password for username@localhost='你想设置的密码';
set password = password('newpwd');
*.* 代表所有数据库的所有对象 库.* 表示这个数据库的所有对象
flush privileges; -- 刷新权限 部分版本需要刷新权限才能够生效
-- 授予某用户对database数据库下table表的查看和插入的权限
GRANT INSERT, SELECT ON database.table TO 'username'@'loaclhost';
-- 回收权限
revoke INSERT, SELECT ON database.table FROM 'username'@'localhost';
char为固定长度字符串 最大为255字符 char会造成浪费空间,因为他是固定字符大小
varchar为可变化字符串 最大为 65535字节,也就是21844字符 只有在utf-8编码一个字符占三个字节才是21844字符,unicode编码下一个字符占两个字节,根本达不到最大长度字符数量 varchar会根据你存放的字符长度来变化占用空间
char的查询速度快于varchar 如果说存放md5加密或者邮箱或者手机号等固定长度就可以用char
字符预留3位作为缓冲结束符号 (65535 - 3) / 3 = 21844
SQL语句又分为:
DQL(Data Query Language): 数据查询语言(凡是带有select关键字的都是查询语言)select…
DML(Data Manipulation Language): 数据操作语言(凡是对表中的数据进行增删改的都是DML) insert delete updata
DDL(Data Definition Language): 数据定义语言,凡是带有create、drop、alter的都是DDL。虽然也有增删改的意思,但DDL主要操作的是表的结构(字段)。不是表中的数据。
TCL(Transaction Control Language): 事务提交: commit;事务回滚:rollback;
DCL(Data Control Language): 数据控制语言。例如授权grant、撤销权限revoke…
学完后感受到的一句话: SQL语句一定要多练习才能掌握