MySQL安装和配置
简单原理
使用了一系列week5的指令在vagrant上安装了数据库
$ sudo apt install mariadb-{server,client}
Exercise: What doesecho {a,b,c}-{1,2,3}
print? Try and guess before running it.
Answer:a-1 a-2 a-3 b-1 b-2 b-3 c-1 c-2 c-3
$ sudo systemctl status mariadb
$ sudo journalctl -u mariadb
- set run by default
$ sudo systemctl enable mariadb
命令行-链接sql
If 客户端 —> 3306(端口)Mysql服务(保证运行状态)
此时链接sql指令:mysql -h 主机IP -P 端口 -u 用户名 -p密码
- 密码和p不加空格
- 若p后无密码,mysql要求输入密码
- 如果没有
-h 主机
,默认本地 - 如果没有
-P
, 默认3306 - 实际开发中,往往要修改端口3306(容易遭受黑客攻击)
- 链接数据库前,确保它处于运行状态(running…)
图形可视化MySQL管理软件
Navicat安装和使用
数据库
三重结构
- MySQL就是在主机安装一个数据库管理系统(DBMS-database manage system)
- DBMS可以管理多个数据库
- 一个数据库可以创建多个表,保存数据
图示
MySQL数据库-普通表的本质仍然是文件
SQL语句分类
- DDL: 数据定义语句[create 表,库…]
- DML: 数据操作语句[增加insert;修改update;删除delete]
- DQL: 数据查询语句[select]
- DCL: 数据控制语句[管理数据库,用户权限: grant revoke]
通过java程序操作数据库
也可以通过java程序来操作SQL。
创建数据库
- 基本语法
CREATE DATABASE [IF NOT EXISTS] db_name
[DEFAULT]CHARACTER SET sharset_name
: 指定数据库采用字符集,若不指定,默认utf-8.[DEFAULT]COLLATE collation_name
: 指定数据库字符集的校对规则。- utf8_bin -> 区分大小写
- utf8_general_ci -> 不区分大小写
练习:
db01 -> 单纯创建表
db02 -> 创建表 + 使用utf8字符集
db03 -> 创建表 + 使用utf8字符集 + 带区分大小写的校对规则1
2
3
4
5
6
7
8
9
10
11
12root@debian12:/home# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 39
Server version: 10.11.6-MariaDB-0+deb12u1 Debian 12
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> CREATE DATABASE hsp_db01;
MariaDB [(none)]> CREATE DATABASE hsp_db02 CHARACTER SET utf8;
MariaDB [(none)]> CREATE DATABASE hsp_db03 CHARACTER SET utf8 COLLATE utf8_bin;
查询数据库
- 显示数据库
SHOW DATABASES;
- 查看当前创建数据库定义信息
SHOW CREATE DATABASE db_name;
- 删除数据库
DROP DATABSE db_name;
慎重删库 - 创建数据库表的时候,用反引号解决规避关键字的问题’`’这东西
备份&恢复数据库重要
- 备份数据库DOS那儿执行:
mysqldump -u root -p -B db_name db_name > path\\bak.sql
- 恢复数据库: 先进入
mysql
mysql里执行之后再source path\\bak.sql
第二个方法:直接将bak.sql内容放到查询编辑器中,执行(但是一般还是进入sql里方法好)
Mysql数据类型(列类型 = 数据类型)
一些常用的数据类型(字段类型)
数值类型
其他类型
要存放非常非常大的数值: DECIMAL可以办到(而且它的精度也是最高的)
char固定长度;verchar可变长度。 查询速度char > verchar。 都是255
表 - 一定是在数据库里面(不单独存在)
创建
- 基本语法:
1
2
3
4
5CREATE TABLE table_name(
field1 datatype;
field2 datatype;
field3 datatype;
)character set 字符集 collate 校对规则 engine 存储引擎
1 | MariaDB [(none)]> use hsp_db02; |
反引号很重要(斜着的那个东西`)
创建表练习
1 | MariaDB [hsp_db02]> create table `emp`( id INT, `name` VARCHAR(255), sex CHAR(1), `birthday` DATE, entry_date DATETIME, job VARCHAR(32), salary DOUBLE, `resume` TEXT); |
修改
添加列
1
2
3ALTER TABLE tablename
ADD (column datatype [DEDAULT expr]
[, colunm datatype]...);修改列
1
2
3ALTER TABLE tablename
MODIFY (column datatype [DEDAULT expr]
[, colunm datatype]...);删除列
1
2ALTER TABLE tablename
DROP (column);查看表的结构
desc 表名;
-可以查看表所有的列修改表名
rename table table_name to new_table_name
修改表字符集
alter table table_name character set 字符集
练习题:
答案:
1 | MariaDB [hsp_db02]> ALTER TABLE `emp` |
CRUD(重要)
- C - CREATE
- R - READ
- U - UPDATE
- D - DELECT
INSERT 语句 - 插入数据
语法
1 | INSERT INTO table_name column |
练习
使用INSERT语句向表employee中插入两个员工信息
1 | MariaDB [hsp_db02]> insert into `employee`(id,user_name,birthday,entry_date,job,salary,resume,image) |
注意事项
- 插入数据与字段数据类型相对
- 数据长度应在规定范围内
- values里的值和表头应该一一对应
- 字符&日期数据类型 -> 单引号引起来
- 列可以插入空值,前提是该字段允许为空:
insert into table value(null)
- 添加多条记录:
insert into table_name (列名) values (),(),()
- 给表中所有字段添加数据,可以不写前面的字段名称(表会默认匹配)
- 不给某个字段值的时候,有默认->添加默认;无默认->报错(希望指定某个表的默认值,创建表的时候写默认)
UPDATE语句 - 更新数据
基本语法:
1 | UPDATE table_name |
练习
1 | MariaDB [hsp_db02]> update employee SET salary = 5000; |
注意事项
- UPDATE 更新原有表中的各列
- SET 语句指定要修改哪些值,也可以修改多个列
- WHERE语句指定更新哪行,没有的话则所有的行都被更新
SELETE语句 - 选择数据
基本语法:
1 | SELECT DISTINCT * | {column1, column2, column3...} |
- 可以使用表达式对查询的列进行运算
记得整理select函数的一些用法
单表
查询加强
1 | # 表查询 - 加强 |
分页查询 - 重要
1 | # SELECT ... LIMIT start,rows start从0开始,从start+1行起,取出三行 |
分组增强
1 | # group by |
多子句查询
1 | # 会有一个不能写错的顺序 |
多表
对两个或两个以上的表进行查询。
过滤是重点
多表笛卡尔集
1 | # 规则: 从第一张取出每一行,和第二张表的每一行进行组合,返回结果【所有列col1*col2】 |
过滤条件不少于(表个数-1)
多表查询
1 | # 姓名,工资,薪水级别(两张表) |
自链接
将同一张表看成两张表: 找到在同一张表的关联方法
1 | # 显示员工名字 + 上级名字 |
子查询
把一个select语句的查询结果拿来,一个子查询来用
多行
1 | SELECT DISTINCT job |
临时列表
1 |
DELETE语句 - 删除数据
基本语法:
1 | DELETE from table_name |
练习
1 | MariaDB [hsp_db02]> delete from employee |
注意事项
- 不加where,整个表就会被删空
- delete语句不能删除某一列的值(delete删除的是行)
可以用updat设置为null或’’ - delete只能删除表里的数据,但是删除不了表本身(
DROP TABLE table_name
是删表的)
函数 - 先跳过
字符串函数
日期函数
加密函数
流程控制函数
内连接
外连接
左外连接和右外连接。
左外连接
左侧的表完全显示。
1 | SELECT ... from 表1 left join 表2 on 条件 #表1是左表,表2是右表 |
右外连接
右侧的表完全显示。
1 | SELECT ... from 表1 right join 表2 on 条件 #表1是左表,表2是右表 |
约束
主键
- unique & not null
- 一张表中最多只有一个主键,但可以复合主键 # PRIMARY KEY(id,
name
)这种unique
- 表示列是不可以重复的
- 没指定not null,则unique可以有多个null
- 一张表可以有多个unique字段
not null
- 不让指定列为null
- 如果约束条件为 unique + not null, 其实和主键没啥区别(但是这样约束出来的不是主键)
外键
定义主表和从表之间的关系。外键约束定义在从表上,主表必须有主键约束或是unique约束。FOREIGN KEY(本表字段名) REFERENCES 主表名(主键名或unique字段)
- 主外键关系一旦定义,数据不能随意删除了。
check
强制指定数据必须满足的条件。索引