MySQL阿里云数据库学习路线黑马程序员随课笔记;


开启/退出:

net start mysql;
net stop mysql;

 登录与退出

mysql -uroot -pAa8316057 -hlocalhost
exit或quit

常见操作:

DDL  数据库或表的结构操作(****)
DML 对表的记录更新(增//改)(****)
DQL  对表的记录查询(****,难点)
DCL 用户创建及授权    

类型:

  标准:

int整型
double(5,2)
decimal精确浮点型
char 固长 字符串255              补
varchar 变长 字符串65535    不补

  方言(mySQL独有)

MySQL独有:
text(clob):字符串类型
blob:字节类型
date:日期
time:时间
timestamp:时间戳

DDL:

数据库(DATABASE)

 (创建CREATE,查看SHOW,进入USE,删除DROP)

表(TABLE):

查询表结构: DESC 表名
创建:
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列类型 [PRIMARY KEY] [AUTO_INCREMENT];
...
);
修改:
  ***公共前缀***ALTER TABLE 表名
    添加列:  ***公共前缀*** ADD(列名 列类型,...);
    删除列:  ***公共前缀*** DROP 列名     
    改列名:  ***公共前缀*** CHANGE 原列名 新列名 列类型     
    改列类型:***公共前缀*** MODIFY 列名 列新类型 
    改表名:  ***公共前缀*** RENAME TO 新表名

 

DQL(基本查询):

列控制:

查询所有列(或指定列 丨 查询但不显示完全重复行):
SELECT * FROM 表名
查询指定列: 把 * 变成 列1,..,列n
查询但不显示完全重复行: 在 * 前 加DISTINCT
列运算:(光查,并不改变数据)
SELECT 运算 FROM 表名;
  加///除: sal+8   sal+name
  字符串运算: CONCAT('$',sal)
  转换NULL值(把NULL当0来运算): IFNULL(comm,0)+100
  给列取别名: IFNULL(comm,0)+100 AS 奖金       - (其中AS可以省略)

条件控制:

    条件查询:(和UPDATE一样的操作方式)
        SELECT * FROM 表名 WHERE 条件;
    模糊查询:
        SELECT * FROM 表名 WHERE 列名 like '张_';
            **** 重点:  _ 一个字符     % 0-n个字符;
    排序:
        SELECT * FROM 表名 ORDER BY 列名 ASC;
            升序: ASC(ASC可以省略)
            降序: DESC(DESC不可以省略)
            多列作为排序条件:列名 ASC,列名 DESC

聚合函数:(列纵向运算)

SELECT 聚合函数 FROM 表名;
    1:行数 COUNT(*或列名)  - 不记NULL 
    2:大   MAX(列名) 
    3:小   MIN(列名)    
    4:和   SUM(列名)    
    5:平均 AVG(列名)
    多项:MAX(列名) AS 大 , MIN(列名) AS 小 ,SUM(列名) AS 和;

分组查询:

SELECT 分组列,聚合函数(支持多项) FROM 表名 [WHERE 条件] GROUP BY 分组列 [HAVING 条件];
  执行顺序     
SELECT 查询     FROM 从     WHERE 去分组前条件     GROUP BY 分组     HAVING 去分组后条件     ORDER BY 排序

LIMIT子句(方言) 

SELECT * FROM 表名 LIMIT 4,3;(从第5行开始查,一共查3行)   -(当前页-1) * 每页记录数 , 每页记录数;

DML:

插入数据:

    插入列数据:
        INSERT INTO 表名(列名1,列名2,...) VALUES(列值1,列值2,..);
    修改列值:
        UPDATE 表名 SET 列名=列值,...;(全改)
        UPDATE 表名 SET 列名=列值 WHERE 条件列名 = 条件列值 or ... ;(指定条件改)
    =   !=  <>  >  <  >=  <=  NOT  OR  AND   BETWEEN...AND    IN(...)    IS NULL  
    删除数据:
        DELETE FROM 表名 [WHERE 条件]; - 一定要加WHERE!!!

