CREATETABLE prikey (
id INT,
name VARCHAR(32),PRIMARYKEY(id, name))INSERTINTO prikey VALUES(1,'df')INSERTINTO prikey VALUES(1,'df')
2.not null(非空)
3.unique(唯一)
细节说明
如果没有指定not null, 则unique字段可以有多个null
如果一个列是unique not null则相当于主键
一张表可以有多个unique字段
演示
-- 如果没有指定not null, 则unique字段可以有多个null-- 一张表可以有多个unique字段CREATETABLE prikey (
id INTUNIQUE,
name VARCHAR(32)UNIQUE)INSERTINTO prikey VALUES(NULL,'df');INSERTINTO prikey VALUES(NULL,'df')
4.外键
外键示意图
使用细节
外键指向的表字段要求是主键或者unique
表的类型必须是innodb,这样的表才支持外键
外键字段的类型和主键的类型必须相同
外键可以为null,前提是外键字段允许为null
如果建立了主外键关系,如果主键被外键使用了,主键就不能删除,除非先将外键的数据删除
演示
-- 演示外键使用CREATETABLE stu (
id INT,
name VARCHAR(32),
class_id int,-- 指定外键关系FOREIGNKEY(class_id)REFERENCES my_class(id));CREATETABLE my_class (
id INTPRIMARYKEY,
name VARCHAR(32))INSERTINTO my_class VALUES(1,'zhanglaoshi')-- 外键可以为nullINSERTINTO stu VALUES(1,'lihua',NULL)-- 外键可以在主键中INSERTINTO stu VALUES(2,'xiaoming',1)-- 一旦主键被外键使用了则不能删除,这句话会报错DELETEFROM my_class WHERE id =1
5.check
演示
CREATETABLE t23 (
id INTPRIMARYKEY,
name VARCHAR(32),
sex VARCHAR(6)CHECK(sex IN('man','woman')))-- 这样是插入不进去的INSERTINTO t23 VALUES(1,'xiaoming','sex')
-- 删除索引DROPINDEX id_index ON t25
-- 删除主键索引ALTERTABLE t25 DROPPRIMARYKEY
4.课后练习
练习一
-- 创建主键索引一
CREATE TABLE ORDER1 (
ID INT PRIMARY KEY,
DNAME VARCHAR(32)
)
-- 创建主键索引二
CREATE TABLE ORDER2 (
ID INT,
DNAME VARCHAR(32)
)
ALTER TABLE ORDER2 ADD PRIMARY KEY(ID)
练习二
-- 创建唯一索引一CREATETABLE MENU1 (
ID INT,
DNAME VARCHAR(32))CREATEUNIQUEINDEX index_1 ON MENU1(ID)-- 创建唯一索引二CREATETABLE MENU2 (
ID INT,
DNAME VARCHAR(32))ALTERTABLE MENU2 ADDUNIQUEINDEX index_2(ID)
5.创建索引规则
3.事务
1.示意图
2.基本操作
演示
-- 事务基本操作演示CREATETABLE SW(
ID INT,
NAME VARCHAR(32))-- 开启事务STARTTRANSACTION-- 设置保存点SAVEPOINT A
-- 执行dml操作INSERTINTO sw VALUES(1,'200')-- 设置保存点SAVEPOINT B
-- 执行dml操作INSERTINTO sw VALUES(2,'300')-- 回滚到bROLLBACKTO b
-- 直接回滚到AROLLBACK
3.回退事务和提交事务
4.事务注意事项
如果不开启事务,dml操作是自动提交的,不能回滚
如果开启一个事务,你没有创建保存点,你可以执行rollback,默认就是回到事务开始时的状态
事务假如保存点a比保存点b先创建,如果回退到保存点a,则不能再回到保存点b
mysql的事务机制需要innodb的存储引擎才可以使用,myisam不好使
开启一个事务,start transaction 或者 set autocommit = off
5.事务的隔离级别
1.基本介绍
2.理解
前提条件,开启两个事务
脏读: 一个事务对数据库进行了修改,还没提交,另一个事务就可以读到
不可重复读:一个事务对数据库进行了修改或删除,提交了之后,另一个事务就可以读到
幻读:一个事务对数据库进行了插入操作,提交了之后,另一个事务就可以读到
最佳的情况是:开启一个事务,则此刻这个事务操作的数据库就是,此刻的数据库状态,不会被其他事务所影响
3.事务隔离级别演示
可串行化的隔离级别
他是加锁的,使用多个锁使事务就像是顺序执行一样
当一个事务正在对表进行操作的时候,另一个事务是无法查询这个表的内容,直到其操作完毕
6.设置隔离的指令
7.mysql事务的ACID
4.存储引擎
1.主要的存储引擎特点
2.三种重点的存储引擎
3.表的存储引擎选择
4.修改存储引擎
5.视图
1.基本介绍
视图是根据基表(可以是)来创建的,视图是虚拟的表
视图也有列,数据来自基表
通过视图可以修改基表的数据
基表的改变,也会影响到视图的数据
2.基本使用
案例
-- 创建视图
CREATE VIEW EMP_VIEW01
AS SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP
-- 查看视图
SELECT * FROM emp_view01
-- 查看创建视图的指令
SHOW CREATE VIEW emp_view01
-- 删除视图
DROP VIEW emp_view01
3.视图细节
4.视图最佳实践
练习
-- 创建多表连接的视图CREATEVIEW view02
ASSELECT EMP.empno, EMP.ename, dept.dname,salgrade.grade
FROM EMP, DEPT, SALGRADE
WHERE EMP.deptno = DEPT.deptno AND EMP.sal BETWEEN SALGRADE.losal AND SALGRADE.hisal
-- 查询视图SELECT*FROM view02
6.MySQL用户管理
1.创建用户和删除用户
代码实例
CREATE USER 'SUN'@'LOCALHOST' IDENTIFIED BY '123456'
-- 查看所有用户
SELECT *
FROM mysql.`user`
-- 删除用户
DROP USER 'SUN'@'LOCALHOST'
-- 显示所有部门名称SELECT dname
FROM dept
-- 显示所有雇员名及其全年收入,并指定列名为‘年收入’SELECT ename,(sal + IFNULL(comm,0))*12 年收入
FROM emp
题目三
-- 显示工资超过2850的雇员姓名和工资SELECT ename, sal
FROM emp
WHERE sal >2850-- 显示工资不在1500到2850之间的所有雇员名以及工资SELECT ename,sal
FROM emp
WHERE sal <1500OR sal >2850-- 显示编号为7566的雇员SELECT*FROM emp
WHERE empno =7566-- 显示部门10和30中工资超过1500的雇员名以及工资SELECT ename, sal
FROM emp
WHERE deptno IN(10,30)AND sal >1500-- 显示无管理者的雇员名以及岗位SELECT ename, job
FROM emp
WHERE mgr ISNULL
题目四
-- 显示在1991年2月1日到1991年5月1日之间雇佣的雇员名,岗位以及雇佣日期,并按照雇佣日期排序SELECT ename, job, hiredate
FROM emp
WHERE hiredate BETWEEN'1991-02-01'AND'1991-05-01'ORDERBY hiredate
-- 显示获得补助的所有雇员名,工资以及补助并以工资降序排序SELECT ename, sal,comm
FROM emp
WHERE COMM ISNOTNULLORDERBY sal DESC
3.作业三
-- 1.找出部门30中所有的员工SELECT*FROM emp
WHERE DEPTNO =30-- 2.列出所有办事员(clerk)的姓名,部门以及部门编号SELECT ename, dname, emp.deptno
FROM emp, dept
WHERE EMP.deptno = dept.deptno AND JOB ='CLERK'-- 3.找出佣金高于薪金的员工SELECT*FROM emp
WHERE comm > sal
-- 4.找出佣金高于薪金百分之六十的员工SELECT*FROM emp
WHERE comm >1.6* sal
-- 5.找出部门10中所有经理和部门20中所有办事员的详细资料SELECT*FROM emp
WHERE deptno =10AND job ='MANAGER'OR deptno =20AND job ='CLERK'-- 6.找出部门10中所有经理,部门20中所有办事员,还有既不是经理又不是办事员但薪金大于或等于2000的所有员工的详细资料SELECT*FROM emp
WHERE deptno =10AND job ='MANAGER'OR deptno =20AND job ='CLERK'OR job NOTIN('MANAGER','CLERK')AND sal >=2000-- 7.找出收取佣金的员工的不同工作SELECTDISTINCT job
FROM emp
WHERE comm ISNOTNULL-- 8.找出不收取佣金或收取佣金低于100的员工 SELECT*FROM emp
WHERE comm ISNULLOR comm <100-- 9.找出各月倒数第三天受雇的所有员工SELECT*FROM emp
WHEREDAY(DATE_ADD(hiredate,INTERVAL3DAY))=1-- 10.找出早于12年前受雇的员工SELECT*FROM emp
WHERE DATE_ADD(hiredate,INTERVAL12YEAR)<NOW()-- 11.以首字母小写的方式显示所有员工的姓名SELECT CONCAT(LCASE(LEFT(ename,1)), SUBSTRING(ename,2, LENGTH(ename)-1))FROM emp
-- 12.显示正好为5个字符的员工的姓名SELECT ename
FROM emp
WHERE LENGTH(ename)=5
4.作业四
-- 13显示所有不带有'R'的员工的名字
SELECT *
FROM emp
WHERE ename NOT LIKE '%R%'
-- 14显示所有员工姓名的前三个字符
SELECT SUBSTRING(ename, 1, 3)
FROM emp
-- 15显示所有员工的姓名,使用a替换'A'
SELECT REPLACE(ename,'A','a')
FROM emp
-- 16显示满10年服务年限的员工的姓名和受雇日期
SELECT ename, hiredate
FROM emp
WHERE DATE_ADD(hiredate,INTERVAL 10 YEAR) <= NOW()
-- 17显示员工的详细资料,按照姓名排序
SELECT *
FROM emp
ORDER BY ename
-- 18显示员工的姓名和受雇日期,根据其服务年限将最老的员工排在最前面
SELECT ename, hiredate
FROM emp
ORDER BY hiredate
-- 19显示所有员工的姓名、工作和薪金,按工作排序,如果工作相同则按薪金排序
SELECT ename, job, sal
FROM emp
ORDER BY job, sal
-- 20显示所有员工的姓名,加入公司的年份和月份,按照雇佣日期所在月排序,若月份相同则将最早年份的员工排在最前面
SELECT ename, YEAR(hiredate), MONTH(hiredate)
FROM emp
ORDER BY MONTH(hiredate), YEAR(hiredate)
-- 21显示在一个月为30天的情况所有员工的日薪金,忽略余数
SELECT IFNULL(sal,0) / 30
FROM emp
-- 22找出在任何年份2月受聘的所有员工
SELECT *
FROM emp
WHERE MONTH(hiredate) = 2
-- 23对于每个员工,显示其加入公司的天数
SELECT ename, DATEDIFF(CURRENT_DATE,hiredate)
FROM emp
-- 24显示姓名字段的任何位置包含‘A’的所有员工性名
SELECT ename
FROM emp
WHERE ename LIKE '%A%'
-- 25以年月日的方式显示所有员工的服务年限(假设一个月30天)
SELECT FLOOR(DATEDIFF(CURRENT_DATE,hiredate) / 365) as year, FLOOR(MOD(DATEDIFF(CURRENT_DATE,hiredate) , 365) / 30) AS month, MOD(MOD(DATEDIFF(CURRENT_DATE,hiredate) , 365) , 30) as day
FROM emp
5.作业五
-- 1.列出至少有一个员工的所有部门SELECTDISTINCT DNAME
FROM emp, dept
WHERE EMP.deptno = DEPT.deptno
-- 2.列出薪金比“smith”多的所有员工SELECT*FROM emp
WHERE sal >(SELECT sal
FROM emp
WHERE ename ='SMITH')-- 3.列出受雇日期晚于其直接上级的所有员工SELECT*FROM emp LOW, emp HIGH
WHERE LOW.mgr = HIGH.empno AND LOW.hiredate > HIGH.hiredate
-- 4.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门SELECT dname, emp.*FROM emp RIGHTJOIN dept
ON dept.deptno = emp.deptno
-- 5.列出所有‘check’的姓名及其部门名称SELECT ename,dname
FROM emp, dept
WHERE emp.deptno = dept.deptno AND job ='CLERK'-- 6.列出最低薪金大于1500的各种工作SELECT job, sal
FROM emp
WHERE sal >1500-- 7.列出在部门‘sales’工作的员工的姓名SELECT ename, dname
FROM emp, dept
WHERE emp.deptno = dept.deptno AND dname ='SALES'-- 8.列出薪金高于公司平均薪金的所有员工SELECT*FROM emp
WHERE sal >(SELECTAVG(sal)FROM emp
)
6.作业六
-- 1.列出与‘scott’从事相同工作的员工 SELECT*FROM emp
WHERE job =(SELECT JOB
FROM emp
WHERE ename ='SCOTT')-- 2.列出佣金高于在部门30工作的所有员工的薪金的员工姓名和薪金SELECT ename, sal
FROM emp
WHERE sal >all(SELECT sal
FROM emp
WHERE deptno =30)-- 3.列出在每个部门工作的员工数量,平均工资,以及平均服务期限SELECTCOUNT(*),AVG(sal),AVG(CURRENT_DATE- hiredate)FROM emp
GROUPBY deptno
-- 4.列出所有员工的姓名、部门名称和工资SELECT ename, dname, sal
FROM emp, dept
WHERE emp.deptno = dept.deptno
-- 5.列出所有部门的详细信息和部门人数SELECT dept.*, count
FROM(SELECTcount(*)as count, deptno
FROM emp
GROUPBY deptno
)tempRIGHTJOIN dept
ONtemp.deptno = dept.deptno
-- 6.列出各种工作的最低工资SELECT job,MIN(sal)FROM emp
GROUPBY job
-- 7.列出经理的最低薪金SELECTDISTINCT job,MIN(sal)FROM emp
WHERE job ='MANAGER'-- 8.列出所有员工的年工资,按照年薪从低到高排序SELECT ename,(sal + IFNULL(comm,0))*12AS salary
FROM emp
ORDERBY salary
7.作业七
CREATETABLE class(
classid VARCHAR(16)PRIMARYKEY,`subject`VARCHAR(16),
deptname VARCHAR(16),
enrolltime YEAR,
num INT,FOREIGNKEY(deptname)REFERENCES department(deptname))CREATETABLE student (
studentid VARCHAR(16)PRIMARYKEY,`name`VARCHAR(8)NOTNULLDEFAULT'',
age INT,
classid VARCHAR(16),FOREIGNKEY(classid)REFERENCES class(classid))CREATETABLE department(
departmentid VARCHAR(16)PRIMARYKEY,
deptname VARCHAR(16)UNIQUENOTNULL)insertinto department values('001','数学');insertinto department values('002','计算机');insertinto department values('003','化学');insertinto department values('004','中文');insertinto department values('005','经济');insertinto class values(101,'软件','计算机',1995,20);insertinto class values(102,'微电子','计算机',1996,30);insertinto class values(111,'无机化学','化学',1995,29);insertinto class values(112,'高分子化学','化学',1996,25);insertinto class values(121,'统计数学','数学',1995,20);insertinto class values(131,'现代语言','中文',1996,20);insertinto class values(141,'国际贸易','经济',1997,30);insertinto class values(142,'国际金融','经济',1996,14);insertinto student values(8101,'张三',18,101);insertinto student values(8102,'钱四',16,121);insertinto student values(8103,'王玲',17,131);insertinto student values(8105,'李飞',19,102);insertinto student values(8109,'赵四',18,141);insertinto student values(8110,'李可',20,142);insertinto student values(8201,'张飞',18,111);insertinto student values(8302,'周瑜',16,112);insertinto student values(8203,'王亮',17,111);insertinto student values(8305,'董庆',19,102);insertinto student values(8409,'赵龙',18,101);insertinto student values(8510,'李丽',20,142);SELECT*FROM class;SELECT*FROM student;SELECT*FROM department;-- 找出所有姓李的学生SELECT*FROM student
WHERE`name`LIKE'李%'-- 找出所有开设超过1个专业的系的名字SELECT deptname,COUNT(*)FROM class
GROUPBY deptname
HAVINGCOUNT(*)>1-- 列出人数大于等于30的系的编号和名字SELECT departmentid, class.deptname
FROM class, department
WHERE class.deptname = department.deptname AND num >=30-- 学校又新增了一个物理系,编号为006INSERTINTO department VALUES('006','物理系')-- 张三退学SELECT*FROM student
WHERE`name`='张三'DELETEFROM student
WHERE name ='张三'
Acrobat Pro DC 2023 for Mac是一款功能强大的PDF编辑和管理软件,旨在帮助用户轻松处理PDF文件。它提供了丰富的工具和功能,使用户可以创建、编辑、转换和注释PDF文件,以及填写和签署PDF表单。 软件下载:Acrobat Pro DC 2023 for …