Mysql數據庫練習

 

我自己建的庫名company

一、 建立部門表 “dept”: 

CREATE TABLE `company`.`dept`(  
  `dno` INT NOT NULL,
  `dname` VARCHAR(10) NOT NULL,
  PRIMARY KEY (`dno`)
);

插入部門表數據

INSERT INTO dept VALUES(1,"財務處")
INSERT INTO dept VALUES(2,"人事處")
INSERT INTO dept VALUES(3,"市場部")

二、建立職工表
CREATE TABLE company.emp(  
  eno INT PRIMARY KEY,
  ename CHAR(10) NOT NULL,
  sex  ENUM("男","女"),
  birth DATE,
  dy  ENUM('是','否'),
  rztime DATE,    
  depart INT,
  address CHAR(10),
  FOREIGN KEY(depart) REFERENCES dept(dno)
);

插入職工表數據

INSERT INTO emp VALUES(1,"孫華","男","1952-1-3","是","1970-10-10",1,"天津市");
INSERT INTO emp VALUES(2,"陳明","男","1945-5-8","否","1965-01-01",2,"北京市");
INSERT INTO emp VALUES(3,"程西","女","1980-6-10","否","2002-07-10",1,"北京市");
INSERT INTO emp VALUES(4,"蘇天氣","女","1965-3-10","是","1987-07-10",2,"天津市");
INSERT INTO emp VALUES(5,"劉少文","女","1942-1-11","否","1960-08-10",2,"");
INSERT INTO emp VALUES(6,"劉新","男","1952-10-8","否","1970-07-01",1,"上海市");
INSERT INTO emp VALUES(7,"餘輝","女","1980-12-4","否","2001-07-10",3,"武漢市");
INSERT INTO emp VALUES(8,"王曉豔","女","1980-11-10","是","2001-07-10",2,"河北省");
INSERT INTO emp VALUES(9,"李玉",“女","1970-10-10","是","1989-07-10",1,"天津市");
INSERT INTO emp VALUES(10,"周濤","男","1963-2-10","否","1983-07-20",3,"河北市");
INSERT INTO emp VALUES(11,"歐陽少兵","男","1965-4-19","否","1984-07-12",2,"北京市");
INSERT INTO emp VALUES(12,"張旗","男","1980-11-10","否","1999-09-18",3,"天津市");
INSERT INTO emp VALUES(13,"李涵","女","1982-5-10","否","2002-02-14",3,"天津市");
INSERT INTO emp VALUES(14,"魏君","女","1977-3-23","是","1993-07-10",3,"");
INSERT INTO emp VALUES(15,"李藝","男","1979-9-18","否","2001-07-20",3,"上海市");

三、建立工資表

CREATE TABLE `company`.`sal`(  
  `eno` INT,
  `month` INT CHECK(`month`>=1 AND `month`<=12),
  `wages` INT,
  `allowance` INT,
  `suply` INT,
  `award` INT,
  `deduct` INT,
  `tax` INT,
  FOREIGN KEY(eno) REFERENCES emp(eno)
);

插入工資表數據

INSERT INTO sal VALUES(1,8,2800,1200,180,200,0,220);
INSERT INTO sal VALUES(2,8,2600,1000,200,300,0,180);
INSERT INTO sal VALUES(3,8,1880,880,200,260,50,120);
INSERT INTO sal VALUES(4,8,2200,980,180,230,80,110);
INSERT INTO sal VALUES(5,8,2300,880,210,0,0,125);
INSERT INTO sal VALUES(6,8,2100,600,220,180,50,110);
INSERT INTO sal VALUES(7,8,2200,800,180,200,120,120);
INSERT INTO sal VALUES(8,8,2000,780,120,100,0,100);
INSERT INTO sal VALUES(9,8,2500,870,130,150,0,120);
INSERT INTO sal VALUES(10,8,2350,700,250,180,50,120);
INSERT INTO sal VALUES(11,8,1900,800,260,130,0,100);
INSERT INTO sal VALUES(12,8,1800,500,200,100,50,100);
INSERT INTO sal VALUES(13,8,1580,500,200,100,0,100);
INSERT INTO sal VALUES(14,8,1300,450,200,100,0,100);
INSERT INTO sal VALUES(15,8,1380,450,200,100,0,10);

 

四、建表完成後,可以做如下練習了

a) 查詢所有職工的基本信息 
SELECT * FROM emp ;