DCL:

    创建用户:
        CREATE USER 用户名@ip地址 IDENTIFIED BY '密码';       任意IP登录: @'%'
    给用户授权:
        GRANT 权限1,..权限n NO 数据库.* TO 用户名@ip地址     所有权限: ALL
    取消权限:
        REVOKE 权限1,..权限n NO 数据库.* FROM 用户名@ip地址    
    查看权限:
        SHOW GRANTS FOR 用户名@ip地址
    删除用户:
        DROP USER 用户名@ip地址

SQL导入(原版和阿里云版)

/*原版*/
CREATE TABLE emp (
    empno NUMERIC(4) NOT NULL,
    ename VARCHAR(10),
    job VARCHAR(9),
    mgr NUMERIC(4),
    hiredate DATETIME,
    sal NUMERIC(7, 2),
    comm NUMERIC(7, 2),
    deptno NUMERIC(2)
);

INSERT INTO emp VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20);
INSERT INTO emp VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
INSERT INTO emp VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
INSERT INTO emp VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, NULL, 20);
INSERT INTO emp VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
INSERT INTO emp VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, NULL, 30);
INSERT INTO emp VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, NULL, 10);
INSERT INTO emp VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000, NULL, 20);
INSERT INTO emp VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10);
INSERT INTO emp VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
INSERT INTO emp VALUES (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100, NULL, 20);
INSERT INTO emp VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, NULL, 30);
INSERT INTO emp VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, NULL, 20);
INSERT INTO emp VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, NULL, 10);

CREATE TABLE dept (
    deptno NUMERIC(2),
    dname VARCHAR(14),
    loc VARCHAR(13)
);

INSERT INTO dept VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO dept VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO dept VALUES (40, 'OPERATIONS', 'BOSTON');

CREATE TABLE bonus (
    empno NUMERIC(4),
    job VARCHAR(9),
    sal NUMERIC,
    comm NUMERIC
);

CREATE TABLE salgrade (
    grade NUMERIC,
    losal NUMERIC,
    hisal NUMERIC
);

INSERT INTO salgrade VALUES (1, 700, 1200);
INSERT INTO salgrade VALUES (2, 1201, 1400);
INSERT INTO salgrade VALUES (3, 1401, 2000);
INSERT INTO salgrade VALUES (4, 2001, 3000);
INSERT INTO salgrade VALUES (5, 3001, 9999);


