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