Mysql-学习笔记

文章目录

    • 1. 数据库
        • 1.1 Mysql安装及常用代码
        • 1.2 SQL介绍
        • 1.3 SQL分类
          • 1. DDL-操作数据库,表
          • 2. DML-对表中的数据进行增删改
          • 3. DQL-对表中的数据进行查询
            • 条件查询
            • 模糊查询
            • 排序查询
            • 分组查询
            • 分页查询
          • 4. DCL-对数据库进行权限控制
            • 外键约束
            • 表关系-多对多
            • 多表查询
            • 事务

1. 数据库

1.1 Mysql安装及常用代码

https://blog.csdn.net/meini32/article/details/129047472

1.2 SQL介绍

数据库

  • 存储数据的仓库,数据是有组织的进行存储
  • 英文:DataBase,简称DB

数据库管理系统

  • 管理数据库的大型软件
  • 英文:DataBase Management System,简称DBMS

结构化查询语言

  • 操作关系型数据库的编程语言
  • 定义操作所有关系型数据库的统一标准
  • 英文: Structured Query Language,简称SQL。

关系型数据库
关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的二维表组成的数据库
优点
1.都是使用表结构,格式一致,易于维护。
2.使用通用的SQL语言操作,使用方便,可用于复杂查询。
3.数据存储在磁盘中,安全。

常见的关系型数据库管理系统

  • Oracle:收费的大型数据库
  • MySQL:开源免费中小型数据库
  • SQL Server:收费中型

1.3 SQL分类

  1. DDL(Data Definition Language)数据定义语言
    用来定义数据库对象:数据库,表,列等
  2. DML(Data Manipulation Language)数据操作语言
    用来对数据库中表的数据进行增删改
  3. DQL(Data Query Language)数据查询语言
    用来查询数据库中表的记录(数据)
  4. DCL(Data Control Language)数据控制语言
    用来定义数据库的访问权限和安全级别,及创建用户
1. DDL-操作数据库,表

DDL-操作数据库

1.查询
SHOW DATABASES;

#2.创建
CREATE DATABASE 数据库名称;
CREATE DATABASE IF NOT EXISTS 数据库名称;   (判断)

3.删除
DROP DATABASE 数据库名称;
DROP DATABASE IF EXITS 数据库名称;     (判断)

4.使用数据库
SELECT DATABASE();                 (查看当前数据库名称)
USE 数据库名称;                           (使用)

DDL-操作数据表

# 1.创建
CREATE TABLE 表名(
	字段1 数据类型1,
	字段2 数据类型2,
	字段3 数据类型3,
	字段4 数据类型4);

#2.查询
SHOW TABLES;             (查看当前数据库的所以表)
DESC 表名称;              (查看表结构)

3.修改
ALTER TABLE 表名 RENAME TO 新的表名;             (修改表名)
ALTER TABLE 表名 ADD 列名 数据类型;			    (添加一列)
ALTER TABLE 表名 MODIFY 列名 新数据类型;          (修改列的数据类型)
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;    (修改列明和数据类型)
ALTER TABLE 表名 DROP 列名;                       (删除列)

4.删除
DROP TABLE 表名;                     (直接删除)
DROP TABLE IF EXITSTS 表名;           (判断)

在这里插入图片描述
Mysql-学习笔记_第1张图片
Mysql-学习笔记_第2张图片

2. DML-对表中的数据进行增删改

1添加数据

1.给指定列添加数据
INSERT INTO 表名(列名1,列名2,...) VALUES (1,2...);

2.给全部列添加数据
INSERT INTO 表名VALUES(1,2,...);