/*阿里云emp表*/
CREATE TABLE `emp` (
  `empno` INT(11) NOT NULL,
  `ename` VARCHAR(255) DEFAULT NULL,
  `job` VARCHAR(255) DEFAULT NULL,
  `mgr` INT(11) DEFAULT NULL,
  `hiredate` DATE DEFAULT NULL,
  `sal` DECIMAL(10,2) DEFAULT NULL,
  `COMM` DECIMAL(10,2) DEFAULT NULL,
  `deptno` INT(11) DEFAULT NULL,
  PRIMARY KEY  (`empno`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
 
INSERT INTO `emp` VALUES ('1001', '甘宁', '文员', '1013', '2000-12-17', '8000.00', NULL, '20');
INSERT INTO `emp` VALUES ('1002', '黛绮丝', '销售员', '1006', '2001-02-20', '16000.00', '3000.00', '30');
INSERT INTO `emp` VALUES ('1003', '殷天正', '销售员', '1006', '2001-02-22', '12500.00', '5000.00', '30');
INSERT INTO `emp` VALUES ('1004', '刘备', '经理', '1009', '2001-04-02', '29750.00', NULL, '20');
INSERT INTO `emp` VALUES ('1005', '谢逊', '销售员', '1006', '2001-09-28', '12500.00', '14000.00', '30');
INSERT INTO `emp` VALUES ('1006', '关羽', '经理', '1009', '2001-05-01', '28500.00', NULL, '30');
INSERT INTO `emp` VALUES ('1007', '张飞', '经理', '1009', '2001-09-01', '24500.00', NULL, '10');
INSERT INTO `emp` VALUES ('1008', '诸葛亮', '分析师', '1004', '2007-09-01', '30000.00', NULL, '20');
INSERT INTO `emp` VALUES ('1009', '曾阿牛', '董事长', NULL, '2001-11-17', '50000.00', NULL, '10');
INSERT INTO `emp` VALUES ('1010', '韦一笑', '销售员', '1006', '2001-09-08', '15000.00', '0.00', '30');
INSERT INTO `emp` VALUES ('1011', '周泰', '文员', '1008', '2007-05-28', '11000.00', NULL, '20');
INSERT INTO `emp` VALUES ('1012', '程普', '文员', '1006', '2001-12-03', '9500.00', NULL, '30');
INSERT INTO `emp` VALUES ('1013', '庞统', '分析师', '1004', '2001-12-09', '30000.00', NULL, '20');
INSERT INTO `emp` VALUES ('1014', '黄盖', '文员', '1007', '2002-01-23', '13000.00', NULL, '10');
INSERT INTO `emp` VALUES ('1015', '张三', '保洁员', '1001', '2019-09-02', '80000.00', '50000.00', '50');

SELECT * FROM emp;

CREATE TABLE dept (
    deptno NUMERIC(2),
    dname VARCHAR(14),
    loc VARCHAR(13)
);
INSERT INTO dept VALUES (10, '财务部', '北京');
INSERT INTO dept VALUES (20, '业务部', '上海');
INSERT INTO dept VALUES (30, '销售部', '广州');
INSERT INTO dept VALUES (40, '运营部', '昆明');

SELECT * FROM dept;

单表查询练习

/*单表查询*/ 
/*1、查询出部门编号为30的所有员工*/ 
SELECT * FROM emp WHERE deptno = 30; 

/*2、查询所有销售员的名字、编号和部门编号*/ 
SELECT ename AS 姓名, empno AS 编号, deptno AS 部门编号 
FROM emp 
WHERE job = '销售员'; 

/*3、找出奖金高于工资的员工*/ 
SELECT * 
FROM emp 
WHERE COMM > sal; 

/*4、找出奖金高于工资60%的员工*/ 
SELECT *,(IFNULL(sal,0)*0.6) AS `工资的60%` 
FROM emp 
WHERE COMM > sal*0.6; 
/*注意: 其中IFNULL是聚合函数:表示将null值变为数值0,便于数学计算 别名中要输出特殊字符 必须使用``反引号(键盘左上角第二排第一个)包含输出内容*/ 

/*5、找出部门编号为10中所有经理和部门编号为20中所有销售人员的详细资料*/ 
SELECT * 
FROM emp 
WHERE (deptno = '10' AND job = '经理') OR (deptno='20' AND job='销售员'); 

/*6、找出部门编号为10中所有经理,部门编号为20中所有销售员,还有既不是经理又不是销售员但其工资大于或等于20000的所有员工详细资料*/ 
SELECT * 
FROM emp 
WHERE (deptno = '10' AND job = '经理') OR (deptno='20' AND job='销售员') OR (job != '经理' AND job != '销售员' AND sal > 20000); 
/*或者*/
 SELECT * 
 FROM emp 
 WHERE (deptno = '10' AND job = '经理') OR (deptno='20' AND job='销售员') OR (job NOT IN('经理', '销售员') AND sal >= 20000); 
 
 /*7、无奖金或奖金低于1000的员工*/ 
 SELECT * 
 FROM emp 
 WHERE COMM IS NULL OR COMM < 1000; 
 
 /*8、 查询名字由三个字组成的员工*/ 
 SELECT * 
 FROM emp 
 WHERE ename LIKE '___'; 
 
 /*9、查询2000年入职的员工*/ 
 SELECT * 
 FROM emp 
 WHERE hiredate BETWEEN '2000-01-01' AND '2000-12-31'; 
 /*或者*/ 
 SELECT * 
 FROM emp 
 WHERE hiredate LIKE '2000-%'; 
 
 /*10、查询所有员工详细信息,用编号降序排序*/ 
 SELECT * 
 FROM emp 
 ORDER BY empno DESC; 
 
 /*11、查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序*/ 
 SELECT * 
 FROM emp 
 ORDER BY sal DESC, hiredate ASC; 
 
 /*12、查询每个部门的平均工资*/ 
 SELECT deptno, AVG(sal) AS 平均工资 
 FROM emp 
 GROUP BY deptno; 
 
 /*13、查询每个部门的雇员数量*/ 
 SELECT deptno, COUNT(*) AS 部门人数 
 FROM emp 
 GROUP BY deptno; 
 
 /*14、查询每种工作的最高工资、最低工资、人数*/ 
 SELECT job, MAX(sal) AS 最高工资, MIN(sal) AS 最低工资, COUNT(*) 
 FROM emp 
 GROUP BY job; 

 

查看数据库编码:

    SHOW VARIABLES LIKE 'char%';
    改:C:\ProgramData下my.ini文件 : default-character-set=gbk
         可以改3个变量client(进).connection.results(出)

备份/恢复 数据库内容:

备份数据库内容(退出状态下输入):    mysqldump -u用户名 -p密码 据库名>f:/a.sql
恢复数据库内容(退出状态下输入):    mysql -u用户名 -p密码 据库名<f:/a.sql
                        第二种方式:进入数据库后 source f:/a.sql

约束:

1:主键约束:

    非空,唯一,被引用
  创建: 创建时候在 列名 列类型 后加 PRIMARY KEY []; 创建后: ALTER TABLE 表名 ADD PRIMARY KEY(列名); 删除: ALTER TABLE 表名 DROP PRIMARY KEY;

2:主键自增长:

    创建:AUTO_INCREMENT(在主键后面加 , 详看创建列) - 只能加在整数

uuid

CREATE TABLE person(
    uid VARCHAR(50) PRIMARY KEY,
    ename VARCHAR(10)
);

INSERT INTO person VALUES(REPLACE(UUID(),"-",""),'张三');

3:非空约束:

NOT NULL;

4:唯一约束:

UNIQUE;一般和NOT NULL一起用

5:概念模型:

6:外键约束:

语法:CONSTRAINT fk_子表_父表   FOREIGN KEY(外键列名) REFERENCES 关系表(关联表的主键)
    例:CONSTRAINT fk_student_class FOREIGN KEY(s_cid) REFERENCES class(cid)

1对1(从表的主键即是外键,链接主表主键)

 /*--------1对1--------*/ 
   
   /*创建表*/
CREATE TABLE hashand(/*主表*/
hid INT PRIMARY KEY AUTO_INCREMENT,
hname VARCHAR(50)
);
/*修改表名*/
ALTER TABLE hashand
RENAME TO hasband
/*插入记录*/
INSERT INTO hasband VALUES(NULL,'刘备');
INSERT INTO hasband VALUES(NULL,'关羽');
INSERT INTO hasband VALUES(NULL,'张飞');
/*查看*/
SELECT * FROM hasband

/*这是1对多,违反了婚姻法
CREATE TABLE wife(
  wid int primary KEY auto_increment,
  wname VARCHAR(50),
  hid int,
  CONSTRAINT fk_wife_hasband foreign key(hid) references hasband(hid)
  );
  */
  
  /*创建1对1*/
CREATE TABLE wife(
  wid INT PRIMARY KEY AUTO_INCREMENT,
  wname VARCHAR(50),
  CONSTRAINT fk_wife_hasband FOREIGN KEY(wid) REFERENCES hasband(hid)/*把主键作为了外键*/
  );
  /*
  wid
  1:非空
  2:唯一
  3:引用hid
  */
  /*满足以上3个条件*/
  INSERT INTO wife VALUES(1,'杨贵妃');
  INSERT INTO wife VALUES(2,'妲己');
  INSERT INTO wife VALUES(3,'大乔');
  /*查询*/
  SELECT * FROM wife;

 1对多(从表新创建列作为外键,连接主表主键)

 /*--------1对多--------*/ 

CREATE TABLE class(
cid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(15) NOT NULL ); INSERT INTO class VALUES(NULL,'六年级一班'); INSERT INTO class VALUES(NULL,'六年级二班'); SELECT * FROM class; /*在sql语句末端添加*/ CREATE TABLE student( sid INT AUTO_INCREMENT, sname VARCHAR(10), s_cid INT, PRIMARY KEY(sid), FOREIGN KEY (s_cid) REFERENCES class(cid) ); INSERT INTO student VALUES(NULL,'王大锤',2); INSERT INTO student VALUES(NULL,'胡汉三',3);/*约束生效  插入失败*/ SELECT * FROM student; /*fk的使用*/ CREATE TABLE student( sid INT AUTO_INCREMENT, sname VARCHAR(10) NOT NULL, s_cid INT , PRIMARY KEY(sid), CONSTRAINT fk_student_class FOREIGN KEY(s_cid) REFERENCES class(cid) ); INSERT INTO student VALUES(NULL,'王大锤',2); INSERT INTO student VALUES(NULL,'胡汉三',3);/*约束生效  插入失败*/ SELECT * FROM student; /*在建表后添加外键*/ CREATE TABLE student( sid INT AUTO_INCREMENT, sname VARCHAR(10) NOT NULL, s_cid INT , PRIMARY KEY(sid) ); ALTER TABLE student ADD FOREIGN KEY (s_cid) REFERENCES class(cid); INSERT INTO student VALUES(NULL,'王大锤',2); INSERT INTO student VALUES(NULL,'胡汉三',3); /*约束生效  插入失败*/ SELECT * FROM student;

多对多(创建中间表,列分别作为外键,链接对应主表主键)

   /*--------多对多--------*/ 
/*创建学生表*/
CREATE TABLE student(
  sid INT PRIMARY KEY AUTO_INCREMENT,
  sname VARCHAR(50));

/*创建教师表*/
CREATE TABLE teacher(
  tid INT PRIMARY KEY AUTO_INCREMENT,
  tname VARCHAR(50));
  
/*创建关联表*/
CREATE TABLE stu_tea(
  sid INT,
  tid INT,
  CONSTRAINT fk_student FOREIGN KEY(sid) REFERENCES student(sid),
  CONSTRAINT fk_teacher FOREIGN KEY(tid) REFERENCES teacher(tid)
);
/*往2张表插记录*/
INSERT INTO student VALUES(NULL,'刘德华');
INSERT INTO student VALUES(NULL,'梁朝伟');
INSERT INTO student VALUES(NULL,'谢霆锋');
INSERT INTO student VALUES(NULL,'张含韵');
INSERT INTO student VALUES(NULL,'小虎乐队');

INSERT INTO teacher VALUES(NULL,'李代萍');
INSERT INTO teacher VALUES(NULL,'童林');
INSERT INTO teacher VALUES(NULL,'张老师');

/*分别查出来*/
SELECT * FROM student;
SELECT * FROM teacher;

/*建立关系*/
INSERT INTO stu_tea VALUES(1,1);
INSERT INTO stu_tea VALUES(2,1);
INSERT INTO stu_tea VALUES(3,1);
INSERT INTO stu_tea VALUES(4,1);
INSERT INTO stu_tea VALUES(5,1);

INSERT INTO stu_tea VALUES(2,2);
INSERT INTO stu_tea VALUES(3,2);
INSERT INTO stu_tea VALUES(4,2);

INSERT INTO stu_tea VALUES(3,3);
INSERT INTO stu_tea VALUES(4,3);
INSERT INTO stu_tea VALUES(5,3);

/*查关系表*/
SELECT * FROM stu_tea;

 多表查询

  1:分类:

    合并结果集

  *要求被合并的表中,列的类型和列数相同
  *UNION,去除重复行
  *UNION ALL,不去除重复行
SELECT * FROM cd UNION ALL SELECT * FROM ab
   /*--------课时11 合并结果集--------*/ 
/*创建2个表结构一样的表*/ 
CREATE TABLE ab (a INT , b VARCHAR(50));
CREATE TABLE cd (c INT , d VARCHAR(50));
/*插入记录*/ 
INSERT INTO ab VALUES(1,'1');
INSERT INTO ab VALUES(2,'2');
INSERT INTO ab VALUES(3,'3');

INSERT INTO cd VALUES(3,'3');
INSERT INTO cd VALUES(4,'4');
INSERT INTO cd VALUES(5,'5');

/*链接2个表结构一样的表(合并结果集))*/
SELECT * FROM ab
UNION ALL
SELECT * FROM cd

/*链接2个表结构一样的表(合并结果集))*/
SELECT * FROM ab
UNION /*完全相同的行会被去除*/
SELECT * FROM cd

    链接查询

内链接
    *方言: SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.xx = 别名2.xx
    *标准: SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx = 别名2.xx
    *自然: SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2
    *内链接查询出的所有记录都满足条件
 
/*方言内链接*/
SELECT *
FROM emp,dept
WHERE emp.deptno = dept.deptno; /*去除笛卡尔积*/

/*打印所有员工的姓名,工资,以及部门名称*/
SELECT emp.ename,emp.sal,dept.dname
FROM emp,dept
WHERE emp.deptno = dept.deptno; 
/*取别名*/
SELECT e.ename,e.sal,d.dname
FROM emp e,dept d
WHERE e.deptno = d.deptno; 

   /*标准内连接*/
SELECT e.ename,e.sal,d.dname
FROM emp e INNER JOIN dept d /*逗号改为 INNER JOIN */
ON e.deptno = d.deptno; /*WHERE 改为 ON */

/*自然内连接*/ /*这种不用记*/ SELECT e.ename,e.sal,d.dname FROM emp e NATURAL JOIN dept d ;/*INNER JOIN 改为 NATURAL JOIN */
外链接
   >左外连接
   >右外连接
   >全外连接(MySQL不支持)
  *自然链接(属于一种简化方式)
   /*--------课时14 连接查询之外连接--------*/ 
/*外连接之左外*/
SELECT e.ename,e.sal,IFNULL(d.dname,'无部门')
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno = d.deptno;

/*外连接之右外*/
SELECT e.ename,e.sal,IFNULL(d.dname,'无部门')
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno;

/*外连接之全外*/
SELECT e.ename,e.sal,d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno = d.deptno
UNION
SELECT e.ename,e.sal,d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno

 

子查询

/*查询本公司工资最高的员工的详细信息*/
第一步:SELECT MAX(SAL) FROM emp;/*查询最高工资*/
第二步:SELECT * FROM emp WHERE sal=()/*把最高工资放到括号里*/
第三步:SELECT * FROM emp WHERE sal=(SELECT MAX(SAL) FROM emp);/*这就是子查询*/

 

  子查询可以出现的位置

/*FROM方式查询*/
SELECT *
FROM/*这里可以*/
WHERE 条件 /*这里可以*/

 

/*单行单列案例:高于平均工资的所有人*/
SELECT * FROM emp WHERE sal > (SELECT AVG(sal) FROM emp)

/*多行单列案例1:高于30部门最高工资的所有员工*/
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30)  /*ALL 所有的意思*/
/*案例2:大于任意1个经理工资的所有员工*/
SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE job='经理')  /*ANY 任意的意思*/

