1、连接数据库
mysql -u root -p123456 -- 连接数据
update mysql.user set authentication_string=password('admin') where user='root' and Host = 'localhost'; -- 修改用户密码
flush privileges; -- 刷新权限
----------------------------------------------------
-- 所有的语句都使用《;》结尾
show databases; -- 查看全部数据库
mysql> use school -- 切换数据库 : use 数据库名
Database changed -- 提示成功
mysql> show tables; -- 查看数据库中所有的表
mysql> describe student; -- 显示数据库中所有的表信息 : describe 表名
mysql> create database westos; -- 创建一个数据库:create database 数据库名
exit --退出连接
-- 单行注释(SQL的本来注释)
/* SQL的多行注释 */
数据库xxx语言 CURD 增删改查
DDL 定义
DML 操作
DQL 查询
DCL 控制
2、操作数据库
操作数据库>操作数据库中的表>操作数据库中表的数据
mysql关键字不区分大小写
2.1、操作数据库
1、创建数据库
CREATE DATABASE [IF NOT EXISTS] westos; -- []中视情况为可选内容
2、删除数据库
DROP DATABASE [IF EXISTS] westos;
3、使用数据库
-- 如果表名或者字段名是一个特殊字符,就需要带``
USE `school`;
4、查看数据库
SHOW DATABASES; -- 查看所有的数据库
学习思路:
-
对比:SQLyog的可视化操作
-
固定的语法或关键字必须要记住!
2.2、数据库的列类型
数值
-
tinyint 十分小的数据 1个字节
-
smallint 较小的数据 2个字节
-
mudiumint 中等大小的数据 3个字节
-
int 标准的整数 4个字节 常用
-
bigint 较大的数据 8个字节
-
float 浮点数 4个字节
-
double 浮点数 8个字节(精度问题!)
-
decimal 字符串形式的浮点数 金融计算的时候,一般是使用decimal
字符串
-
char 字符串固定大小的 0-255
-
varcahr 可变字符串 0-65535 相当于java中常用的String
-
tinytext 微型文本 2^8 - 1
-
text 文本串 2^16 - 1 保存大文本
时间日期
java.util.Date(java中的类)
-
date yyyy-MM-dd,日期格式
-
time HH:mm:ss,时间格式
-
datetime yyyy-MM-dd HH:mm:ss 最常用的时间格式
-
timestamp 时间戳 1970.1.1 到现在的毫秒数! 也较为常用
-
year 年份表示
null
-
没有值/未知
-
注意,不要使用NULL进行运算,结果为NULL
2.3、数据库的字段属性(重点)
Unsigned:
-
无符号的整数
-
声明了该列不能声明为负数
zerofill:
-
0填充
-
不足的位数,使用0来填充:int(3) , 5 ---> 005
自增:
-
通常理解为自增,自动在上一条记录的基础上+1(默认)
-
通常用来设计唯一的主键~index,必须是整数类型
-
可以自定义设计主键自增的起始值和步长
非空: null 和 not null
-
假设设置为 not null,如果不给它赋值,就会报错
-
null,如果不填写值,默认就是null
默认:
-
设置默认的值
-
sex,默认值为 男 ,如果不指定该列的值,则会有默认的值
拓展:
/* 每个表,必须存在以下五个字段。未来做项目用的,表示一个记录存在的意义
id 主键
‘version’ 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
*/
2.4、创建数据库表(重点)
-- 注意点:使用英文(),表的名称 和 字段 尽量使用``括起来
-- 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(RIBE) student -- 显示表的结构
2.5、数据表的类型
-- 关于数据库引擎
/*
INNODB 默认使用
MYISAM 早些年使用的
*/
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持(表锁) | 支持(行锁) |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大,约为MYISAM的2倍 |
常会使用操作:
-
MYISAM 节约空间,速度较快
-
INNODB 安全性高,事务的处理,多表多用户操作
在物理空间存在的位置
所有的数据库文件都存在data目录下,一个文件夹就对应一个数据库
本质还是文件的存储
MySQL 引擎在物理文件上的区别
-
InnoDB: 在数据库表中只有一个*.frm,以及上级目录下的ibdata1文件
-
MYISAM对应文件
-
*.frm - 表结构的定义文件
-
*.MYD - 数据文件(data)
-
*.MYI - 索引文件(index)
-
设置数据库表的字符集编码
CHARSET=utf8
不设置的话,会是mysql默认的字符集编码~(不支持中文!)
MySQL的默认编码是Latin1,不支持中文
在my.ini中配置默认的编码
character-set-server=utf8
2.6、修改删除表
修改
-- 修改表 ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher1
-- 增加表的字段 ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher1 ADD age INT(4)
-- 修改表的字段(重命名,修改约束!)
ALTER TABLE teacher1 MODIFY age VARCHAR(11); -- 修改约束
ALTER TABLE teacher1 CHANGE age age1 INT(4); -- 字段重命名
-- 删除表的字段
ALTER TABLE teacher1 DROP age1;
删除
-- 删除表
DROP TABLE IF EXISTS teacher1;
所有的创建和删除操作尽量加上判断,以免报错
注意点:
-
所有的字段名,使用``包裹
-
注释 -- /**/
-
sql关键字大小写不敏感,建议大家写小写
-
所有的符号全部用英文
3、MySQL数据管理
3.1、外键(了解即可)
方式一:在创建表的时候,增加约束(麻烦,比较复杂)
CREATE TABLE `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级',
`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 DEFAULT 0 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
方式二:创建表成功后,添加外键约束
-- 创建表的时候没有外键关系
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
以上操作都是物理外键,数据库级别的外键,我们不建议使用(避免数据库过多造成困扰,这里了解即可)
最佳实践
-
数据库就是单纯的表,是用来存数据,只有行(数据)和列(字段)
-
我们像使用多张表的数据,想使用外键(程序去实现)
3.2、DML语言(全部记住)
数据库的意义:数据存储、数据管理
DML语言:数据操作语言
-
insert
-
update
-
delete
3.3、添加
insert
-- 插入语句(添加)
-- insert into 表名([字段名1,字段2,字段3])values('值1'),('值2'),('值3'),(....)
INSERT INTO `grade`(`gradename`) VALUES ('大四')
-- 由于主键自增,我们可以省略(如果不写表的字段,他就会一一匹配)
INSERT INTO `grade` VALUES ('大三');
-- 一般写插入语句,我们一定要数据和字段一一对应。
-- 插入多个字段
INSERT INTO `grade` (`gradename`) VALUES ('大二'),('大一');
INSERT INTO `student` (`name`) VALUES ('张三')
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('李四','aaaaaa','男')
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES
('张三','ABCABC','男'),('王五','abeabe','男')
语法:insert into 表名([字段名1,字段2,字段3,...])values('值1'),('值2'),('值3'),(....)
注意事项:
1.字段和字段之间使用 英文逗号 隔开
2.字段是可以省略的,但是后面的值必须要一一对应,不能少(包括自增项)
INSERT INTO `student` VALUES
(5,'李四','aaaaaa','男','2000-01-01',1,'西安','email')
3.可以同时插入多条数据,VALUES后面的值,需要使用‘,’隔开即可:
values('值1'),('值2'),('值3'),(....)
3.4、修改
update 修改(条件) set原来的值 = 新值
-- []内容为可选
-- 修改学员名字(带了条件)
UPDATE `student` SET `name` = '狂神' WHERE id = 1;
-- 不指定条件的情况下,会改动所有的值
UPDATE `student` SET `name` = '长江7号';
-- 语法:
-- 修改多个属性‘,’隔开
-- UPDATE 表名 SET colnum_name = value[,colnum_name = value] [WHERE 条件]
条件:where子句 运算符 id等于某个值,大于某个值,在某个区间内…
操作符会返回 布尔值
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或!= | 不等于 | 5<>6 | true |
> | 大于 | ||
< | 小于 | ||
>= | 大于等于 | ||
<= | 小于等于 | ||
between...and... | 在某个范围内 | [2,5] | |
and | 和 && | 5>1and1>2 | false |
or | 或 || | 5>1or1>2 | true |
-- 不指定条件的情况下,会改动所有的值
UPDATE `student` SET `name` = '长江7号';
-- 修改多个属性‘,’隔开
UPDATE `student` SET `name` = '狂神',`email`='123456@qq.com' WHERE id = 1;
-- 通过多个条件定位数据
UPDATE `student` SET `name`='长江6号' WHERE `name`='长江7号' AND `sex`='女';
注意:
-
colnum_name 是数据库的列,尽量带上``
-
条件:筛选的条件,如果没有指定,则会修改所有的列
-
value,是一个具体的值,也可以是一个变量
-
多个设置的属性之间,使用英文‘,’逗号隔开
3.5、删除
delete命令
语法:delete from 表名 [where 条件]
-- 删除数据(避免这样写,会全部删除)
DELETE FROM `student`
-- 删除指定数据
DELETE FROM `student` WHERE `id`=1;
TRUNCATE 命令
作用:完全清空一个数据库表,表的结构和索引约束不会变
-- 清空:TRUNCATE 表名
TRUNCATE `student`
DELETE 和 TURNCATE 区别
-
相同点:都能删除数据,都不会删除表结构
-
不同:
-
TRUNCATE 重新设置 自增列 计数器会归零
-
TRUNCATE 不会影响事物
-
-- 测试delete 和 turncate 区别
CREATE TABLE `test`(
`id` INT(4) NOT NULL AUTO_INCREMENT,
`coll` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE = INNODB DEFAULT CHARSET=utf8
INSERT INTO `test` (`coll`) VALUES ('1'),('2'),('3');
DELETE FROM `test` -- 不会影响自增
TRUNCATE TABLE `test` -- 自增会归零
拓展:DELETE删除的问题,重启数据库的现象:
-
InnoDB 自增列会从1开始(存在内存当中的,断点即失)
-
MYISAM 继续从上一个自增量开始(存在文件中的,不会丢失)