-- 視圖CREATEVIEW emp_view01 ASSELECT empno,ename,job,deptno FROM emp;SELECT*FROM db_02.`emp`;-- 查看視圖DESC emp_view01;-- 查詢視圖SELECT*FROM emp_view01;SELECT a.`empno`,a.`ename`,a.`job`,a.`deptno`FROM emp_view01 a-- 更新成新的視圖ALTERVIEW emp_view01 ASSELECT empno,ename,job,deptno FROM emp;-- 查看視圖創建語句SHOWCREATEVIEW emp_view01;-- 刪除視圖DROPVIEW emp_view01;SELECT*FROM emp;-- 視圖的細節-- 1. 創建視圖后,到數據庫去看,對應視圖只有一個視圖結構文件(形式: 視圖名.frm)-- emp_view01.frm-- 2. 視圖的數據變化會影響到基表,基表的數據變化也會影響到視圖[insert update delete ]-- 修改視圖會影響基表UPDATE emp_view01 a
SET a.`job`='MANAGER'WHERE a.`empno`=7369;SELECT*FROM emp_view01;SELECT*FROM emp;-- 修改基表也會影響視圖UPDATE db_02.emp a
SET a.`job`='CLERK'WHERE a.`empno`=7369;-- 視圖中可以再使用視圖DESC emp_view01;-- 從emp_view01中選擇出2列,做新視圖CREATEVIEW emp_view02
ASSELECT empno,ename
FROM emp_view01;SELECT*FROM emp_view02;
視圖最佳實踐
課后練習
CREATEVIEW emp_view03
ASSELECT a.empno empno,
a.ename ename,
b.dname dname,
c.grade grade
FROM db_02.`emp` a,
db_02.`dept` b,
db_02.`salgrade` c
WHERE a.`deptno`= b.`deptno`AND a.sal BETWEEN c.losal AND c.hisalSELECT*FROM db_02.`salgrade`;SELECT*FROM db_02.`dept`;DESC emp_view03;SELECT*FROM emp_view03;
SELECT*FROM testdb.news;INSERTINTO testdb.news VALUES(2,'Mary');UPDATE testdb.news a
SET a.`name`=`Rose`WHERE a.`id`=1;-- UPDATE command denied to user 'shunping'@'localhost' for table 'news'
-- 2.DESC db_02.dept;DESC db_02.emp;SELECT*FROM db_02.emp;-- 3.(1)SELECT dname FROM db_02.dept;-- 3.(2)SELECT a.ename,(sal + IFNULL(comm,0))*13AS'年收入'FROMdb_02.emp a ;-- 4.(1)SELECT ename,sal FROM emp
WHERE sal >2850;-- 4.(2)SELECT ename,sal FROM emp
WHERE sal NOTBETWEEN1500AND2850;-- 4.(3)SELECT ename,deptno
FROM emp
WHERE empno =7566;-- 4.(4)SELECT ename,sal
FROM emp
WHERE sal >1500AND deptno IN(10,30);-- 4.(5)SELECT ename,job
FROM emp
WHERE mgr ISNULL;-- 5.(1)SELECT ename,job,hiredate
FROM emp
WHERE hiredate BETWEEN'1991-02-01'AND'19910501'ORDERBY hiredate;-- 5.(2)SELECT ename,sal,comm
FROM emp
WHERE comm ISNOTNULLORDERBY sal DESC;
# 6.-- 1.SELECT*FROM emp
WHERE deptno =30;-- 2.SELECT ename,empno,deptno
FROM emp
WHERE job ='CLERK';-- 3.SELECT*FROM emp
WHERE IFNULL(comm,0)> sal;-- 4.SELECT*FROM emp
WHERE IFNULL(comm,0)>(sal *0.6);-- 5.SELECT*FROM emp
WHERE deptno =10AND job ='MANAGER'UNIONALLSELECT*FROM emp
WHERE deptno =20AND job ='CLERK';-- 6.SELECT*FROM emp
WHERE deptno =10AND job ='MANAGER'UNIONALLSELECT*FROM emp
WHERE deptno =20AND job ='CLERK'UNIONALLSELECT*FROM emp
WHERE job NOTIN('MANAGER','CLERK')AND sal >=2000;-- 7.SELECTDISTINCT job FROM emp
WHERE comm ISNOTNULL;-- 8.SELECT*FROM emp
WHERE comm ISNULLOR IFNULL(comm,0)<100;-- 9.SELECT*FROM emp
WHERE hiredate = DATE_SUB(LAST_DAY(DATE(hiredate)),INTERVAL2DAY);-- 10.SELECT*FROM emp
WHERE hiredate < DATE_SUB(NOW(),INTERVAL12YEAR);-- 11.SELECT CONCAT(LCASE(LEFT(ename,1)),SUBSTRING(ename,2))FROM emp-- 12.SELECT ename
FROM emp
WHERE LENGTH(ename)=5;-- 13.SELECT ename
FROM emp
WHERE ename NOTLIKE'%R%';-- 14.SELECT SUBSTRING(ename,1,3)FROM emp;-- 15.SELECTREPLACE(ename,'A','a')FROM emp;-- 16.SELECT ename,hiredate FROM emp
WHERE DATE_SUB(NOW(),INTERVAL10YEAR)>= hiredate;-- 17.SELECT*FROM emp
ORDERBY ename;-- 18.SELECT ename,hiredate
FROM emp
ORDERBY hiredate;-- 19.SELECT ename,job,sal
FROM emp
ORDERBY job,sal DESC;-- 20.SELECT ename,YEAR(hiredate) year_hiredate,MONTH(hiredate) month_hiredate
FROM emp
ORDERBY month_hiredate,year_hiredate;-- 21.SELECTFORMAT((sal/30),0)FROM emp
ORDERBY empno;SELECT FLOOR((sal/30))FROM emp
ORDERBY empno;-- 22.SELECT*FROM emp
WHEREMONTH(hiredate)=2;-- 23.SELECT ename,DATEDIFF(NOW(),hiredate)DAYFROM emp;-- 24.SELECT ename FROM emp
WHERE ename LIKE'%A%';-- 25.SELECT ename,
FLOOR(DATEDIFF(NOW(),hiredate)/365)AS'年',FLOOR(MOD(DATEDIFF(NOW(),hiredate),365)/31)AS'月',MOD(MOD(DATEDIFF(NOW(),hiredate),365),31)AS'日'FROM emp
-- (1). 列出至少有一個員工的所有部門SELECTDISTINCT a.dname,a.deptno FROM dept a,emp b
WHERE a.deptno = b.deptno;-- (2).列出薪金比"SMITH"多的所有員工。SELECT*FROM emp
WHERE sal >(SELECT sal FROM emp
WHERE ename ='SMITH');-- (3). 列出受雇日期晚于其直接上級的所有員工。SELECT a.empno,a.`mgr`,a.`hiredate`,b.`hiredate` boss
FROMdb_02.emp a,db_02.emp b
WHERE a.`mgr`= b.`empno`AND a.`hiredate`> b.`hiredate`;-- (4).列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。SELECT b.`dname`,a.*FROM db_02.`emp` a RIGHTJOIN db_02.`dept` b
ON a.`deptno`= b.`deptno`ORDERBY b.dname;-- (5).列出所有"CLERK"(辦事員)的姓名及其部門名稱。SELECT a.`ename`,b.`dname`FROM emp a,dept b
WHERE a.`deptno`= b.`deptno`AND a.`job`='CLERK';-- (6). 列出最低薪金大于1500的各種工作。SELECTDISTINCT a.`job`,MIN(a.sal)AS minsal FROM emp a
GROUPBY a.job
HAVING minsal >1500;-- (7).列出在部門"SALES" (銷售部)工作的員工的姓名。SELECT a.`ename`FROM emp a,dept b
WHERE a.`deptno`= b.`deptno`AND b.`dname`='SALES'-- (8).列出薪金高于公司平均薪金的所有員工。SELECT*FROM emp b
WHERE b.sal >(SELECTAVG(a.`sal`)FROM emp a);-- 7.根據:-- emp員工表,dept部門表,工資=薪金+傭金寫出正確SQL homework04.sql-- (9).列出與"SCOTT"從事相同工作的所有員工。SELECT a.*FROM emp a
WHERE a.`job`=(SELECT b.job FROM emp b
WHERE b.`ename`='SCOTT')AND a.`ename`<>'SCOTT';-- (10).列出薪金高于所在部門30工作的所有員工的薪金的員工姓名和薪金。SELECT a.`ename`,a.`sal`FROM emp a
WHERE a.`sal`>(SELECTMAX(b.sal)FROM emp b
WHERE b.`deptno`=30);-- (11).列出在每個部門工作的員工數量、平均工資和平均服務期限。SELECT a.`deptno`,COUNT(DISTINCT a.`empno`),AVG(a.`sal`+ IFNULL(`comm`,0)),ROUND(AVG(DATEDIFF(NOW(),a.`hiredate`)))AS diffday
FROMemp a
GROUPBY a.`deptno`;-- (12).列出所有員工的姓名、部門名稱和工資。SELECT a.ename,b.`dname`,a.`sal`+ IFNULL(a.comm,0)FROMemp a,dept b ;-- (13).列出所有部門的詳細信息和部門人數。SELECT a.*,COUNT(b.*)FROM dept a LEFTJOIN emp b
ON a.`deptno`= b.`deptno`GROUPBY a.`deptno`;SELECT a.`deptno`,a.`loc`,COUNT(b.deptno)FROM emp b,dept a
WHERE a.`deptno`= b.`deptno`GROUPBY b.`deptno`,a.loc;SELECT a.deptno,a.`dname`,a.`loc`,COUNT(b.deptno) rs FROM dept a LEFTJOIN emp b
ON a.`deptno`= b.`deptno`GROUPBY a.`deptno`,a.`dname`,a.`loc`;-- (14).列出各種工作的最低工資。SELECT job,MIN(sal)FROM emp
WHERE job IN(SELECTDISTINCT job FROM emp)GROUPBY job;-- (15).列出MANAGER (經理)的最低薪金。SELECTMIN(sal)FROM emp
WHERE job ='MANAGER';-- (16).列出所有員工的年工資按年薪從低到高排序。SELECT(sal + IFNULL(comm,0))*12AS salary FROM emp
ORDERBY salary;
CREATEDATABASE school;USE school;# 系CREATETABLE department
(`departmentid`INTNOTNULLDEFAULT0PRIMARYKEY,`deptname`VARCHAR(20)UNIQUENOTNULLDEFAULT'');SELECT*FROM department;ALTERTABLE department MODIFY`departmentid`VARCHAR(255)NOTNULLDEFAULT'0';# 班級CREATETABLE class
(`classid`INTNOTNULLDEFAULT0PRIMARYKEY,`subject`VARCHAR(20)NOTNULLDEFAULT'',`deptname`VARCHAR(20)UNIQUENOTNULLDEFAULT'',-- 外鍵
enrolltime CHAR(4)NOTNULLDEFAULT9999,
num INTNOTNULLDEFAULT0);ALTERTABLE class MODIFY enrolltime INTNOTNULLDEFAULT9999;ALTERTABLE class MODIFY`deptname`VARCHAR(20)NOTNULLDEFAULT'';ALTERTABLE class ADDFOREIGNKEY(`deptname`)REFERENCES department (`deptname`);DESC class;SHOWINDEXFROM class;ALTERTABLE class DROPINDEX deptname ;# 學生CREATETABLE student
(`studentid`INTNOTNULLDEFAULT0PRIMARYKEY,`name`VARCHAR(20)NOTNULLDEFAULT'',`age`INTNOTNULLDEFAULT0,`classid`INTNOTNULLDEFAULT0);ALTERTABLE student ADDFOREIGNKEY(classid)REFERENCES class(`classid`);INSERTINTO`class`(`classid`,`subject`,`deptname`,enrolltime, num)VALUES(101,'軟件','計算機',1995,20),(102,'微電子','計算機',1996,30),(111,'無機化學','化學',1995,29),(112,'高分子化學','化學',1996,25),(121,'統計數學','數學',1995,20),(131,'現代語言','中文',1996,20),(141,'國際貿易','經濟',1997,30),(142,'國際金融','經濟',1996,14);SELECT*FROM class;INSERTINTO STUDENT VALUES(8101,'張三',18,101),(8102,'錢四',16,121),(8103,'王玲',17,131),(8105,'李飛',19,102),(8109,'趙四',18,141),(8110,'李可',20,142),(8201,'張飛',18,111),(8302,'周瑜',16,112),(8203,'王亮',17,111),(8305,'董慶',19,102),(8409,'趙龍',18,101),(8510,'李麗',20,142);INSERTINTO department
VALUES('001','數學'),('002','計算機'),('003','化學'),('004','中文'),('005','經濟');SELECT*FROM department;-- 3.1SELECT*FROM student a
WHERE a.name LIKE'李%';-- 3.2DESC class;SELECT deptname FROM classGROUPBY deptnameHAVINGCOUNT(SUBJECT)>1;-- 3.3SELECT a.`deptname`,b.`departmentid`,SUM(a.`num`)rsFROM class a,department bWHERE a.`deptname`= b.`deptname`GROUPBY a.`deptname`HAVING rs >=30;-- 3.4SELECT*FROM department;INSERTINTO department VALUES(006,'物理系');-- 3.5DESC STUDENT;STARTTRANSACTION;UPDATE class aSET a.num = a.num -1WHERE a.id =101;DELETEFROM STUDENTWHERE NAME ='張三'COMMIT;SELECT*FROM class;