/*单行多列案例(很少使用):查询工资和部门与张学友完全相同的员工*/
SELECT * FROM emp WHERE (job,deptno,sal) IN (SELECT job,deptno,sal FROM emp WHERE ename='殷天正')

/*多行多列案例:30部门所有人*/
SELECT * FROM emp WHERE deptno=30;

 

 

作业:

 

/*
1. 查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。
列:d.deptno, d.dname, d.loc, 部门人数
表:dept d, emp e
条件:e.deptno=d.deptno
*/
SELECT d.*, z1.cnt 
FROM dept d, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) z1
WHERE d.deptno = z1.deptno

/*
2. 列出所有员工的姓名及其直接上级的姓名。
列:员工姓名、上级姓名
表:emp e, emp m
条件:员工的mgr = 上级的empno
*/
SELECT * 
FROM emp e, emp m
WHERE e.mgr=m.empno

SELECT e.ename, IFNULL(m.ename, 'BOSS') 领导
FROM emp e LEFT OUTER JOIN emp m
ON e.mgr=m.empno


/*
3. 列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。
列:e.empno, e.ename, d.dname
表:emp e, emp m, dept d
条件:e.hiredate<m.hiredate
思路:
1. 先不查部门名称,只查部门编号!
列:e.empno, e.ename, e.deptno
表:emp e, emp m
条件:e.mgr=m.empno, e.hiredate<m.hireadate
*/
SELECT e.empno, e.ename, e.deptno
FROM emp e, emp m
WHERE e.mgr=m.empno AND e.hiredate<m.hiredate


