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中定义回滚语句,但是默认就是失败就会回滚
数据库连接池
数据库连接—执行完毕–释放
连接–释放 十分浪费系统资源
池化技术: 准备一些预先的资源,过来就连接预先准备好了