3.批量添加数据
INSERT INTO 表名 (列名1,列名2..VALUES(1,2...),(1,2...),(1,2) ...;
INSERT INTO 表名 VALUES (1,2....),(1,2,...),(1,2... ..;

2 修改表数据

UPDATE 表名SET列名1=1,列名2=2,... [ WHERE 条件];

3 删除表数据

DELETE FROM 表名 [WHERE 条件] ;

4 创建一个学生表并添加数据

-- 删除stu表
drop table if exists stu;


-- 创建stu表
CREATE TABLE stu (
 id int, -- 编号
 name varchar(20), -- 姓名
 age int, -- 年龄
 sex varchar(5), -- 性别
 address varchar(100), -- 地址
 math double(5,2), -- 数学成绩
 english double(5,2), -- 英语成绩
 hire_date date -- 入学时间
);

-- 添加数据
INSERT INTO stu(id,NAME,age,sex,address,math,english,hire_date) 
VALUES 
(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');

Mysql-学习笔记_第3张图片

Mysql-学习笔记_第4张图片
Mysql-学习笔记_第5张图片

3. DQL-对表中的数据进行查询
------------------查询语法-------------------

SELECT column1, column2, ...
FROM table_name
WHERE condition
GROUP BY column1, column2, ...
HAVING condition
ORDER BY column1, column2, ... ASC|DESC;
LIMIT 分页限定;
  • SELECT:指定要检索的列名。.
  • FROM:指定要检索数据的表名。.
  • WHERE:指定检索数据的条件。
  • GROUP BY:按指定的列对结果进行分组。
  • HAVING:指定分组的条件。
  • ORDER BY:按指定的列对结果进行排序。
1.查询多个字段
SELECT 字段列表 FROM 表名;
SELECT * FROM 表名;

2.去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;

3.起别名
AS: AS也可以省略

条件查询
SELECT * FROM stu;

-- 条件查询 =====================

-- 1.查询年龄大于20岁的学员信息
-- 2.查询年龄大于等于20岁的学员信息
-- 3.查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息
-- 4.查询入学日期在'1998-09-01' 到 '1999-09-01'  之间的学员信息
-- 5. 查询年龄等于18岁的学员信息
-- 6. 查询年龄不等于18岁的学员信息
-- 7. 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
-- 8. 查询英语成绩为 null的学员信息  
-- 注意: null值的比较不能使用 = != 。需要使用 is  is not
SELECT * FROM stu;

-- 条件查询 =====================

-- 1.查询年龄大于20岁的学员信息
SELECT * FROM stu WHERE age>20;


-- 2.查询年龄大于等于20岁的学员信息

SELECT * FROM stu WHERE age>=20;

-- 3.查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息
SELECT * FROM stu WHERE age>=20 AND age<=30;
SELECT * FROM stu WHERE age>=20 && age<=30;
SELECT * FROM stu WHERE age BETWEEN 20 AND 30;

-- 4.查询入学日期在'1998-09-01''1999-09-01'  之间的学员信息
SELECT * FROM stu WHERE hire_date BETWEEN '1998-09-01' AND '1999-09-01';

-- 5. 查询年龄等于18岁的学员信息
SELECT * FROM stu WHERE age = 18;

-- 6. 查询年龄不等于18岁的学员信息
SELECT * FROM stu WHERE age != 18;
SELECT * FROM stu WHERE age <> 18;

-- 7. 查询年龄等于18岁  或者 年龄等于22岁的学员信息
SELECT * FROM stu WHERE age = 18 OR age=22;
SELECT * FROM stu WHERE age = 18 || age=22;
SELECT * FROM stu WHERE age in (18,22);

-- 8. 查询英语成绩为 null的学员信息
SELECT * FROM stu WHERE english is null;
SELECT * FROM stu WHERE english is not null;

-- 注意: null值的比较不能使用 = != 。需要使用 is  is not


模糊查询
-- 模糊查询 like =====================
/*
	通配符:
	 (1)_:代表单个任意字符
	 (2)%:代表任意个数字符
*/

-- 1. 查询姓'马'的学员信息
-- 2. 查询第二个字是'花'的学员信息   
-- 3. 查询名字中包含 '德' 的学员信息
SELECT * FROM stu;

-- 1. 查询姓'马'的学员信息
SELECT * FROM stu WHERE name like '马%';

-- 2. 查询第二个字是'花'的学员信息   
SELECT * FROM stu WHERE name like '_花%';

-- 3. 查询名字中包含 '德' 的学员信息

SELECT * FROM stu WHERE name like '%德%';

排序查询
/*
	排序查询:
		* 语法:SELECT 字段列表 FROM 表名  ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;
		* 排序方式:
				* ASC:升序排列(默认值)
				* DESC:降序排列
*/

-- 1.查询学生信息,按照年龄升序排列 
-- 2.查询学生信息,按照数学成绩降序排列
-- 3.查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
-- 1.查询学生信息,按照年龄升序排列 
SELECT * FROM stu ORDER BY age ASC;

-- 2.查询学生信息,按照数学成绩降序排列
SELECT * FROM stu ORDER BY math DESC;

-- 3.查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
SELECT * FROM stu ORDER BY math DESC,english ASC;
分组查询
/*
	分组函数
			SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]…;
*/
-- 1. 查询男同学和女同学各自的数学平均分
   (注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意)
-- 2. 查询男同学和女同学各自的数学平均分,以及各自人数
-- 3. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
-- 4.查询男同学和女同学各自的数学平均分,以及各自人数
    (要求:分数低于70分的不参与分组,分组之后人数大于2个的。)
-- 1. 查询男同学和女同学各自的数学平均分
SELECT sex '性别', AVG(math) '数学平均分' FROM stu GROUP BY sex;

-- 2. 查询男同学和女同学各自的数学平均分,以及各自人数
SELECT sex '性别', AVG(math) '数学平均分',COUNT(*) '人数' FROM stu GROUP BY sex;

-- 3. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
SELECT sex '性别', AVG(math) '数学平均分',COUNT(*) '人数' FROM stu  WHERE math>=70 GROUP BY sex;

-- 4.查询男同学和女同学各自的数学平均分,以及各自人数
-- (要求:分数低于70分的不参与分组,分组之后人数大于2个的。)
SELECT sex '性别', AVG(math) '数学平均分',COUNT(*) '人数' FROM stu  WHERE math>=70 GROUP BY sex HAVING COUNT(*)>2;
分页查询
SELECT * FROM stu;

/*
	分页查询:

			SELECT 字段列表 FROM 表名 LIMIT  起始索引 , 查询条目数
				* 起始索引:从0开始

*/
-- 1. 从0开始查询,查询3条数
-- 2. 每页显示3条数据,查询第1页数据
-- 3. 每页显示3条数据,查询第2页数据
-- 4. 每页显示3条数据,查询第3页数据
-- 起始索引 = (当前页码 - 1) * 每页显示的条数
-- 1.0开始查询,查询3条数据
SELECT * FROM stu LIMIT 0,3;

-- 2. 每页显示3条数据,查询第1页数据
SELECT * FROM stu LIMIT 0,3;

-- 3. 每页显示3条数据,查询第2页数据
SELECT * FROM stu LIMIT 3,3;

-- 4. 每页显示3条数据,查询第3页数据
SELECT * FROM stu LIMIT 6,3;

-- 起始索引 = (当前页码 - 1* 每页显示的条数
4. DCL-对数据库进行权限控制

约束的概念

约束是作用于表中列上的规则,用于限制加入表的数据
约束的存在保证了数据库中数据的正确性、有效性和完整性

约束的分类

约束名称 描述 关键字
非空约束 保证列中所有数据不能有null值 NOT NULL
唯一约束 保证列中所有数据各不相同 UNIQUE
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
检查约束 保证列中的值满足某—条件 CHECK
默认约束 保存数据时,未指定值则采用默认值 DEFAULT
外键约束 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性 FOREIGN KEY
DROP TABLE IF EXISTS emp;

-- 员工表
CREATE TABLE emp (
  id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长
  ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
  joindate DATE NOT NULL , -- 入职日期,非空
  salary DOUBLE(7,2) NOT NULL , -- 工资,非空
  bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
  
);
外键约束
/*
	外键约束:
		* 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
		* 
	-- 创建表时添加外键约束
	CREATE TABLE 表名(
		 列名 数据类型,
		 …
		 [CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名) 
	); 


	-- 建完表后添加外键约束
	ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

	-- 删除约束
	ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

*/
-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;


-- 部门表
CREATE TABLE dept(
	id int primary key auto_increment,
	dep_name varchar(20),
	addr varchar(20)
);
-- 员工表 
CREATE TABLE emp(
	id int primary key auto_increment,
	name varchar(20),
	age int,
	dep_id int,

	-- 添加外键 dep_id,关联 dept 表的id主键
	CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
		
);

-- 删除外键
alter table emp drop FOREIGN key fk_emp_dept;

-- 建完表后,添加外键
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);
表关系-多对多
/*
	多对多:
		* 如:订单 和 商品
		* 一个商品对应多个订单,一个订单包含多个商品

	实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
*/
-- 删除表
DROP TABLE IF EXISTS tb_order_goods;
DROP TABLE IF EXISTS tb_order;
DROP TABLE IF EXISTS tb_goods;


-- 订单表
CREATE TABLE tb_order(
	id int primary key auto_increment,
	payment double(10,2),
	payment_type TINYINT,
	status TINYINT
);

-- 商品表
CREATE TABLE tb_goods(
	id int primary key auto_increment,
	title varchar(100),
	price double(10,2)
);

-- 订单商品中间表
CREATE TABLE tb_order_goods(
	id int primary key auto_increment,
	order_id int,
	goods_id int,
	count int
);

-- 建完表后,添加外键
alter table tb_order_goods add CONSTRAINT fk_order_id FOREIGN key(order_id) REFERENCES tb_order(id);
alter table tb_order_goods add CONSTRAINT fk_goods_id FOREIGN key(goods_id) REFERENCES tb_goods(id);

多表查询
select * from emp;

-- 多表查询

select * from emp , dept;

-- 笛卡尔积 : 有 A ,B两个集合 取 A,B所有的组合情况


-- 消除无效数据


-- 查询emp 和 dept 的数据 ,emp.dep_id = dept.did

select * from emp , dept where emp.dep_id = dept.did;
----------------- -------------连接----------------------------------------
1. 查询 emp的 name, gender,dept表的dname
SELECT
	emp. NAME,
	emp.gender,
	dept.dname
FROM
	emp,
	dept
WHERE
	emp.dep_id = dept.did;
--------------------------------------------------------------------------
2. 给表 起别名
SELECT
	t1. NAME,
	t1.gender,
	t2.dname
FROM
	emp t1,
	dept t2
WHERE
	t1.dep_id = t2.did;
-------------------------------显示内连接---------------------------------
3.显式内连接

select * from emp inner join dept on emp.dep_id = dept.did;
select * from emp  join dept on emp.dep_id = dept.did;

-----------------------------------外连接------------------------------------
-- 左外连接
-- 查询emp表所有数据和对应的部门信息

select * from emp left join dept on emp.dep_id = dept.did;

-- 右外连接
-- 查询dept表所有数据和对应的员工信息
select * from emp right join dept on emp.dep_id = dept.did;
select * from dept left join emp on emp.dep_id = dept.did;

----------------------------------子查询---------------------------------------
select * from emp;

-- 1. 查询猪八戒的工资
select salary from emp where name = '猪八戒';

-- 2. 查询工资高于猪八戒的员工信息
select * from emp where salary > 3600;
select * from emp where salary > (select salary from emp where name = '猪八戒');

-- 查询 '财务部''市场部' 所有的员工信息
-- 查询 '财务部' 所有的员工信息

select did from dept where dname = '财务部' or dname = '市场部';
select * from emp where dep_id in (select did from dept where dname = '财务部' or dname = '市场部');

-- 查询入职日期是 '2011-11-11' 之后的员工信息和部门信息
-- 查询入职日期是 '2011-11-11' 之后的员工信息

select * from emp where join_date > '2011-11-11' ;
select * from (select * from emp where join_date > '2011-11-11' ) t1, dept where t1.dep_id = dept.did;


案例分析


-- 1.查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
/*
	分析:
		1. 员工编号,员工姓名,工资 信息在emp 员工表中
		2. 职务名称,职务描述 信息在 job 职务表中
		3. job 职务表 和 emp 员工表 是 一对多的关系 emp.job_id = job.id

*/
-- 隐式内连接
SELECT
	emp.id,
	emp.ename,
	emp.salary,
	job.jname,
	job.description
FROM
	emp,
	job
WHERE
	emp.job_id = job.id;

SELECT
	*
FROM
	emp;

SELECT
	*
FROM
	job;

-- 显式内连接
SELECT
	emp.id,
	emp.ename,
	emp.salary,
	job.jname,
	job.description
FROM
	emp
INNER JOIN job ON emp.job_id = job.id;

-- 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
/*
	分析:
		1. 员工编号,员工姓名,工资 信息在emp 员工表中
		2. 职务名称,职务描述 信息在 job 职务表中
		3. job 职务表 和 emp 员工表 是 一对多的关系 emp.job_id = job.id

		4. 部门名称,部门位置 来自于 部门表 dept
		5. dept 和 emp 一对多关系 dept.id = emp.dept_id

*/

-- 隐式内连接
SELECT
	emp.id,
	emp.ename,
	emp.salary,
	job.jname,
	job.description,
	dept.dname,
	dept.loc
FROM
	emp,
	job,
	dept
WHERE
	emp.job_id = job.id
	and dept.id = emp.dept_id
;

-- 显式内连接
SELECT
	emp.id,
	emp.ename,
	emp.salary,
	job.jname,
	job.description,
	dept.dname,
	dept.loc
FROM
	emp
INNER JOIN job ON emp.job_id = job.id
INNER JOIN dept ON dept.id = emp.dept_id
;


-- 3.查询员工姓名,工资,工资等级
/*
	分析:
		1. 员工姓名,工资 信息在emp 员工表中
		2. 工资等级 信息在 salarygrade 工资等级表中
		3. emp.salary >= salarygrade.losalary  and emp.salary <= salarygrade.hisalary


*/


SELECT
	emp.ename,
	emp.salary,
	t2.*
FROM
	emp,
	salarygrade t2
WHERE
	emp.salary >= t2.losalary
AND emp.salary <= t2.hisalary





-- 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级

/*
	分析:
		1. 员工编号,员工姓名,工资 信息在emp 员工表中
		2. 职务名称,职务描述 信息在 job 职务表中
		3. job 职务表 和 emp 员工表 是 一对多的关系 emp.job_id = job.id

		4. 部门名称,部门位置 来自于 部门表 dept
		5. dept 和 emp 一对多关系 dept.id = emp.dept_id
		6. 工资等级 信息在 salarygrade 工资等级表中
		7. emp.salary >= salarygrade.losalary  and emp.salary <= salarygrade.hisalary
*/
SELECT
	emp.id,
	emp.ename,
	emp.salary,
	job.jname,
	job.description,
	dept.dname,
	dept.loc,
	t2.grade
FROM
	emp
INNER JOIN job ON emp.job_id = job.id
INNER JOIN dept ON dept.id = emp.dept_id
INNER JOIN salarygrade t2 ON emp.salary BETWEEN t2.losalary and t2.hisalary;






-- 5.查询出部门编号、部门名称、部门位置、部门人数
/*
	分析:
		1. 部门编号、部门名称、部门位置 来自于部门 dept 表
		2. 部门人数: 在emp表中 按照dept_id 进行分组,然后count(*)统计数量
		3. 使用子查询,让部门表和分组后的表进行内连接
*/
select * from dept;

select dept_id, count(*) from emp group by dept_id;




SELECT
	dept.id,
	dept.dname,
	dept.loc,
	t1.count
FROM
	dept,
	(
		SELECT
			dept_id,
			count(*) count
		FROM
			emp
		GROUP BY
			dept_id
	) t1
WHERE
	dept.id = t1.dept_id



事务

事务的特点:一致性、原子性、隔离性、永久性;

select * from account;

-- 开启事务
BEGIN;
-- 转账操作
-- 1. 查询李四账户金额是否大于500

-- 2. 李四账户 -500
UPDATE account set money = money - 500 where name = '李四';

-- 出现异常了...
-- 3. 张三账户 +500
UPDATE account set money = money + 500 where name = '张三';

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;



-- 查看事务的默认提交方式
SELECT @@autocommit;
-- 1 自动提交  0 手动提交
-- 修改事务提交方式
set @@autocommit = 0;

你可能感兴趣的:(mysql,学习,笔记)