SELECT e.empno, e.ename, d.dname
FROM emp e, emp m, dept d
WHERE e.mgr=m.empno AND e.hiredate<m.hiredate AND e.deptno=d.deptno

 

/*
4. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
列:* 
表:emp e, dept d
条件:e.deptno=d.deptno
*/
SELECT *
FROM emp e RIGHT OUTER JOIN dept d/*右外*/
ON e.deptno=d.deptno

/*
5. 列出最低薪金大于15000的各种工作及从事此工作的员工人数。
列:job, count(*)
表:emp e
条件:min(sal) > 15000
分组:job
*/
SELECT job, COUNT(*)
FROM emp e
GROUP BY job
HAVING MIN(sal) > 15000/*分组后*/


/*
6. 列出在销售部工作的员工的姓名,假定不知道销售部的部门编号。
列:e.ename
表:emp
条件:e.deptno=(select deptno from dept where dname='销售部')
*/

SELECT *
FROM emp e
WHERE e.deptno=(SELECT deptno FROM dept WHERE dname='销售部')

 
/*导入工资等级表 答案未正确,带核实*/
/*
7. 列出薪金高于公司平均薪金的所有员工信息,所在部门名称,上级领导,工资等级。
列:* 
表:emp e
条件:sal>(查询出公司的平均工资)
*/
/*第一步*/
SELECT e.*, d.dname, m.ename, s.grade
FROM emp e, dept d, emp m, salgrade s
WHERE e.sal>(SELECT AVG(sal) FROM emp) AND e.deptno=d.deptno AND e.mgr=m.empno AND e.sal BETWEEN s.losal AND s.hisal
/*第二步:表全加左外*/
SELECT e.*, d.dname, m.ename, s.grade
FROM 
emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno
    LEFT OUTER JOIN emp m ON e.mgr=m.empno
    LEFT OUTER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
