MySQL

mysql -uroot -p123456 --连接数据库
update mysql.user set authentication_string=password(‘123456’) where user=
‘root’ and Host = ‘localhost’; --修改用户密码
flush privileges; --刷新权限
–所有的语句都使用;结尾
show databases; --查看所有的数据库
mysql> use school --切换数据库 use 数据库名
Database changed
show tables; --查看数据库中所有的表
describe student; --显示数据库中所有的表的信息
create database westos; --创建一个数据库
exit; --退出连接
–单行注释(SQL本来的注释)
SQL的多行注释
/*
这是多行注释
*/

数据库的列类型:

数值

tinyint:很小的数据 1个字节
smallint:较小的数据 2个字节
mediumint:中等大小的数据 3个字节
int 标准的整数 4个字节 常用的
big 较大的数据 8个字节
float 浮点数 4个字节
double 浮点数 8个字节(精度问题)
decimal 字符串形式的浮点数 金融计算的时候一般用这个

字符串

char 字符串固定大小的 0~255
varchar 可变字符串 0~65535 常用的 String
tinytext 微型文本 2^8-1
text 文本串 2^16-1 保存大文本

时间日期

java.util.Date
date YYYY-MM-DD,日期格式
time HH:mm:ss 时间格式
datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
timestramp 时间戳,1970.1.1到现在的毫秒数 也较为常用
year 年份表示
null
没有值,未知
注意:不要使用NULL进行运算,结果为NULL

创建数据库:

-- 目标:创建一个school数据库
-- 创建学生表(列,字段)使用SQL创建
-- 学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭地址,email
-- 注意点,使用英文(),表的名称和字段尽量使用``括起来
-- AUTO_INCREMENT 自增
-- 字符串使用单引号括起来
-- 所有的语句后面加,(英文的)最后一个字段不用加
-- PRIMARY KEY 主键,一般一个表只有一个唯一的主键
CREATE TABLE IF NOT EXISTS `student` (
	`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
	`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
	`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
	`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
	`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
	`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
	 `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
	 PRIMARY KEY (`id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8

格式:

 CREATE TABLE [IF NOT EXISTS] `表名` (
   `字段名` 列类型 [属性] [索引] [注释],
   `字段名` 列类型 [属性] [索引] [注释],
   `字段名` 列类型 [属性] [索引] [注释],
   ....
   `字段名` 列类型 [属性] [索引] [注释]
 )[表类型][字符集设置][注释]

常用命令:

 SHOW CREATE DATABASE school -- 查看创建数据库的语句
 SHOW CREATE TABLE student -- 查看student数据表的定义语句
 DESC student -- 显示表的结构

关于数据库引擎:

INNODB 默认使用
MYISAM  早些年使用的

比较:

                  MYISAM                INNODB
    事务支持       不支持                 支持
	数据行锁定     不支持                 支持
	外键约束       不支持                 支持
	全文索引        支持                  不支持
	表空间的大小    较小                   较大约为前者两倍

常规使用操作:

    MYISAM : 节约空间,速度较快
	INNODB : 安全性高,事务的处理,多表、多用户操作

在物理空间存在的位置

    所有的数据库文件都存在data目录下
	本质还是文件的存储

MySQL引擎在物理文件上的区别:

    INNODB在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
	MYISAM对应的文件
	   *.frm -表结构的定义文件
	   *.MYD 数据文件(data)
	   *.MYI 索引文件(index)

设置数据库表的字符集编码

CHARSET=utf8
不设置的话,会是mysql默认的字符集编码(不支持中文)
MySQL的默认编码是Latin1,不支持中文
在my.ini中配置默认的编码

修改删除表

修改表

ALTER TABLE 旧表名 RENAME AS 新表名

–增加新的字段

ALERT TABLE 表名 ADD 字段名 列属性

– 修改表名

ALTER TABLE teacher RENAME AS teacher1

– 增加表的字段

ALTER TABLE teacher1 ADD age INT(11)

– 修改表的字段(重命名,修改约束)

--ALTER TABLE 表名 MODIFY 字段名 列属性[]
ALTER TABLE teacher1 MODIFY age VARCHAR(11) -- 修改约束
--ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性[]
ALTER TABLE teacher1 CHANGE age age1 INT(1) -- 字段重命名

– 删除表的字段:

ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher1 DROP age1

– 删除表(如果表存在)

DROP TABLE IF EXISTS teacher1
所有的创建和删除操作尽量加上判断,以免报错

注意点:

``字段名使用这个包裹
注释: --或者/**/
sql关键字大小写不敏感,建议小写
所有的符号全部用英文

MySQL数据管理:

外键(了解):

-- 学生表的gradeid字段要引用年级表的gradeid
-- 定义一个外键key
-- 给这个外键添加约束(执行引用)references 引用 
CREATE TABLE IF NOT EXISTS `student` (
	`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
	`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
	`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
	`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
	`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
	`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
	`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
	 `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
	 PRIMARY KEY (`id`),
	 KEY `FK_gradeid` (`gradeid`),
	 CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
)ENGINE = INNODB DEFAULT CHARSET = utf8
删除有外键关系的表的时候,必须先删除,引用别人的表(从表),再删除被引用的表(主表)

方式二:

   创建表成功后,添加外键约束
	CREATE TABLE `grade`(
	  `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
	  `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
	  PRIMARY KEY (`gradeid`)
	)ENGINE = INNODB DEFAULT CHARSET = utf8

	-- 学生表的gradeid字段要引用年级表的gradeid
	-- 定义一个外键key
	-- 给这个外键添加约束(执行引用)references 引用 
	CREATE TABLE IF NOT EXISTS `student` (
		`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
		`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
		`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
		`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
		`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
		`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
		`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
		 `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
		 PRIMARY KEY (`id`)
	)ENGINE = INNODB DEFAULT CHARSET = utf8

	-- 创建表的时候没有外键关系
	ALTER TABLE `student`
	ADD CONSTRAINT `FK_grateid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`);

