Mysql
JavaEE:企业级java开发,web方面
-
前端:页面展示,本质是数据
-
后台:连接点,连接数据库,连接前端(控制视图跳转,给前端传递数据)
-
数据库:存数据
DBMS
DataBasic ManageSystem:数据库管理系统
数据库:存储数据
数据库管理系统:管理和操作数据
MySQL本质是关系型数据库管理系统,将数据保存在不同的表中,MySQL所使用的SQL语言适用于访问数据库的最常用标准化语言。开源的数据库软件,体积小、速度快、总体拥有成本低
连接数据库
1、命令行连接
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 students; --describe 表名 显示数据库中所有的表的信息
create database school; --创建一个数据库名,create database 数据库名称
exit; --推出连接
-- 单行注释(SQL的本身注释) /**/多行注释
操作数据库
操作数据库>操作数据库中的表>操作数据库中表的数据
mysql关键字不区分大小写
操作数据库
1、创建数据库
create database if not exists school(库名)
2、删除数据库
drop database if exists school(库名)
3、使用数据库
use 库名
如果表名或者字段名是一个特殊字符,需要带 ``
4、查看数据库
show databases; --查看所有的数据库
show tables; --查看数据库中所有的表
数据库的列类型
数值
整数:
-
tinyint 十分小的数据 占1个字节
-
smallint 较小的数据 占2个字节
-
mediumint 中等大小的数据 占3个字节
-
int 标准的整数 占4个字节 常用
-
bigint 较大的数据 占8个字节
浮点数:
-
float 浮点数 4个字节
-
double 浮点数 8个字节
-
decimal 字符串形式的浮点数(金融计算的时候,一般使用decimal)
字符串
-
char 字符串固定大小的 0-255
-
varchar 可变字符串 0-65535 常用
-
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 最常用的时间格式
-
timestamp 时间戳 1970.1.1到现在的毫秒数 也较为常用
-
year 年份表示
null
-
没有值,未知
-
注意:不要使用NULL进行运算
数据库的字段属性
Unsigned:
-
不能声明为负数
-
无符号的整数
zerofill:
-
0填充的
-
不足的位数使用0填充 比如:int(3) 5 会变成005
自增
-
通常理解为自增,自动在上一条记录的基础上+1(默认)
-
通常用来设计唯一的主键,并且必须为整数类型
-
可以自定义主键自增的起始值和步长
非空
-
假设设置为非空,如果不给它赋值,就会报错
默认
-
设置默认的值
格式
CREATE TABLE IF NOT EXISTS ‘student’ (
‘id’ INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
‘字段名’(单引号为中文) 列类型 属性 索引 注释(注释和默认值的单引号为英文)
)
常用命令
-
查看创建数据库的语句
show create database school
-
查看数据库中表的数据
show create table student
-
查看表的具体信息
desc student
数据表的类型
-- 关于数据库引擎
/*
默认使用INNODB
MYISAM 早些年使用
*/
修改和删除表
修改
修改表名
ALTER TABLE ‘student’ RENAME AS teacher ALTER TABLE 旧表名 RENAME AS 新表名
增加表的字段
ALTER TABLE teacher ADD age INT(2)
修改表的字段(重命名,修改约束)modify:修改 change:改变
ALTER TABLE teacher MODIFY age VARCHAR(11) -- 修改约束 ALTER TABLE 表名 MODIFY 字段名 列属性()
ALTER TABLE teacher CHANGE age age1 INT(2) -- 字段重命名 ALTER TABLE 表名 CHANGE 旧名字 新名字
删除表的字段
ALTER TABLE teacher DROP age1 ALTER TABLE 表名 DROP 字段名
删除
删除表
DROP TABLE IF EXISTS teacher --DROP TABLE IF EXISTS 表名
DML语言
数据库管理语言:Database Manage Language
插入语句
-
insert into 表名(‘字段名’)values ('值'),数据和字段一一对应
INSERT INTO teacher(‘name’) VALUES('学习')
-
插入多个字段
--每个字段对应一个数据
INSERT INTO teacher(`‘password’`,`’sex‘`,`‘birthday’`) VALUES ('111222333','女','1999:11:4')
--一个字段多个数据
INSERT INTO teacher(`‘password’`) VALUES (‘111222333’),('222333'),('333444')
注意事项
1、字段和字段之间使用英文逗号隔开
2、可以同时插入多条数据,values后面的值,需要使用,用逗号隔开 values(),(),(),()
修改
语法:UPDATE 表名 SET 修改的字符名=‘修改的值’ WHERE 条件
UPDATE `teacher` SET `’name‘`='修改1' WHERE `‘id’`=2 -- 不指定条件的情况下,会改动所有表
修改多个属性,用逗号隔开
UPDATE `teacher` SET `’name‘`='修改2',`‘email’`='1903467504@qq.com' WHERE `‘id’`=2
通过多个条件定位
UPDATE `teacher` SET `’name‘`='修改3' WHERE `‘password’`='123456' AND `’name‘`='学白'
where 的几个特殊条件:
between 2 and 5:2到5之间,包括2和5
and:表示&&
OR:表示||
删除
delete命令
--删除数据
DELETE FROM ‘student’
--删除指定数据
DELETE FROM 'student' WHERE 'id'=2
TRUNCATE命令
作用:完全清空一个数据库表,表的结构和索引约束不会变
TRUNCATE 'student'
delete和truncate的区别
-
相同点:都能删除数据,都不会删除表结构
-
不同点:truncate之后自增会归零、delete不会影响自增
truncate不会影响事物
DQL语言
数据库查询语言:Database Query Language
关键字:select
指定查询字段
-- 查询学生的全部信息 select 字段名 from 表 *表示全部
SELECT * FROM student
SELECT * FROM grade
-- 查询指定字段
SELECT `studentno`,`subjectno` FROM result
-- 别名,给查询结果起一个名字(关键字as) 格式:select 字段名 AS 字段别名,...from 表名 AS 表的别名
SELECT `studentname` AS 学生姓名,`sex` AS 学生性别 FROM student AS 学生表
-- 函数 concat(a,b):拼接
SELECT CONCAT('学生姓名:',studentname) AS 新格式 FROM student
语法:select 字段,... from 表
有的时候,列名字不是那么的见名知意,我们可以起别名(AS) 字段名 AS 别名 表名 AS 别名
查询MySQL系统版本
SELECT VERSION()
加减乘除查询
SELECT 100*2/4+15-20 AS 计算的结果 -- 加减乘除查询
去重
关键字:distinct
作用:去除select语句查询出来的的结果中重复的数据,重复的数据只显示一条
SELECT DISTINCT 'studentNo' FROM result -- 发现重复数据,去重
数据库的列
-- 查询MySQL系统版本
SELECT VERSION()
-- 查询自增的步长
SELECT @@auto_increment_increment
数据库中的表达式:文本值,列,NULL,函数计算表达式,系统变量
SELECT 表达式 from 表
where条件子句
作用:检索数据中符合条件的值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b | 逻辑与,两个都为真,结果为真 |
or || | a or b | 逻辑或,其中一个为真,则结果为真 |
Not !(取反) | not a | 逻辑非,真为假,假为真 |
-- 查询考试成绩在80-100分的学生
SELECT `studentno`,`studentresult` FROM result
WHERE studentresult>=80 AND studentresult<=100
-- 模糊查询(区间)
SELECT studentno,studentresult FROM result
WHERE studentresult BETWEEN 90 AND 100
-- 除了1000号学生之外的同学的成绩
SELECT studentno,studentresult FROM result
WHERE studentresult !=95
SELECT studentname,sex,phone FROM student
WHERE NOT sex=1
模糊查询
比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为null,结果为真 |
IS NOT NULL | a is not null | 如果操作符为 not 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,a3...其中的某一个值中,结果为真 |
-- like关键字 %(代表0到任意个字符) _(代表一个字符)
-- 查询姓张的同学
SELECT `studentno`,`studentname`,`address`,`sex` FROM student
WHERE studentname LIKE '张%';
-- 查询名字当中有强的同学
SELECT `studentno`,`studentname`,`address`,`sex` FROM student
WHERE studentname LIKE '%张%';
-- In关键字
-- 查询课程时长在100和110小时的克
SELECT `subjectno`,`subjectname`,`classhour` FROM `subject`
WHERE classhour IN (110,100)
-- null和not null
联表查询
Join对比
left join、inner join、right join
操作 | 描述 |
---|---|
Inner join | 如果表中至少有一个匹配,就返回行 |
left join | 会从左表中返回所有的值,即使右表中没有匹配 |
right join | 会从右表中返回所有的值,即使左表中没有匹配 |
-- ====================联表查询=====================
-- left join Inner join Right join
-- join (连接的表)on (判断条件) 连接查询(这是个语法)
-- where 等值查询(这是个条件)
-- Inner join
SELECT s.`studentno`,`studentname`,`address`,`subjectno`,`studentresult`
FROM student AS s
INNER JOIN result AS r
ON s.studentno=r.studentno
-- Left join
SELECT s.`studentno`,`studentname`,`address`,`subjectno`,`studentresult`
FROM student AS s
LEFT JOIN result AS r
ON s.studentno=r.studentno
-- Right join
SELECT s.`studentno`,`studentname`,`address`,`subjectno`,`studentresult`
FROM student AS s
RIGHT JOIN result AS r
ON s.studentno=r.studentno
-- 查询
SELECT s.`studentno`,`studentname`,`address`,`subjectno`,`studentresult`
FROM student AS s
LEFT JOIN result AS r
ON s.studentno=r.studentno
WHERE studentresult IS NULL
-- 查询参加了考试的同学信息,包括学号、学生姓名、科目名、分数
/*
思路:
1、分析需求,分析查询的字段来自哪些表
2、确定使用哪种连接查询
3、确定交叉点(这两个表中的哪个数据是相同的)
*/
SELECT s.`studentno`,`studentname`,`address`,r.`subjectno`,`studentresult`,`subjectname`
FROM student AS s
RIGHT JOIN result AS r
ON s.studentno=r.studentno
INNER JOIN `subject` AS sub
ON r.subjectno=sub.subjectno
查询数据的语法
1、查询数据:select
2、FROM 表 join 连接的表 on 交叉条件
3、假设存在一种多张表查询,先查询两张表再慢慢查询