reference
数据库
作用:存数据
数据库,是一个软件
数据库分类
-
关系型数据库(SQL) MySQL, oracle, sql server 通过表和表之间,行和列之间的关系进行数据的存储,如学员信息表,考勤表...
-
非关系型数据库(NoSQL) not only SQL Redis,MongoDB 对象存储,通过对象的自身的属性来决定
DBMS (数据库管理系统)
比如,我们写在Excel的数据,得用Excel打开。就算我们没有这个Excel这个软件,那些数据也是存在的。
作用:数据库的管理软件,管理和操作数据
DBMS和DB的关系:DSMS去DB里面操作数据,DB是存数据的
MySQL
5.7版本稳定 8.0也在用
关键4步:启动MySQL、用账户密码登录、退出登录、关闭MySQL
1. 启动MySQL服务
1.1 方法一:mac 在系统偏好设置里面去启动
1.2 方法二:sudo /usr/local/MySQL/support-files/mysql.server start
2. 终端输入:mysql -u root -p
3. 输入密码,回车后进入mysql命令行
4. 输入:exit; 退出登录
5. 关闭Mysql服务
5.1 方法一: mac 在系统偏好设置里面去关闭
5.2 方法二: sudo /usr/local/mysql/support-files/mysql.server stop
重启MySQL服务
sudo /usr/local/mysql/support-files/mysql.server restart
命令行连接数据库
终端变成这样: >mysql
所有的语句都使用分号结尾
单行注释: --
多行注释:
/*
hello
bye
*/
退出: exit;
show databases;
use db_name;
show tables;
describe tabele_name;
exit;
操作数据库
操作数据库>操作数据库中的表>操作数据库中表的数据
mysql关键字不区分大小写
[] 可选 () 必选
如果你的表名或者字段名是一个特殊字符,就需要带 ``
SELECT `user` FROM student;
(注:user是特殊字符,已经被用了的;不然就会变成这样:SELECT USER FROM student;)
数据库的列类型
数值
- int 标准的整数 4个字节 ***常用***
- decimal 字符串形式的浮点数 金融计算的时候,一般使用decimal
字符串
- char 字符串固定大小的 0-255
- varchar 可变字符串 0-65535 ***常用***
- text 文本串 2的16次方-1 保存文本
时间日期
- date YYYY-MM-DD
- time HH:mm:ss
- datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式 ***常用***
- timestamp 时间戳 毫秒数 较为常用
- year
null
没有值,未知
不要使用null进行运算
数据库的字段属性 (重点)
default
comment
not null
auto_increment 自增
unsigned 声明该列不能为负数
写SQL注意点
使用英文的()
表的名称,字段,尽量用 `` 包括起来
AUTO_INCREMENT 自增
所有的语句后面加 , (英文的),最后一条语句不用加
PRIMARY KEY 主键 一般一个表只有唯一一个主键
sql 的大小写不敏感(建议写小写,不然自己不认识)
CREATE TABLE IF NOT EXISTS `student` (
`id` INT 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 'birthday',
`address` VARCHAR(100) DEFAULT NULL COMMENT 'address',
`email` VARCHAR(50) DEFAULT NULL COMMENT 'emial',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
格式
注:下文用[]括起来的,表示可选的
CREATE TABLE [IF NOT EXISTS] `表名` (
`字段名` 列类型 [属性] [索引] [注释]
PRIMARY KEY(`主键名`)
)[表类型][字符集设置]
常用命令
SHOW CREATE DATABASE school; -- 查看创建数据库school的语句
SHOW CREATE TABLE student; -- 查看student数据表的定义语句
DESC student; -- 显示表的结构
数据库引擎
INNODB 默认使用
MYISAM 早些年使用的
区别:略。。
INNODB引擎,所有数据库文件都存在data目录下,本质还是文件的存储。
设置数据库表的字符集编码
MySQL默认的编码,不支持中文
所以在创建数据库表的时候修改为如下:
CHARSET=utf8
修改表 的公式
修改表名
ALTER TABLE `teacher` RENAME AS teacher1;
-- 从 teacher 修改为 teacher1
增加表的字段
ALTER TABLE `teacher1` ADD `gender` VARCHAR(3);
修改表的字段
ALTER TABLE `teacher1` MODIFY `age` VARCHAR(11); -- 修改约束
ALTER TABLE `teacher1` CHANGE `age` `age1` INT; -- 字段重命名
modify 只能修改字段类型和约束,不能用来字段重命名
change 用来字段重命名,不能修改字段类型和约束
删除表的字段
ALTER TABLE teacher1 DROP age1;
删除表 的公式
DROP TABLE if EXISTS teacher1;
所有创建和删除操作,尽量加上判断,以免报错
MySQL数据管理
外键 (了解即可)
key word: constraint 约束
引入外键的目的:比如有学生表和年级表2张表,要查学生的年级信息,得关联起来。
学生表字段:学生id age sex 等
年级表字段:年级id 年级名 年级负责人 等
敲命令行写,有2种方式:1. 建表的时候加外键;2. 创建表的时候没有外键,用alter修改表,constraint增加外键。 【略,但是得看懂】
这2种方式都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰,了解即可)
最佳实践
-
数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
-
我们想要使用多张表的数据,想使用外键(程序去实现)
【强制】 不得使用外键与级联,一切外键概念必须在在应用层解决
(不然每次做delete或者update的时候都必须考虑外键约束)
DML语言 (全部记住)
数据操作语言
-
insert
-
update
-
delete
添加
以下是grade表,字段为:gradeid, gradename, pwd
INSERT INTO `grade`(`gradename`) VALUES('大四'); -- 插入单个字段
INSERT INTO `grade` VALUES(2,'大三'); -- 如果不写表的字段,它就会一一匹配,其它为空null
INSERT INTO `grade`(`gradename`) VALUES('大二'),('大一'); -- 插入多行
INSERT INTO `grade`(`gradename`,`pwd`)
VALUES ('高三','123456'); -- 插入多列 (sql语句可以换行写)
-- 另一个student表的例子
INSERT `student` (`name`,`pwd`,`sex`,`gradeid`)
VALUES('lake','123456','1','6'),('lake2','123456','2','8');
语法
INSERT INTO 表名([字段名1,字段2,字段3]) VALUES('值1','值2','值3');
注意事项:
写插入语句,一定要数据和字段一一对应
字段是可以省略的,但是后面的值必须一一对应
可以同时插入多条数据
修改
UPDATE `student` SET `name`='lake' WHERE id=1; -- 修改一个属性
UPDATE `student` SET `name`='lake',`email`='qq.com' WHERE id=1; -- 修改多个属性
语法
UPDATE 表名 SET 列名1='值1'[,列名2='值2'] WHERE [条件];
符号:
-
不等于:!= 或者 <>
UPDATE
studentSETname='lake' WHERE id!=1;UPDATE
studentSETname='lake' WHERE id<>1; -
闭合区间: between ... and ...
UPDATE
studentSETname='lake' WHERE id BETWEEN 1 AND 2; -- 包括id为1,id为2 -
AND 多个条件
-
OR
-
其它简单的:< = > >= <=(小于 等于 大于...)
注意点:
筛选的条件,如果没有指定,则会修改所有的列
value,是一个具体的值,也可以是一个变量(一般只有时间会用)
删除
DELETE FROM `student` WHERE id = 1;
专业的删数据命令:TRUNCATE student (好处:清空自增)
避免使用:DELETE FROM student (不会清空自增)
语法
DELETE FROM student WHERE id = 1;
DQL查询数据 (重点)
以下所有的代码,都是操作 school.sql 的。
所有的查询操作都用它 Select
数据库中最核心的语言,最重要的语句
简单查询
SELECT * FROM student;
-- 查询指定字段
SELECT `StudentNo`,`StudentName` FROM student;
-- 别名,给结果起名 (可以给字段、表起别名)
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student AS S;
-- 函数 contact(a,b)
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student; -- 输出:姓名:学生名
去重
-- 查询有哪些同学参加了考试
SELECT `StudentNo` FROM `result`;
SELECT DISTINCT `StudentNo` FROM `result`; -- 去重
表达式
SELECT `StudentNo`,`StudentResult`+1 AS 提分 FROM `result`;
where
-- 以下2种:区间
SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE StudentResult>=95 AND StudentResult<=100;
SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE StudentResult BETWEEN 95 AND 100;
-- 以下2种:不等于
SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE StudentResult !=70;
SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE NOT StudentResult=70;
模糊查询
包括:
-
like
-
in
-
null
-
not null
-
between ... and
Like
-- 查询刘姓, %(代表0到任意个字符) _(代表一个字符)
-- 查所有刘姓
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘%';
-- 查所有刘姓中,名字后面有1个字
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘_';
-- 查所有刘姓中,名字后面有2个字
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘__';
-- 查名字中有 强 的
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '%强%';
in
in(具体的一个,或者多个值)
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE address IN('安徽');
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE studentno IN(1001,1003);
null , not null
-- 查询为空的
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE borndate IS NULL;
-- 查询不为空的
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE borndate IS NOT NULL;
todo: 看到19集