以上操作都是物理外键,数据库级别的外键,不建议使用(避免数据库过多造成困扰)
最佳实践:
数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
想要使用多张表的数据,想使用外键(程序去实现)

DML语言(全部记住)

数据库意义:数据存储,数据管理
DML语言:数据操作语言

insert – 插入语句(添加)

	-- insert into 表名([字段insert into `grade`(`gradename名1,字段2,字段三])values('值1'),('值2'), ('值3')...)
	INSERT INTO `grade`(`gradename`) VALUES('大四')
	-- 由于主键自增我们可以省略(如果不写表的字段,他就会一一匹配)
	-- 一半写插入语句,我们一定要数据和字段一一对应

– 插入多个字段

	INSERT INTO `grade`(`gradename`) VALUES ('大一'),('大二')
	INSERT INTO `student`(`name`) VALUES ('张三')
	INSERT INTO `student`(`name`, `pwd`, `sex`) VALUES('张三', 'aaaaa', '男')
	INSERT INTO `student`(`name`, `pwd`, `sex`) VALUES('李四', 'aaaaa', '男'),('王五', 'bbbbb', '女')

注意事项:

      1,字段和字段之间使用英文逗号隔开
	  2,字段是可以省略的,但是后面的值必须要一一对应,不能少
	  3,可以同时插入多条数据,values后面的值需要使用,隔开

update

    update 修改谁 (条件) set原来的值=新值
	语法:UPDATE 表名 SET colnum_name = value where 条件;
	-- 修改学员名字
	UPDATE `student` SET `name`='狂神' WHERE `id` = 1;
	-- 不指定条件的情况下,会改动所有的表
	UPDATE `student` SET `name` = '长江七号';
	-- 修改多个属性,逗号隔开
	UPDATE `student` SET `name` = '狂神',`email` = '3283721719@qq.com' WHERE `id` = 1;
	语法:UPDATE 表名 SET colnum_name1 = value1,colnum_name2 = value2... where 条件;
	条件:where 子句 运算符 id大于某个值,在某个区间内修改

注意:

	   colnum_name是数据库的列,尽量带上``
	   条件,筛选的条件,如果没有指定,则会修改所有的列
	   多个设置的属性之间要使用,隔开
	   value是一个具体的值

delete

    语法:delete from 表名 [where 条件]
	-- 删除数据(避免这样写)
	DELETE FROM `student`
	-- 删除指定数据
	DELETE FROM `student` WHERE id = 1;
	TRUNCATE命令
	作用:完全清空一个数据库表表的结构和索引约束不会变
	--清空student 表、
	TRUNCATE `student`
	delete 和TRUNCATE 区别:
	相同点:都能删除数据,都不会删除表结构 
	不同点:TRUNCATE 重新设置自增列,计数器会归零
	        TRUNCATE 不会影响事务

DQL查询数据(重点)

所有的查询操作都用 select
数据库中最核心的语言,最重要的语句
使用频率最高的语句

– 查询全部的学生

SELECT 字段 FROM 表
SELECT * FROM student

– 查询指定字段

SELECT studentno ,studentname FROM student

– 别名,给结果起一个名字 AS 可以给字段起别名,也可以给表起别名
SELECT studentno AS 学号 ,studentname AS 学生姓名 FROM student AS s

– 函数 Concat(a,b)

SELECT CONCAT(‘姓名:’,studentname) AS 新名字 FROM student
去重:

DISDINCT:

作用:去除SELECT查询初来的结果中重复的数据,只显示一条
– 查询一下有哪些同学参加了考试成绩
SELECT * FROM result – 查询全部的考试成绩
SELECT studentno FROM result – 查询有哪些同学参加了考试
– 发现重复数据,去重
SELECT DISTINCT studentno FROM result – 发现重复数据,去重

数据库的列(表达式)

SELECT 表达式 FROM 表
– 查询系统版本
SELECT VERSION()-- 查询系统版本(函数)
SELECT 100*3-1 AS 计算结果 – 用来计算(表达式)
SELECT @@auto_increment_increment – 查询自增的步长(变量)

	-- 学员考试成绩+1分查看
	SELECT `studentno`,`studentresult`+1 AS 提分后 FROM result
	数据库中的表达式:文本值,列,null,函数,计算表达式,系统变量....
where条件子句
  作用:检索数据中符合条件的值

逻辑运算符:

      运算符           语法                描述
	  and &&      a and b  a&&b             逻辑与
	  or ||       a or b   a||b             逻辑或
	  Not !        not a   !a               逻辑非

– ======================= where ================================
SELECT studentno,studentresult FROM result – 查询所有人考试成绩
– 查询考试成绩在95~100分之间的
SELECT studentno,studentresult FROM result WHERE studentresult>=95 AND studentresult<=100

– 模糊查询(区间)

SELECT studentno,studentresult FROM result
WHERE studentresult BETWEEN 95 AND 100
– 除了1000号学生之外的同学的成绩
SELECT studentno,studentresult FROM result
WHERE studentno!=1000

模糊查询: 比较运算符

 运算符           语法                描述
  IS NULL	      a is null             如果操作符为null,结果为真
  IS NOT NULL     a is not null         如果操作符不为null,结果为真
  BETWEEN         a between b and c     如果a在b和c之间,则结果为真
  Like            a like b              SQL匹配,如果a匹配b,则结果为真
  in               a in(a1,a2,a3...)    假设a在a1,a2...其中的某一个值中,则结果为真

– ======================= 模糊查询 ================================
– 查询姓刘的同学
– like 结合 %(代表0到任意个字符) (一个字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE ‘刘%’
– 查询姓刘的同学,名字后面只有一个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘

– 查询姓刘的同学,名字后面只有两个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE ‘刘__’
– 查询名字中间有嘉字的同学 %嘉%
SELECT studentno,studentname FROM student
WHERE studentname LIKE ‘%嘉%’
– 查询1001,1002,1003号学员
SELECT studentno,studentname FROM student
WHERE studentno IN(1001,1002,1003)
– 查询有出生日期的同学,不为空
SELECT studentno,studentname FROM student
WHERE borndate IS NOT NULL

联表查询

 JOIN  对比

– inner join

	SELECT s.studentno, studentname,subjectno,studentresult
	FROM student AS s
	INNER JOIN result AS r
	WHERE s.studentno = r.studentno

– Right join

	SELECT s.studentno,studentname,subjectno,studentresult
	FROM student s
	RIGHT JOIN result r
	ON s.studentno = r.studentno 
	操作                      描述
	inner join               如果表中有一个匹配,就返回行
	left join                会从左表返回所有的值,即使右表中没有匹配
	right join               会从右表中返回所有的值,即使左表中没有匹配

分页和排序

	-- ==================分页 limit 和排序 order by==========================

	--

排序: 升序 ASC 和 降序 DESC

	-- order by 通过哪个字段排序 怎么排
	-- 查询的结果根据成绩降序排序
	SELECT s.`studentno`, `studentname`, `subjectname`,`studentresult`
	FROM student s
	INNER JOIN result r
	ON s.`studentno` = r.`studentno`
	INNER JOIN `subject` sub
	ON r.`subjectno` = sub.`subjectno`
	WHERE subjectname = '数据库结构-1'
	ORDER BY studentresult DESC

	-- 分页,每页只显示五条数据
	-- limit 当前页,页面的大小
	-- 第一页 limit 0,5
	-- 第二页 limit 5,5
	-- 第三页 limit 10,5
	SELECT s.`studentno`, `studentname`, `subjectname`,`studentresult`
	FROM student s
	INNER JOIN result r
	ON s.`studentno` = r.`studentno`
	INNER JOIN `subject` sub
	ON r.`subjectno` = sub.`subjectno`
	WHERE subjectname = '数据库结构-1'
	ORDER BY studentresult DESC
	LIMIT 0,5 

子查询
where(这个值是计算出来的)
本质:在where语句中嵌套一个子查询语句
where()

聚合函数

         函数名称                   描述
		 count()                    计数
         sum()                      求和
		 avg()                      平均值
		 max()                      最大值
		 min()                      最小值
-- =====================聚合函数==============================
SELECT COUNT(studentname) FROM student; -- count(指定列),会忽略所有的null值
SELECT COUNT(*) FROM student; -- count(*)
SELECT COUNT(1) FROM student; -- count(1)


SELECT SUM(`studentresult`) AS '总和' FROM result
SELECT AVG(`studentresult`) AS '平均分' FROM result
SELECT MAX(`studentresult`) AS '最高分' FROM result
SELECT MIN(`studentresult`) AS '最低分' FROM result


-- 查询不同课程的平均分,最高分,最低分
-- 核心:(根据不同的课程分组)
SELECT subjectname ,AVG(studentresult) AS '平均分',MAX(studentresult), MIN(studentresult)
FROM result r
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
GROUP BY r.subjectno -- 通过什么字段来分组
HAVING 平均分 >80

数据库级别的MD5加密

事务:
原子性:要么都成功,要么都失败

一致性:事务前后的数据完整性要保持一致

隔离性:指多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他的操作数据所干扰	
持久性:事务一旦提交就不可逆转

执行事务:
事务=====
– mysql是默认开启事务自动提交的
SET autocommit = 0/关闭/
SET autocommit = 1/开启(默认的)/

– 手动处理事务

	SET autocommit = 0 -- 关闭自动提交

– 事务开启

	START TRANSACTION -- 标记事务的开始,从这个之后的sql都在同一个事务内

– 提交:持久化(成功)

	COMMIT

– 回滚:回到原来的样子(失败)

	ROLLBACK

– 事务结束

	SET autocommit = 1 -- 开启自动提交
	-- 了解
	SAVEPOINT 保存点名 -- 设置一个事物的保存点
	ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
	RELEASE SAVEPOINT 保存点名 -- 撤销保存点

索引

索引的分类:

主键索引(primary key)

       唯一的标识 ,主键不能重复,只能有一个列作为主键

唯一索引(unique key)

       避免重复的列出现,唯一索引可以重复

常规索引(key/index)

       默认的,index,key关键字来设置

全文索引(fulltext)

       在特定的数据库引擎下才有,myisam
	   快速定位数据

– 索引的使用

-- 1,在创建表的时候给字段增加索引
-- 2,创建完毕后,增加索引

-- 显示所有的索引信息
SHOW INDEX FROM student

-- 增加一个全文索引(索引名) 列名
ALTER TABLE school.`student` ADD FULLTEXT INDEX `studentname`(`studentname`);

-- explain 分析sql的执行状况
EXPLAIN SELECT * FROM student; -- 非全文索引

EXPLAIN SELECT * FROM student WHERE MATCH(studentname) AGAINST('刘');

索引在小数据量的时候,用处不大,但是在大数据的时候,区别十分明显

索引原则:

索引不是越多越好
不要对经常变动的数据加索引
小数据量的表不需要加索引 
索引一般加在常用来查询的字段上

索引的数据结构:

    hash类型的索引
	Btree:innodb的默认数据结构

权限管理和备份

– 创建用户

create user 用户名 identified by ‘密码’
CREATE USER kuangshen IDENTIFIED BY ‘123456’

– 修改密码

(修改当前用户密码)
SET PASSWORD = PASSWORD(‘123456’)

– 修改密码

(修改指定用户密码)
SET PASSWORD FOR kuangshen = PASSWORD(‘123456’)

– 重命名 rename user 原来名字 to 新的名字

RENAME USER kuangshen TO kuangshen2

– 用户授权 ALL PRIVILEGES 全部的权限 ,库.表

-- ALL PRIVILEGES 除了给别人授权,其他都能干
GRANT ALL PRIVILEGES ON *.* TO kuangshen 

– 查询权限

SHOW GRANTS FOR kuangshen -- 查看指定用户的权限
SHOW GRANTS FOR root@localhost -- 查看root用户权限

– 撤销权限 REVOKE 哪些权限,在哪个库撤销,给谁撤销

REVOKE ALL PRIVILEGES ON *.* FOR kuangshen

– 删除用户

DROP USER kuangshen 

MySQl备份

备份的方式:
    直接拷贝物理文件
	在工具中备份导出
	使用命令行mysqldump

三大范式:

 第一范式:原子性,保证每一列不可再分
 第二范式:满足第一范式,每张表只描述一件事情
 第三范式:满足第一范式和第二范式,确保数据表中的每一列数据都和主键直接相而不能间接相关
关联查询的表不得超过三张表

JDBC

数据库驱动

步骤总结:

 1.加载驱动
 2.连接数据库DriverManager 
 3.获取执行sql的对象Statement
 4.获得返回的结果集
 5.释放连接
    resultSet.beforeFirst();//移动到最前面
    resultSet.afterLast();//移动到最后面
    resultSet.next();//移动到下一行数据
    resultSet.previous();//移动到前一行数据
    resultSet.absolute(row);//移动到指定行
释放资源
    resultSet.close();
    statement.close();
    connection.close();

PreparedStatement(可以防止SQL注入效率更高)

开启事务 //关闭数据库的自动提交,自动会开启事务
conn.setAutoCommit(false);
一组业务执行完毕,提交事务
可以在catch中定义回滚语句,但是默认就是失败就会回滚

数据库连接池

数据库连接—执行完毕–释放
连接–释放 十分浪费系统资源

池化技术: 准备一些预先的资源,过来就连接预先准备好了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值