b) 查詢所有市場部職工的基本信息 
SELECT * FROM emp e  JOIN dept d ON e.depart = d.dno  WHERE d.dname = "市場部";
SELECT * FROM emp e ,dept d WHERE e.depart = d.dno AND d.dname = "市場部";


c) 查詢出所有人事處職工的姓名和入職時間 
SELECT ename,rztime  FROM emp e JOIN dept d ON e.depart= d.dno WHERE d.dname ="人事處";


d) 查詢出所有男職工的基本信息 
SELECT * FROM emp WHERE sex = "男";


e) 查詢出所有女職工的姓名、出生年月和所在部門 
SELECT ename,birth,dname FROM emp e JOIN dept d ON e.depart = d.dno WHERE e.sex = "女";


f) 查詢出所有入職時間在 2000 年以後的女職工的職工號、姓名和入職時間 
SELECT eno,ename,rztime FROM emp WHERE rztime >"2000"


h) 查詢出所有姓名是兩個字的員工基本信息
SELECT * FROM emp e  JOIN dept d ON e.depart = d.dno  WHERE e.ename LIKE "__";


i) 查詢出所有姓李的職工的基本信息
SELECT * FROM emp e  JOIN dept d ON e.depart = d.dno  WHERE e.ename LIKE "李_";


j) 查詢出財務處的所有的黨員 
SELECT * FROM emp e JOIN dept d  ON e.depart = d.dno WHERE d.dname = "財務處" AND e.dy="是";


k) 查詢所有的女黨員
SELECT ename e FROM emp WHERE sex = "女" AND dy ="是";


l) 查詢出所有出生年月在 1960 以前的員工 
SELECT ename FROM emp WHERE birth<"1960";


m) 查詢出所有職工的姓名和年齡(注意:是年齡不是出生日期)
SELECT ename AS 姓名,TIMESTAMPDIFF(YEAR, birth, CURDATE()) AS 年齡 FROM emp

n) 查詢出所有籍貫是北京市或天津市的職工信息(使用 OR 和 IN 分別查 詢) 
SELECT * FROM emp WHERE address ="北京市" OR address = "天津市";
SELECT * FROM emp WHERE address IN("北京市","天津市");


o) 查詢出所有籍貫不是天津市的職工信息(使用 NOT 和<>分別查詢) 
SELECT * FROM emp WHERE address <>"天津市";
SELECT * FROM emp WHERE NOT address ="天津市";


p) 查詢出所有籍貫不是天津市也不是北京市的員工信息(使用 AND 和 NOT IN 分別查詢) 
SELECT * FROM emp WHERE address <>"天津市" AND address <>"北京市";
SELECT * FROM emp WHERE address NOT IN ("北京市","天津市");


q) 查詢出職工號在 5-10 之間的員工信息(使用 AND 和 BETWEEN 分別查 詢) 
SELECT * FROM emp WHERE eno >=5 AND eno <=10;
SELECT * FROM emp WHERE eno BETWEEN 5 AND 10;


r) 查詢出所有職工的實際工資和職工號 
SELECT (wages+allowance+suply+award-deduct-tax) AS 實際工資,eno AS 職工號 FROM sal;


s) 查詢出所有實際工資在 3000-3500 之間的職工號和稅收 
SELECT eno AS 職工號,tax AS 稅收,(wages+allowance+suply+award-deduct-tax) AS 實際工資 
FROM sal 
WHERE (wages+allowance+suply+award-deduct-tax) 
BETWEEN 3000 AND 3500