WHERE e.sal>(SELECT AVG(sal) FROM emp)

SELECT * FROM emp;
SELECT * FROM dept;
SELECT * FROM salgrade;

/*
8.列出与庞统从事相同工作的所有员工及部门名称。
列:e.*, d.dname
表:emp e, dept d
条件:job=(查询出庞统的工作)
*/

SELECT e.*, d.dname
FROM emp e, dept d
WHERE e.deptno=d.deptno AND job=(SELECT job FROM emp WHERE ename='庞统')

/*
9.列出薪金高于在部门30工作的所有员工的薪金 的员工姓名和薪金、部门名称。
列:e.ename, e.sal, d.dname
表:emp e, dept d
条件;sal>all (30部门薪金)
*/
SELECT e.ename, e.sal, d.dname
FROM emp e, dept d
WHERE e.deptno=d.deptno AND sal > ALL (SELECT sal FROM emp WHERE deptno=30)

 

 

 

linux或配置相关:

-----------课时3 03.RPM安装-----------
安装:https://blog.csdn.net/heian_99/article/details/89326404

linux卸载mysql(完全卸载)https://blog.csdn.net/qq_41829904/article/details/92966943
linux下开启、关闭、重启mysql服务:https://www.cnblogs.com/stm32stm32/p/7862503.html


