学习日记(数据库_MySQL)

SQL概述

英文名称为Structured Query Language,译为结构化查询语言
SQL语句可以分多行书写和单行书写,使用分号;作为结尾
通用的注释方式 “-空格 注释内容”,MySQL独有的“#注释内容”
SQl语言的分类(DDL、DML、DQL、DCL)

DDL

-- 对数据库的操作
-- 查询
-- 查询数据库:
show database;
-- 查询数据库下的表:
show tables;
-- 查看当前使用的数据库名称,要有括号:
select database();
-- 创建
-- 创建数据库:
create database 数据库名称;
create database if not exists 数据库名称;
-- 创建表:
create table 表名(列名 数据类型,列名,数据类型......);
-- 删除
-- 删除数据库:
drop database 数据库名称	;
drop database if exists 数据库名称;
-- 删除表:
drop database 表名;
drop database if exists 表名;
-- 使用数据库:
use 数据库名称;
-- 修改表
-- 修改表名
ALTER TABLE 表名 RENAME  TO 新的表名;
-- 添加一列
ALTER TABLE 表名 ADD 列名 数据类型;
-- 修改数据类型
ALTER TABLE 表名 MODIFY 列名 新数据类型;
-- 删除列
ALTER TABLE 表名 DROP 列名;
-- 修改列名和数据类型
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;

DML

-- 对数据表中的数据进行增删改查
-- 添加数据
-- 指定列名:
insert into 表名(列名1,列名2,...) values (值1,值2,...);
-- 不指定列名:
insert into 表名 values (值1,值2,...);
-- 修改数据:
update 表名 set 列名1=值1,列名2=值2,...(while 条件);
update stu set sex = '女' where name = '张三';
-- 删除数据:
delete from 表名 (where 条件)
例如:delete from stu where name = '张三';

DQL

-- 对数据进行查询操作
-- 基础查询,distinct去除重复的数据项
	select * from 表名 AS 别名
	select (distinct) 列名 AS 别名 from 表名
-- 条件查询&&与and有着相同的意思,也可以使用 列名 between 左条件 and 右条件 or或者 !=和<>效果相同 , 要对比null	的时候只能使用is或者is not
	select 列名 from 表名 where 条件
-- 查询“马”姓的同学 select * from stu where name like '马%';
-- 查询第二个字为“花”的同学 select * from stu where name like '-花%';
-- 排序查找,ASC表示升序查询,desc表示降序查询
	select * from stu order by math desc , english asc
-- 聚合函数统计个数count(),最大值max(列名),最小值min(列名),求和sum(列名),求平均值avg(列名)null不参与聚集函数运算,主要放在’*‘的位置
分组查询
	select * from 表名 group by 列名 (having 对聚集函数的判断)
-- 注意,having和where的区别:①执行时机不同,where在分组之前进行限定,不满足where条件则不参与分组,而having是分组之后对结果的筛选。②where不能判断聚集函数,having可以
-- 分页查询,从第(起始索引)的数据,向下显示(查询条数)的数据
	select * from 表名 limit 起始索引,查询条数

DCL对数据库权限进行设置(后面再看)

MYSQL DCL语句_mysqldcl语句-CSDN博客

授权(GRANT)语句:用于授权用户或用户组对数据库对象的访问权限。
撤销(REVOKE)语句:可以收回用户的某个或所有权限。
创建用户(CREATE USER)语句:创建新的数据库用户,并指定用户的登录凭据,如用户名和密码。
删除用户(DROP USER)语句:用于删除指定的数据库用户,包括其权限和相关信息。
修改用户密码(ALTER USER)语句:用于修改数据库用户的密码。
创建角色(CREATE ROLE)语句:用于创建新的数据库角色。角色是一组权限的集合,可以分配给用户。
删除角色(DROP ROLE)语句:用于删除指定的数据库角色,包括与角色相关的权限。
修改角色(ALTER ROLE)语句:用于修改制定的数据库角色,包括与角色的相关权限
授权角色(GRANT ROLE)语句:用于将特定角色授予用户。通过授予角色,用户可以获得角色包含的权限。
撤销角色(REVOKE ROLE)语句:用于撤销用户的角色。通过撤销角色,用户将失去角色包含的权限。
角色权限管理(GRANT/REVOKE PRIVILEGES)语句:除了授权和撤销角色,还可以对角色的权限进行授权和撤销。通过授权和撤销权限,可以定制角色的权限级别和范围

MySQL的约束

1、非空约束 - 保证列中的数据不能为null
    添加约束
        方式一:sreate table 表名 (列名,数据类型 not null, ......);
        方式二:alter table 表名 modify 字段名 数据类型 not null;
    删除约束
        alter table 表名 modify 字段名 数据类型
2、唯一约束
    添加约束
        方式一:sreate table 表名 (列名,数据类型 unique (auto_increment), ......);
    方式二:alter table 表名 modify 字段名 数据类型 unique;
    删除约束
        alter table 表名 drop index 字段名 数据类型
3、主键约束
    添加约束
        方式一:sreate table 表名 (列名,数据类型primary key (auto_increment), ......);
        方式二:alter table 表名 add  primary key(字段名);
        方式三:sreate table 表名 (列名,数据类型, ......,primary key(列名));
    删除约束
        alter table 表名 drop primary key;
4、外键约束
    添加约束
        方式一:sreate table 表名 (列名,数据类型,......,poreign key(外键列名) references 主表(主表列名));
        方式二:alter table 表名 add  constraint 外键名称 foreign key (外键字段名) references 主表名称(主表列名);
    删除约束
        alter table 表名 drop foreign key 外键名称;
5、多表查询(查询交集)
    隐式内连接
        select 字段列表 from 表一,表二...... where 条件;
    显式内连接
        select 字段列表 from 表一(inner)join 表二 on 条件;
        例如select * from emp join dept on emp.dep_id=dept.did

    左外连接查询
        select 字段列表 from 表一 lift (outer) join 表二 on 条件;

    右外连接查询
        select 字段列表 from 表一 right(outer)join 表二 on 条件;

综合示例代码(SQL)

create database stu_text
use stu_text

DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
DROP TABLE IF EXISTS job;
DROP TABLE IF EXISTS salarygrade;

-- 部门表
CREATE TABLE dept (
id INT PRIMARY KEY PRIMARY KEY, -- 部门 id
dname VARCHAR(50), -- 部门名称
loc VARCHAR(50) -- 部门所在地
);
-- 职务表,职务名称,职务描述
CREATE TABLE job (
id INT PRIMARY KEY,
jname VARCHAR(20), description VARCHAR(50)
);
-- 员工表
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)
);
-- 工资等级表
CREATE TABLE salarygrade (
grade INT PRIMARY KEY, -- 级别
losalary INT, -- 最低工资
hisalary INT -- 最高工资
);
-- 添加 4 个部门
INSERT INTO dept(id,dname,loc) VALUES
(10,'教研部','北京'), (20,'学工部','上海'), (30,'销售部','广州'), (40,'财务部','深圳');
-- 添加 4 个职务
INSERT INTO job (id, jname, description) VALUES
(1, '董事长', '管理整个公司,接单'), (2, '经理', '管理部门员工'), (3, '销售员', '向客人推销产品'), (4, '文员', '使用办公软件');
-- 添加员工
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);
-- 添加 5 个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000), (2,12010,14000), (3,14010,20000), (4,20010,30000), (5,30010,99990);


--1、 查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
-- 方式一 :隐式内连接
SELECT emp.id, emp.ename, emp.salary, job.jname,job.description
FROM emp,job
WHERE emp.job_id = job.id;
-- 方式二 :显式内连接
SELECT emp.id, emp.ename, emp.salary,job.jname,job.description
FROM emp
INNER JOIN job ON emp.job_id = job.id;

--2. 查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
-- 方式一 :隐式内连接
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. 查询员工姓名,工资,工资等级
SELECT emp.ename, emp.salary, t2.* 
FROM emp, salarygrade t2
WHERE emp.salary >= t2.losalary AND emp.salary <= t2.hisalary

-- 4. 查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
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. 查询出部门编号、部门名称、部门位置、部门人数
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

事务

特性

原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation) :多个事务之间,操作的可见性
持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

mysql 中事务是自动提交的。
也就是说我们不添加事务执行 sql 语句,语句执行完毕会自动的提交事务。
可以通过下面语句查询默认提交方式:SELECT @@autocommit;
查询到的结果是 1 则表示自动提交,结果是 0 表示手动提交。当然也可以通过下面语句修改提交方式set @@autocommit = 0;

语法

开启事务 START TRANSACTION;或者 BEGIN;
提交事务 commit;
回滚事务 rollback;

示例

-- 示例环境
DROP TABLE IF EXISTS account;
-- 创建账户表
CREATE TABLE account(
id int PRIMARY KEY auto_increment, name varchar(10), money double(10,2)
);
-- 添加数据
INSERT INTO account(name,money) values('张三',1000),('李四',1000);


-- 开启事务
BEGIN;
-- 转账操作
-- 1. 查询李四账户金额是否大于 500
-- 2. 李四账户 -500
UPDATE account set money = money - 500 where name = '李四';
-- 出现异常了... 
-- 此处不是注释,在整体执行时会出问题,后面的 sql 则不执行
-- 3. 张三账户 +500
UPDATE account set money = money + 500 where name = '张三';
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值