t) 查詢出所有籍貫爲空的職工的基本信息 
SELECT * FROM emp WHERE address ="";


u) 查詢出姓李並且第二個字是玉或者藝字的職工 
SELECT * FROM emp WHERE ename LIKE '李玉%' OR ename LIKE "李藝%";


v) 查詢出姓李並且第二個字不是玉或者藝的職工
SELECT * FROM emp WHERE ename LIKE "李%" AND ename NOT LIKE '李玉%' AND ename NOT LIKE "李藝%";

.針對上表,做如下操作 
a) 新添加 16 號員工的信息,其他字段值自定
INSERT INTO emp VALUES(16,"李峯晨","男","1982-02-10","否","2002-08-24",2,"陝西省")


b) 刪除 1950 年以前的員工信息 
DELETE FROM emp WHERE birth<"1950";


c) 工資的調整:

i. 1-5 號職工,基本工資增加 200
UPDATE sal SET wages=wages+200 WHERE eno BETWEEN 1 AND 5;


ii. 6-10 號職工,基本工資增加百分之十,津貼增加 50 
UPDATE sal SET wages=wages*1.1,allowance = allowance+50 WHERE eno BETWEEN 6 AND 10;


iii. 11 號以上職工,基本工資增加 150,津貼增加 30,補助增加 20
UPDATE sal SET wages=wages+150,allowance = allowance+30,suply = suply+20 WHERE eno >=11;


iv. 所有職工獎金增加 80 
UPDATE sal SET award = award+80 


v. 有“扣除”項的職工,沒有獎金
UPDATE sal SET award = 0 WHERE deduct <>0;


3. 高級查詢 
a) 按基本工資由大到小顯示所有職工的職工號和實際工資 
SELECT eno,(wages+allowance+suply+award-deduct-tax) AS 實際工資 FROM sal ORDER BY wages DESC;


b) 按實際工資由大到小顯示所有職工的職工號和實際工資 
SELECT eno,(wages+allowance+suply+award-deduct-tax) AS 實際工資 
FROM sal 
ORDER BY (wages+allowance+suply+award-deduct-tax) DESC;


c) 按部門升序顯示職工的職工號和實際工資 
SELECT emp.`eno`,emp.`depart`,(wages+allowance+suply+award-deduct-tax) AS 實際工資 
FROM sal JOIN emp ON sal.eno=emp.eno ORDER BY depart ASC;

d) 求出所有職工的基本工資的和 
SELECT SUM(wages) AS 基本工資總和 FROM sal;


e) 求出所有職工的實際工資的和 
SELECT SUM((wages+allowance+suply+award-deduct-tax) )AS 實際工資總和 FROM sal;


f) 求出 5-10 號沒有被扣除工資的員工的基本工資和 
SELECT SUM(wages) AS 基本工資總和 FROM sal WHERE eno BETWEEN 5 AND 10;


g) 求出所有職工基本工資的平均工資 
SELECT AVG(wages) AS 平均工資 FROM sal


h) 求出所有職工實際工資的平均工資
SELECT AVG((wages+allowance+suply+award-deduct-tax)) AS 平均工資 FROM sal


i) 統計出女工的數目
SELECT COUNT(*) AS 女工數量 FROM emp WHERE sex ="女";


j) 統計出天津的女工個數 
SELECT COUNT(*) AS 女工數量 FROM emp WHERE sex ="女" AND address = "天津市";


k) 統計出本月被扣除工資的職工數和扣除的總金額
SELECT COUNT(*),SUM(deduct) FROM sal;


l) 統計出實際工資大於 3000 的職工數
SELECT COUNT(*) FROM sal WHERE (wages+allowance+suply+award-deduct-tax)>3000;


m) 統計出職工的最大工齡 
SELECT MAX(TIMESTAMPDIFF(YEAR,rztime,CURDATE())) AS 最大工齡 FROM emp;