查看是否安装成功3种方式:
cat /etc/passwd|grep mysql
cat /etc/group|grep mysql
mysqladmin --version




mysql启动于停止
查看:ps -ef|grep mysql
启动:service mysqld start

为mysql设置密码
/usr/bin/mysqladmin -u root password 123456

自启动设置
设置:chkconfig mysqld on
查看:chkconfig --list|grep mysql
原始命令:ntsysv

路径:
进入:cd /var/lib/mysql/
查看:ls -l
mysql数据库文件的存放路径:/var/lib/mysql/
配置文件目录:/usr/share/mysql
相关命令目录:/usr/bin
启停相关脚本:/etc/init.d/mysql

修改配置文件:
进目录:cd /usr/share/mysql
查:ls -l
mysql的配置文件:
5.5版本:my-huge.cnf 
5.6版本:my-default.cnf 
拷贝:cp /usr/share/mysql/my-default.cnf /etc/my.cnf

修改字符集和路径
show variables like 'character%';  或者   show variables like '%char%';

cd /etc
ls -l my.cnf
vim my.cnf
:set nu

default-character-set=utf8


character_set_server=utf8

character_set_client=utf8

collation-server=utf8mb4_general_ci

 

default-character-set=utf8

 

esc键后保存退出 :wq!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM