DQL

# 查询所有数据,*表示列
SELECT * FROM emp;

# 显示部分列
SELECT eid, ename FROM emp;

# 查询所有数据,重命名查询到的数据的列名(别名查询,as关键字)
SELECT eid AS '编号', ename AS '姓名', sex AS '性别',
salary AS '薪资', hire_date AS '入职时间', dept_name AS '部门名称' FROM emp;

# 去重
SELECT DISTINCT dept_name FROM emp;

# 薪资+1000
SELECT ename, salary+1000 FROM emp;

# 查询员工姓名为黄蓉的员工信息
SELECT * FROM emp WHERE ename = '黄蓉';

# 查询薪水价格为5000的员工信息
SELECT * FROM emp WHERE salary = 5000;

# 查询薪水价格不是5000的所有员工信息
SELECT * FROM emp WHERE salary != 5000;

# 查询薪水价格大于6000元的所有员工信息
SELECT * FROM emp WHERE salary > 6000;

# 查询薪水价格在5000到10000之间所有员工信息
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 10000;
SELECT * FROM emp WHERE salary >= 5000 AND salary <= 10000;

# 查询薪水价格是3600或7200或者20000的所有员工信息
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
SELECT * FROM emp WHERE salary IN (3600, 7200, 20000);

# 查询含有'精'字的所有员工信息
SELECT * FROM emp WHERE ename LIKE '%精%';

# 查询以'孙'开头的所有员工信息
SELECT * FROM emp WHERE ename LIKE '孙%';

# 查询第二个字为'兔'的所有员工信息
SELECT * FROM emp WHERE ename LIKE '_兔%';

# 查询没有部门的员工信息
SELECT * FROM emp WHERE dept_name = NULL; # 错误方式!!!!!!
SELECT * FROM emp WHERE dept_name IS NULL;

# 查询有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NOT NULL;

组合排序

# 排序 默认升序(ASC) 
SELECT * FROM emp ORDER BY salary DESC;

# 组合排序
SELECT * FROM emp ORDER BY salary DESC, eid DESC;

聚合函数

将纵向的结果压缩成横向的一个值

#1 查询员工的总数
SELECT COUNT (*) FROM emp;

#2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
SELECT SUM(salary), MAX(salary), MIN(salary), AVG(salary) FROM emp;

#3 查询薪水大于4000员工的个数
SELECT COUNT(*) FROM emp WHERE salary > 4000;

#4 查询部门为'教学部'的所有员工的个数
SELECT COUNT(dept_name) FROM emp WHERE dept_name = '教学部'; 

#5 查询部门为'市场部'所有员工的平均薪水
SELECT AVG(salary) FROM emp WHERE dept_name = '市场部';

分组查询

select 分组字段/聚合函数 from 表名 group by 字段

步骤

1 将字段值相同的数据分为一组
2 返回每组的第一条数据

# 通过性别字段 进行分组,求各组的平均薪资
SELECT sex, AVG(salary) FROM emp GROUP BY sex;

#1.查询所有部门信息
SELECT dept_name FROM emp GROUP BY dept_name;

#2.查询每个部门的平均薪资
SELECT dept_name, AVG(salary) FROM emp GROUP BY dept_name;

#3.查询每个部门的平均薪资, 部门名称不能为null
SELECT dept_name, AVG(salary) FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name;

# 查询平均薪资大于6000的部门
# 在分组之后进行过滤需要用having

SELECT dept_name, AVG(salary) FROM emp WHERE dept_name IS NOT NULL 
GROUP BY dept_name HAVING AVG(salary) > 6000;

where 和 having的区别

图片说明

limit

限制查出来的记录数量。支持1个参数和两个参数。

# limit 指定查询多少行
# 查询emp表中的前 5条数据
SELECT * FROM emp LIMIT 0,5;
SELECT * FROM emp LIMIT 5;

# 查询emp表中 从第4条开始,查询6条
SELECT * FROM emp LIMIT 3, 6;

分页时,第一个参数是 (页数-1) * 每页多少行

约束

约束的作用: 对表中的数据进行进一步的限制,从而保证数据的正确性、有效性、完整性. 违反约束的
不正确数据,将无法插入到表中
常见的约束: 主键 唯一 非空 外键

主键约束

CREATE TABLE emp2(
    eid INT PRIMARY KEY,
    ename VARCHAR(20),
    sex CHAR(1)
);

CREATE TABLE emp2(
    eid INT,
    ename VARCHAR(20),
    sex CHAR(1),
    PRIMARY KEY (eid)
);

ALTER TABLE emp2 ADD PRIMARY KEY(eid);
ALTER TABLE emp2 DROP PRIMARY KEY;

主键自增

注意,delete删除对自增没影响,truncate对自增有影响。

CREATE TABLE emp2(
-- 关键字 AUTO_INCREMENT,主键类型必须是整数类型
    eid INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(20),
    sex CHAR(1)
);

CREATE TABLE emp2(
    eid INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(20),
    sex CHAR(1)
)AUTO_INCREMENT=100;

非空约束

CREATE TABLE emp2(
    eid INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(20) NOT NULL,
    sex CHAR(1)
);

唯一约束 && 默认值

唯一约束可以为空

CREATE TABLE emp3(
    eid INT PRIMARY KEY,
    ename VARCHAR(20) UNIQUE,
    sex CHAR(1) DEFAULT '男'
);

事务

一条或多条SQL组成的整体。事务中的操作要么都成功,要么都失败。

手动提交事务

开启事务 start transaction / begin
提交 commit 回滚 rollback

自动提交事务

mysql默认方式
默认每执行一条dml都是一个单独的事务

//关闭自动提交
SET @@autocommit=off

四大特性 ACID

图片说明

并发导致的问题

图片说明
这些问题可以通过设置隔离级别解决。
脏读 两个客户端都在事务内
不可重复读 一个提交了,一个在事务内
幻读 一个提交了,一个在事务内 和不可重复读的区别在 一个是对已有记录的更改,一个是新增了新的记录。
(我看的例子是这样的,只是针对我自己看的例子)

隔离级别

图片说明

查看和设置隔离级别

查看隔离级别 select @@tx_isolation;
设置隔离级别

set global transaction isolation level read uncommitted
set global transaction isolation level read committed
set global transaction isolation level repeatable read 
set global transaction isolation level serializable