文章目录
- 1.mysql安装:存储:集合(内存:临时),IO流(硬盘:持久化)
- 2.DDL/DML:char不用动态变化,效率高
- 3.DQL:select(相当于System.out)第一个但在倒数第二执行,备份
- 4.约束和自增长:字段约束(字段的赋值规范)/主键约束(唯一非空且一张表只有一个主键)
- 5.单表缺点和外键约束:多从外 引出
- 6.三种多表关系:中间表两外键
- 7.多表查询:表..join表on
- 8.子查询:优先于主查询产生结果
- 9.事务:一组操作,要么同时成功,要么同时失败
1.mysql安装:存储:集合(内存:临时),IO流(硬盘:持久化)
1.1 服务端
mysql安装包:链接:https://pan.baidu.com/s/18Ctus6BLVrECZP0W-QKtfw 提取码:94s9 。双击mysql-installer-community-5.6.22.0.msi。
上面next,execute安装后,下面开始配置。
1.2 客户端
命令行输入mysql -u…实际是如下安装路径的bin文件夹的mysql.exe。同理命令行java -version要配环境变量。看mysql有没有运行,只能从任务管理器看有没有mysql的进程。
win下cmd输入:完整版没有括号:mysql -h(host)
127.0.0.1 -P(port)
3306 -u(username)
root -p(password)
。简略版:mysql -u root -p。
可视化工具navicat链接:https://pan.baidu.com/s/11qAEA7yEGSIz6J9GIC_S6A 提取码:1w9n
navicat免安装链接:https://pan.baidu.com/s/1zanhYyyNsUXajI-czfW7KA 提取码:om5g
2.DDL/DML:char不用动态变化,效率高
如下中间蓝框里一个数据库相当于一个excel表
,紫色框里一个table相当于excel表里的一个sheet
。use 数据库相当于双击打开excel表格,select查看函数返回值,desc全称description,like复制表结构,change 旧字段 新字段 新类型
。
数据库名字不建议修改,用数据库备份改名(新建一个数据库,把原数据库数据复制过来)。mysql中utf-8中-无法识别,用utf8。ISO-8859-1用latin1。
注意(),逗号,分号
如下数(整小)日字
,oracle数据类型见文章第2章【C/C++10】,oracle两个不同:number包含整小,varchar2。
选用timestamp而不用datetime,因为datetime不会自动设置时间。
int(11)默认11位不用写出来,2147483647即21亿10位
,如果有负数还有最前面一位是符号位,所以一共11位
。
如下是表记录,select非常多,删除只是记录,表结构还在。
DDL后面不需要加from等词,D【cdat】CM【idu】Q。
如下单引号可加可不加。
如下要写两个add。
3.DQL:select(相当于System.out)第一个但在倒数第二执行,备份
如下3中第一排序字段相同的里面再进行第二排序。
如下查询id是1或3或5的学生。
d低下降,只要有数字都比null大。
如下有英语成绩有6个,不能代表总人数,缺考没算入。
select后的第一个字段要和group by后同。
如下是select语句执行顺序,红字书写顺序必须这样。
sql只有一种情况报错:语法写错。如下索引越界不会报错。
page和count是前端传来的两个参数,count不用变。
数量(count(*))降序只要一个(limit 1)。
如下将db3数据库整个连数据备份,本质create,insert。
记住mysqldump和source。
4.约束和自增长:字段约束(字段的赋值规范)/主键约束(唯一非空且一张表只有一个主键)
如下验证主键唯一和非空
,如下两个框都报错。
如下的Null列表示是否允许为空。
5.单表缺点和外键约束:多从外 引出
多表是外键约束的前提,外键约束解决下面多表的2个问题,add…多了一条线。alter table emploee drop foreign key
fk_001。
如上是在已有表添加外键,如下建表就添加(开发中常用)。
如果要删除department表的id为001即整个研发部门,需要先在employee表中删除id=001的很多记录,很麻烦。现在想要删除department的001部门时employee为001的行也一起删了,所以用外键级联操作
,如下create table …中省略同上。
6.三种多表关系:中间表两外键
一对一(简历),一对多(员工,部门),多对多(学生,课表)。
7.多表查询:表…join表on
CREATE DATABASE day03;
USE day03;
-- 创建部门表
CREATE TABLE dept (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
-- 创建员工表
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1), -- 性别
salary DOUBLE, -- 工资
join_date DATE, -- 入职日期
dept_id INT
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
如下要查出有用的记录需要emp.dept_id(emp外键)=dept.id(dept主键)。
因为select * ,所以将两个橙色横框拼接起来,棕色框。
7.1 外连接:左外=左表+内连接
如下注意记住左表不动。
如下第一个内连接没有销售部(销售部没有和员工表任何数据相交),第二个有销售部。
union all不去重,左外连接+右外连接。
8.子查询:优先于主查询产生结果
如下执行两句sql,要连接两次数据库,子查询一般要写在()里。
如下1,2是dept_id,可以把in换成 = any
。
如下第一行和第二行效果相同。
如下两个select等价。
如下还是写上面的题目,如果用内连接,沙僧会没有,左外或右外连接都可以。
如下将上面的id1列去除(即将dept表的id列去除不显示)。
on比where先执行。
-- 11111111111111111111111111111111111111111111111111111111111111111部门表
CREATE TABLE dept (
id INT PRIMARY KEY PRIMARY KEY, -- 部门id
dname VARCHAR(50), -- 部门名称
loc VARCHAR(50) -- 部门位置
);
-- 添加4个部门
INSERT INTO dept(id,dname,loc) VALUES
(10,'教研部','北京'),
(20,'学工部','上海'),
(30,'销售部','广州'),
(40,'财务部','深圳');
-- 1111111111111111111111111111111111111111111111111111111职务表,职务名称,职务描述
CREATE TABLE job (
id INT PRIMARY KEY,
jname VARCHAR(20),
description VARCHAR(50)
);
-- 添加4个职务
INSERT INTO job (id, jname, description) VALUES
(1, '董事长', '管理整个公司,接单'),
(2, '经理', '管理部门员工'),
(3, '销售员', '向客人推销产品'),
(4, '文员', '使用办公软件');
-- 11111111111111111111111111111111111111111111111111111111111111111111员工表
CREATE TABLE emp (
id INT PRIMARY KEY, -- 员工id
ename VARCHAR(50), -- 员工姓名
job_id INT, -- 职务id
mgr INT , -- 上级领导
joindate DATE, -- 入职日期
salary DECIMAL(7,2), -- 工资
bonus DECIMAL(7,2), -- 奖金
dept_id INT, -- 所在部门编号
CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);
-- 添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
(1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,'罗贯中',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10);
-- 1111111111111111111111111111111111111111111111111111111111111111工资等级表
CREATE TABLE salarygrade (
grade INT PRIMARY KEY,
losalary INT,
hisalary INT
);
-- 添加5个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);
如下以dept为主体,分组后再进行count聚合。
因为d.id是主键唯一,所以用group by d.id,效果如下。
坑1:如上财务部没人也需要写0,所以如下用外连,如下第一个sql产生效果同上面第一个,就多了财务部一行。
count(*)是整行记录。
9.事务:一组操作,要么同时成功,要么同时失败
如下若在执行一次sql前执行一次start transaction,若不commit,刷新数据库不显示。