n) 統計出女職工的最小年齡 
SELECT MIN(TIMESTAMPDIFF(YEAR,birth,CURDATE())) AS 最小女年齡 FROM emp WHERE sex = "女";


o) 統計出天津女黨員的最大年齡 
SELECT MAX(TIMESTAMPDIFF(YEAR,birth,CURDATE())) AS 最大天津年齡 
FROM emp 
WHERE sex = "女" AND address = "天津市";


p) 統計出各部門最高的工齡 
SELECT MAX(TIMESTAMPDIFF(YEAR,rztime,CURDATE())) AS 最大工齡,dname AS 部門 
FROM emp JOIN  dept ON emp.`depart`=dept.`dno`
GROUP BY dname;
SELECT MAX(TIMESTAMPDIFF(YEAR,rztime,CURDATE())) AS 最大工齡,depart FROM emp GROUP BY depart;


q) 統計出最大的男工和女工的年齡 
SELECT MAX(TIMESTAMPDIFF(YEAR,rztime,CURDATE())) AS 最大工齡,sex FROM emp GROUP BY sex;


r) 統計出各部門的員工數
SELECT dname,COUNT(*) FROM emp JOIN dept ON emp.`depart`=dept.`dno` GROUP BY dname;


s) 列出各部門的女工數 
SELECT dname,COUNT(*) FROM emp JOIN dept ON emp.`depart`=dept.`dno` WHERE sex = "女" GROUP BY dname;


t) 列出各部門的男工數和女工數 
SELECT dname,COUNT(*) AS 總數,sex FROM emp JOIN dept ON emp.`depart`=dept.`dno` GROUP BY dname,sex;

8. 多表查詢 
a) 顯示出所有職工的姓名和部門名 
SELECT ename,dname FROM emp JOIN dept ON emp.`depart`=dept.`dno`


b) 按部門升序顯示出所有職工的姓名和部門名 
SELECT ename,dname FROM emp JOIN dept ON emp.`depart`=dept.`dno` ORDER BY dno ASC;


c) 顯示出所有職工的姓名、基本工資和入職時間
SELECT ename,wages,rztime FROM sal JOIN emp ON sal.`eno`=emp.eno;


d) 顯示出所有職工的姓名、年齡、部門和實際工資 
SELECT ename,TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age,dname,(wages+allowance+suply+award-deduct-tax) 
AS 實際工資 FROM sal JOIN emp ON sal.eno = emp.`eno` JOIN dept ON emp.`depart`= dept.`dno`;


e) 顯示出所有被扣工資的員工姓名和被扣金額 
SELECT ename,deduct AS 被扣金額 FROM sal JOIN emp ON sal.eno = emp.eno WHERE deduct <>0;


f) 按部門升序顯示職工的姓名、所在部門和實際工資 
SELECT ename,dname,(wages+allowance+award+suply-deduct-tax) AS 實際工資 FROM dept JOIN emp ON dept.dno=emp.depart JOIN sal ON 
emp.eno = sal.eno ORDER BY depart ASC;


g) 按部門名升序、實際工資降序顯示部門名稱、職工號和實際工資
SELECT dname,eno,(wages+allowance+award+suply-deduct-tax) AS 實際工資 FROM dept JOIN emp ON dept.dno=emp.depart JOIN sal ON 
emp.eno = sal.eno ORDER BY emp.depart ASC  ORDER BY (wages+allowance+award+suply-deduct-tax) DESC;


9. 子查詢 
a) 顯示出工齡最大的職工姓名和工齡 
SELECT ename,TIMESTAMPDIFF(YEAR,rztime,CURDATE()) AS 工齡 FROM emp ORDER BY 工齡 DESC LIMIT 0,1;


b) 統計出所有北京籍員工的工資總和 
SELECT SUM(wages) FROM sal JOIN emp ON sal.eno = emp.eno WHERE address = "北京市"


c) 統計出所有女職工的平均工資 
SELECT AVG(wages) FROM sal JOIN emp ON sal.eno = emp.eno WHERE address = "天津市"  AND sex = "女";


d) 統計出所有天津女黨員的最低工資
SELECT MIN(wages)

FROM sal JOIN emp ON sal.eno = emp.eno

WHERE address = "天津市"  AND sex = "女" AND dy="是";


e) 查詢所有市場部職工的基本信息
SELECT * FROM emp JOIN dept ON emp.depart = dept.dno WHERE dname = "市場部";


f) 顯示出最小的女職工的姓名和年齡 
SELECT ename,TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS 年齡 FROM emp WHERE sex = "女" ORDER BY 年齡 ASC LIMIT 0,1;


g) 統計出實際工資最高的北京籍員工的姓名和實際工資 
SELECT ename,(wages+allowance+suply+award-deduct-tax) AS 實際工資 FROM emp JOIN sal ON emp.eno = sal.eno WHERE address = "北京市"
ORDER BY 實際工資 DESC LIMIT 0,1;


h) 顯示出年齡最大的天津女黨員 
SELECT ename,TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS 年齡 FROM emp WHERE  address = "天津市"  AND sex = "女" AND dy="是" 
ORDER BY 年齡 DESC LIMIT 0,1;


i) 顯示出基本工資比天津市最高工資高的所有職工
SELECT ename 
FROM emp JOIN sal ON emp.eno= sal.eno  
WHERE wages > (SELECT wages FROM sal JOIN emp ON sal.eno = emp.eno WHERE address = "天津市" ORDER BY wages DESC LIMIT 0,1);


j) 顯示出實際工資比總體平均工資低的女職工 
SELECT ename,(wages+allowance+suply+award-deduct-tax) AS 實際工資 FROM emp JOIN sal ON emp.eno= sal.eno  WHERE 
(wages+allowance+suply+award-deduct-tax)<(SELECT AVG(wages) FROM sal JOIN emp ON sal.eno = emp.eno );


k) 顯示出人數最多的部門的所有職工信息 
SELECT * FROM emp WHERE depart = (SELECT depart FROM emp GROUP BY depart ORDER BY COUNT(*) DESC  LIMIT 0,1);


l) 顯示出工資最高的職工的姓名,性別,籍貫和所在部門名稱 
SELECT ename,sex,address,dname 
FROM dept JOIN emp ON dept.`dno`=emp.`depart` JOIN sal ON emp.`eno`=sal.`eno` 
ORDER BY wages DESC LIMIT 0,1;


m) 顯示出比天津市入職最晚的職工入職還晚的職工 
SELECT ename FROM emp WHERE rztime > (SELECT rztime FROM emp WHERE address = "天津市" ORDER BY rztime DESC LIMIT 0,1);


n) 顯示出比‘劉新’工資高的所有職工姓名和實際工資 
SELECT ename,(wages+allowance+suply+award-deduct-tax) AS 實際工資 FROM emp JOIN sal ON emp.eno = sal.`eno` WHERE wages>(
SELECT wages FROM emp JOIN sal ON emp.eno = sal.`eno` WHERE ename= "劉新");


o) 顯示出獎金和‘李藝’一樣多的職工姓名和所在部門名稱
SELECT ename,dname FROM dept JOIN emp ON dept.dno = emp.`depart`JOIN sal ON emp.`eno`= sal.`eno` WHERE award=
(SELECT award FROM emp JOIN sal ON emp.eno = sal.`eno` WHERE ename= "李藝")


p) 給所有市場部的職工增加 200 元的基本工資 
UPDATE sal SET wages= wages+200 WHERE eno IN (SELECT eno FROM dept JOIN emp ON dept.dno = emp.depart WHERE dname ="市場部");


q) 所有非天津籍員工的補助增加 100 元作爲思鄉補助 
UPDATE sal SET suply= suply+100 WHERE eno NOT IN (SELECT eno FROM  emp  WHERE address ="天津市");

);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章