数据库(DATABASE DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户
 
或应用共享的数据集合。
简单点说就是;存储,维护和管理数据的集合。
 
数据库管理系统(DBMS):一种操作和管理数据库大型软件。
数据库是通过数据库管理系统创建和操作的。
 
数据库服务器,数据库和表的关系;
数据库服务器就是在机器上安装了一个数据库管理程序,这个程序可以管理多个数据库。
数据库会创建对个表来保存程序中实体的数据。
 
数据在数据库中的存储方式;
以表的形式存储。
表中的列叫字段,行叫一条记录。
一条记录对应一个java数据的对象。
 
SQL;结构化查询语言
主要功能就是同各种数据库建立联系,进行沟通。
SQL 分类;
1.DDL;数据定义语言,用来定义数据库对象:库,表,列等       
关键字有 CREATE ALTER DROP 
创建数据库;CREATE DATABASE mydb1;//创建数据库mydb1
             CREATE DATABASE mydb2 CHARACTER SET gbk;//创建数据库mydb2,并且设置字符集为gbk
             CREATE DATABASE mydb3 CHARACTER SET gbkCOLLATE gbk_chinese_ci;//创建数据库mydb3
 
,设置字符集为gbk,并且设置校对规则
查询;SHOW DATABASE; 查看当前数据库服务器中的所有数据库
     SHOW CREATE DATABASE mydb2; 查看创建的数据库的定义信息
修改;ALTER DATABASE mydb2 CHARACTER SET utf8;把mydb2中的字符集修改为utf8     
删除;DROP DATABASE mydb3;
其他;SELECT DATABASE(); 查看当前使用的数据库
     USE mydb2;切换数据库
     
操作数据表;
         常用的数据类型;
         INT
         DOUBLEDOUBLE(5,2)表示最多5位,其中必须有两位小数
         CHAR固定长度的字符串类型
         VARCHAR可变长度字符串类型
         TEXT字符串类型
         BLOB字节类型
         DATE日期类型 yyyy--MM-dd
         TIME时间类型 hh;mm;ss
         DATETIME日期时间类型 yyyy-MM-dd hh;mm;ss
创建表:
         CREATETABLE emp(
             id INT,
             NAME VARCHAR(50),
             gender VARCHAR(10),
             birthday DATE,
             entry_date DATE,
             job VARCHAR(50),
             salary DOUBLE,
             RESUME VARCHAR(200)
         )
 
表的基本操作;
         SHOWDATABASE; 查看当前数据库中所有表
         DESCemp;  查看表的字段信息
         ALTERTABLE emp ADD image BLOB; 在表上增加一列
         ALTERTABLE emp MODIFY job VARCHAR(60); 修改job列,使其长度为60
         ALTERTABLE emp DROP image;  删除image列一次只能删除一列
         RENAMETABLE emp TO USER; 修改表名
         SHOWCREATE TABLE USER;查看表格的创建细节
         ALTERTABLE USER CHARACTER SET gbk;  修改表的字符集
         ALTERTABLE USER changge NAME username VARCHAR(100); 修改列名
         DROPTABLE USER; 删除表
         
         
2.DML;数据操作语言。是对表中的数据进行增删改的操作
关键字有; INSERT UPDATE DELETE 
 SELECT * FROM 表名; 查询表中中的所有数据
 CREATE TABLE emp(
             id INT,
             NAME VARCHAR(50),
             gender VARCHAR(10),
             birthday DATE,
             salary DOUBLE,
             entry_date DATE,
             RESUME VARCHAR(200)
         )
    
INSERT ;
      INSERT INTO emp(id,NAME,gender,birthday,salary,entry_date,RESUME)
      VALUES(1,'zhangsan','male','1990-4-5',1000,'2015-1-2','good girl');
       
      INSERT INTO emp VALUES(2,'lisi','male','1990-6-5',1000,'2015-1-2','goodgirl');
      
      -- 批量插入
         INSERT INTO emp VALUES
         (3,'li','male','1990-6-5',1000,'2015-1-2','goodgirl'),
         (4,'si','female','1990-6-5',1000,'2015-1-2',NULL),
         (5,'lwang','female','1990-6-5',1000,'2015-1-2',NULL),
         (6,'dashi','male','1990-6-5',1000,'2015-1-2','goodboy');
 UPDATE ;
         
         --将所有员工薪水修改为50000
         UPDATEemp SET salary =5000;
         --将姓名为li的员工薪水修改为50000
         UPDATEemp SET salary =50000 WHERE NAME='li'; 
         --将姓名为si的员工薪水修改为1000,resume改为girl
         UPDATEemp SET salary=1000,RESUME='girl' WHERE NAME='si';
         --将zhangsan的薪水在原有基础上增加1000
         UPDATEemp SET salary=salary+1000 WHERE NAME='zhangsan';
DELETE:
         --删除表中名称为'li'的数据
         DELETEFROM emp WHERE NAME='li';
         --删除表中所有数据
         DELETEFROM emp;
         --使用truncate 删除表中数据
         TRUNCATETABLE emp;
 
DELETE:删除表中数据,表结构还在,删除后的数据可以找回
TRUNCATE;删除是把表直接DROP掉,然后再创建一个同样的新表。删除后的数据不能找回,执行速度比DELETE块
3.DQL;数据查询语言
查询返回的结果集是一张虚拟表
1).基础查询
         --查询所有列
         SELECT* FROM emp;
         --查询指定列
         SELECTNAME,gender FROM emp;
 
2).条件查询
条件查询就是砸在查询时,给出WHERE子句,在WHERE子句中使用如下关键字;
         =、 !=、<>、<、<=、>、>=
         BETWEEN  AND 
         IN(SET);
         ISNULL; IS NOT NULL;
         AND;
         OR;
         NOT;
         --查询性别为女,并且ID为4的记录
         SELECT* FROM emp WHERE gender='female'AND id=4;
         --查询生日为1994-04-05 ,或者name为lisi
         SELECT* FROM emp WHERE birthday='1990-04-05'OR NAME='lisi';
         --查询id 不是123的人
         SELECT* FROM emp WHERE id NOT IN(1,2,3);
3).模糊查询
关键字 LIKE
通配符;_ 任意一个字符
         %任意o-n个字符
         --查询姓名由4个字母组成的学生姓名
         SELECT* FROM emp WHERE NAME LIKE'____';
         --查询姓名由4个字母组成,并且第四个字母为'i'
         SELECT* FROM emp WHERE NAME LIKE'___i';
         --查询姓名以'l'开头的学习学生记录
         SELECT* FROM emp WHERE NAME LIKE 'l%';
         --查询姓名中第二个字母为w的学生
          SELECT * FROM emp WHERE NAME LIKE '_w%';
          -- 查询姓名中包含'g'字母的学生记录·
          SELECT * FROM emp WHERE NAME LIKE '%g%';
4).字段控制查询
          -- 取除重复记录,
        SELECT DISTINCT salary FROM emp;  
        -- 查看月薪与id之和,加上把null转换为数值0的函数
        UPDATE emp SET salary=NULL WHERE NAME='si';  
        SELECT *,id+IFNULL(salary,0)FROM emp;    
        -- 给列名添加别名
        SELECT *,id+IFNULL(salary,0)AS total FROM emp; 
        -- 也可以省略 as
        SELECT *,id+IFNULL(salary,0) total FROM emp;             
5).排序 
         ASC;升序排列,默认的
         --查询所有学生记录,工资按升序排列
         SELECT*FROM emp ORDER BY salary ASC; 
         DESC;降序排列
         SELECT* FROM emp ORDER BY salary DESC;
         --查询所有人,按照月薪降序排列,月薪相同,按照编号升序排列
         SELECT* FROM emp ORDER BY salary DESC,id ASC;
6).聚合函数
用来做纵向运算的函数;
         COUNT();统计指定列不为NULL的记录行数
         MAX();计算指定列的最大值,如果指定列是字符串类型,使用字符串排序运算
         MIN();计算指定列的最小值,如果指定列是字符串类型,使用字符串排序运算
         SUM();计算指定列的数值和,如果指定列类型不是数值类型,计算值为0
         AVG();计算指定列的平均值,如果指定列类型不是数值类型,计算值为0
         --查看emp表中的行数(参照所有列)
         SELECTCOUNT(*) FROM emp;
         --查看emp表中的行数(参照salary列)
         SELECTCOUNT(salary) FROM emp;
         --查询emp表中有月薪的人数
         SELECTCOUNT(salary) FROM emp;
         --查看emp表中月薪大于5000的人数
         SELECTCOUNT(*) FROM emp WHERE salary>5000;
         --查询有salary和有resume的人数
         SELECTCOUNT(salary),COUNT(RESUME) FROM emp; 
         --查询有salary以及有resume的人数
         SELECTCOUNT(*)FROM emp WHERE salary IS NOT NULL AND RESUME IS NOT NULL;
         --求所有人月薪和
         SELECTSUM(salary) FROM emp;
         --求所有人月薪和以及id 和
         SELECTSUM(IFNULL(salary,0)),SUM(id)FROM emp;
         --求所有人月薪加id和
         SELECTSUM(IFNULL(salary,0)+id)FROM emp;
         --统计所有人平均工资
         SELECTAVG(salary)FROM emp;
         --查询最大月薪和最小月薪
         SELECTMAX(salary),MIN(salary) FROM emp;
7);分组查询
         ·关键字;GROUP BY
         --表中男的人数和女的人数,就是根据gender来进行分组
         SELECTCOUNT(*) FROM emp GROUP BY gender;
         --如果里面有null值
         SELECTCOUNT(*) FROM emp WHERE gender IS NOT NULL GROUP BY gender;
         SELECTgender,COUNT(*) FROM emp GROUP BY gender;-- 凡和聚合函数同时出现的列命,一定要出现在groupby 之后
         --查询id和每个人的月薪
         SELECTid ,SUM(salary) FROM emp WHERE salary IS NOT NULL GROUP BY id;
         --查询工资大于5000的人id以及工资
         SELECTid, SUM(salary) FROM emp GROUP BY id HAVING SUM(salary)>5000;
HAVING 和 WHERE 的 区别 ;
         1.having是在分组后对数据进行过滤
           WHERE  是在分组前对数据进行过滤
         2.having后面可以使用聚合函数(统计函数)
           WHERE 后面不可以使用聚合函数
           WHERE 是分组前的条件,如果某行记录不满足WHERE子句的条件,那么这行记录不会参加分组
           HAVING 是对分组后数据的约束
8).LIMIT 
用来限定查询结果的起始行,以及总行数
         --查询3行记录,起始从0开始(也就是从第一行开始)
         SELECT* FROM emp LIMIT 0,3;
         --分页查询
         INTcurrentPage=3;-- 当前页
         INTpageSize=3;  -- 每页显示的条数
         SELECT* FROM emp LIMIT(currentPage-1)*pageSize,pageSize;
附加;
查询语句书写顺序;SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY-LIMIT
查询语句执行顺序;FROM-WHERE-GROUP BY-HAVING-SELECT-ORDER BY-LIMIT
 
数据的完整性;
作用;保证用户输入的数据保存在数据库中是正确的
确保数据的完整性也就是在创建表时给表中添加约束(类似于java中的泛型)
完整性的分类;
         1.实体完整性
         2.域完整性
         3.引用完整性
1.实体完整性:
实体;表中的一行数据(一条记录)代表一个实体
实体完整性的作用;标识每一行数据不重复
约束类型;
         1).主键约束(PRIMARYKEY)
         2).唯一约束(UNIQUE)
         3).自动增长列(AUTO_INCREMENT)
1).主键约束(PRIMARY KEY)
         注;每个表里面要有一个主键
         特点;数据唯一,且不能为NULL
 
第一种添加方式:
CREATE DATABASE day05;
USE day05;
CREATE TABLE student(
         idINT PRIMARY KEY,
         NAMEVARCHAR(50)
         );
第二种添加方式;
CREATE TABLE student(
         idINT,
         NAMEVARCHAR(50),
         PRIMARYKEY(id)
         );
-- 上面这种方式可以形成联合主键
CREATE TABLE student(
         idINT,
         NAMEVARCHAR(50),
         PRIMARYKEY(id,NAME)
         );
第三种添加方式;
CREATE TABLE student(
         idINT,
         NAMEVARCHAR(50)
         );
ALTER TABLE student ADD PRIMARY KEY(id);
2).唯一约束(UNIQUE)
-- 让他的姓名是唯一的
CREATE TABLE student(
         idINT PRIMARY KEY,
         NAMEVARCHAR(50) UNIQUE
         );
3).自动增长列(AUTO_INCREMENT)
给主键添加自动增长的数值,列只能是整数类型,但是如果删除之前增长的序号,后面再添加的时候
序号不会重新开始,而是会接着被删除那一列的序号
CREATE TABLE student(
         idINT PRIMARY KEY AUTO_INCREMENT,
         NAMEVARCHAR(50) UNIQUE
         );
2.域完整性
作用;限制此单元格的数据正确,不对照此列的其他单元格比较
域代表当前单元格
约束类型;1).数据类型     你设置一个INT,输入字符肯定就错了
           2).非空约束(NOT NULL)   比如一个表中的姓名就是非空约束,没他不行
           3).默认值约束(DEFAULT)   你不给值,它默认给你个值插入进去,你给值了,就是你设置的那个值
           4).CHECK 约束(mysql不支持)CHECK(sex='男' OR sex='女')代表性别只能添加男或女
          
1).数据类型省略
2).非空约束(NOT NULL)
CREATE TABLE student(
         idINT PRIMARY KEY AUTO_INCREMENT,
         NAMEVARCHAR(50)UNIQUE NOT NULL
         );
3).默认值约束(DEFAULT)
CREATE TABLE student(
         idINT PRIMARY KEY AUTO_INCREMENT,
         NAMEVARCHAR(50)NOT NULL UNIQUE,
         adressVARCHAR(100) DEFAULT'北京'
         );
INSERT INTO student (NAME)VALUES('ddd') ;
INSERT INTO student(NAME,adress)VALUES('dddrget',NULL); -- 会把null插入进来
INSERT INTO student(NAME,adress)VALUES('ddfsdg',DEFAULT);
INSERT INTO studentVALUES(NULL,'dfsdfsd',DEFAULT); --mysql中可以这样写
3.引用完整性(参照完整性)
 
-- 学生表
DROP TABLE student;
CREATE TABLE student(
         studidVARCHAR(10) PRIMARY KEY,
         stunameVARCHAR(50)
);
 
-- 分数表
DROP TABLE score;
CREATE TABLE score(
         stuidVARCHAR(10),
         scoreINT,
         courseidINT
);
SELECT * FROM student;
INSERT INTO student VALUES('1001','撒贝宁');
INSERT INTO student VALUES('1002','畅旭阳');
INSERT INTO student VALUES('1003','周杰伦');
INSERT INTO student VALUES('1004','林俊杰');
 
SELECT * FROM score ;
INSERT INTO score VALUES('1001',98,1);
INSERT INTO score VALUES('1002',95,1);
INSERT INTO score VALUES('1002',67,2);
INSERT INTO score VALUES('1003',93,2);
INSERT INTO score VALUES('1003',57,3);
 
通过上面两个表可以看出,成绩表中的成绩可以通过stuid来查找到对应的学生姓名。
也就是以学生表作为主表,成绩表作为子表,子表参照主表。由于学生对应成绩,
所以学生表和成绩表之间肯定要有联系,不然你有成绩,没有学生对应,逻辑有问题。
这个联系就是外键约束。
         --添加外键约束
         CREATETABLE student(
                   sidINT PRIMARY KEY,
                   NAMEVARCHAR(50)NOT NULL
         );
         DROPTABLE score;
         CREATETABLE score(
                   scoreDOUBLE,
                   sidINT,
                   CONSTRAINTfk_stu_score_sid FOREIGN KEY(sid) REFERENCES student (sid)
         );
         --第二种添加外键方式
         CREATETABLE score(
                   scoreDOUBLE,
                   sidINT,
                   
         );
         ALTERTABLE score ADD CONSTRAINT fk_stu_score_sid FOREIGN KEY(sid) REFERENCESstudent(sid);
4.表与表之间的关系
1).一对一:比如,qq登录的时候,只需要一个QQ密码和账号就可以了,也就是QQid和password,还需要设置一些QQ签名的一下东西,我们可以设置另外一张表,表名为QQDetail。
一个号码对应一个人的信息,如下图所示,我们可以将QQDetail中的qqid设置为主键,这样他就不能重复了。
 
CREATE TABLE QQ(
         qqidINT PRIMARY KEY,
         PASSWORDVARCHAR(50)
);
CREATE TABLE QQDetail(
         qqidINT PRIMARY KEY,
         NAMEVARCHAR(50),
         addressVARCHAR(200)
);
ALTER TABLE QQDetail ADD  CONSTRAINT fk_QQ_QQDetail_qqid FOREIGNKEY(qqid) REFERENCES QQ(qqid);
一对一最不常用,因为在这种情况下,完全可以把它合并在一个表中。
2).一对多(多对一);最为常见的就是一对多,一对多和多对一,这是从那个角度去看出来的。
 
 
3).多对多:一个学生可以有多个老师,而一个老师也可以有多个学生。
 
CREATE TABLE teacher(
         tidINT PRIMARY KEY,
         tnameVARCHAR(50)
);
CREATE TABLE stu2(
         sidINT PRIMARY KEY,
         snameVARCHAR(50)
);
CREATE TABLE tea_stu_rel(
         tidINT,
         sidINT
);
ALTER TABLE tea_stu_rel ADD CONSTRAINTfk_tid FOREIGN KEY(tid) REFERENCES teacher(tid);
ALTER TABLE tea_stu_rel ADD CONSTRAINT fk_sidFOREIGN KEY(sid) REFERENCES stu2(sid);
   
为什么要拆表?
         
如上表所示:为了存储一个人考了两个分数,出现了大量的重复数据。     
多表查询(重要)
多表查询有如下几种:
1)合并结果集:UNION      UNION ALL
2)连接查询:
         内连接:INNER JOINON
         外连接:OUTERJOIN ON
            左外连接:LEFT[OUTER]JOIN
            右外连接:RIGHT[OUTER]JOIN
            全外连接:(mysql不支持)FULL JOIN
            自然连接:NATURAL JOIN
3)子连接
1).合并结果集:
1.作用:把两个SELECT语句的查询结果合并的到一起。         
2.合并结果集有两种方式:
         UNION:去除重复查询
         CREATETABLE A(
                   NAMEVARCHAR(50),
                   scoreINT
         );
         CREATETABLE B(
                   NAMEVARCHAR(50),
                   scoreINT
         );
         INSERTINTO A VALUES('a',10),('b',20),('c',30);
         INSERTINTO B VALUES('a',10),('b',20),('d',40);
         --合并结果集
         SELECT* FROM A
         UNION
         SELECT* FROM B;   
         
         UNIONALL:不去除重复查询
SELECT * FROM A
         UNIONALL
         SELECT* FROM B;
         
3.要求:被合并的两个结果:列数、列类型必须相同
2).连接查询(非常重要)
         连接查询就是求出多个表的乘积
         SELECT* FROM A,B;
          
         连接查询会产生笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0), (a,1), (a,2),(b,0),(b,1),(b,2) }。那么多表查询产生这样的结果,并不是我们想要的,那么怎么去除重复呢?我们可以通过关联关系去去除笛卡尔积。
                  SELECT * FROM A,B WHEREA.score=B.score;
         内连接:
         特点:查询结果必须满足条件。
         SELECT* FROM A INNER JOIN B  ON A.name=B.name;
         
         外连接:
         特点:查询出的结果存在不满足条件的可能
         
         左连接:先查询左表,然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL
         SELECT* FROM A LEFT OUTER JOIN B ON A.NAME=B.NAME;
         
         右连接:先查询右表,然后查询左表,左表中满足条件的显示出来,不满足条件的显示NULL
         
         SELECT* FROM A RIGHT OUTER JOIN B ON A.NAME=B.NAME;
         
         
自然连接:     
         大家也都知道,连接查询会产生无用笛卡尔积,我们通常使用主外键关系等式来去除他,而自然连接无需你给出
主外键等式,他会自动找到这一等式。
两张连接的表中名称和类型完全一致的列作为条件,会被自然连接找打到。              
CREATE TABLE student1(
         NAMEVARCHAR(30) PRIMARY KEY,
         ageINT
);
CREATE TABLE score1(
         NAMEVARCHAR(30) PRIMARY KEY,
         scoreINT
);       
 
         INSERTINTO student1 VALUES('chang',19),('xu',20),('yang',21);
         INSERTINTO score1 VALUES('chang',100),('xu',70),('yang',00);
         
         ALTERTABLE score1 ADD  CONSTRAINTfk_student1_score_name FOREIGN KEY(NAME) REFERENCES score1(NAME);
         
SELECT * FROM student1 NATURAL JOIN score1;
         
当然自然连接还有其他的查找条件的方式,按其他方式都可能存在问题。
SELECT * FROM student1 NATURAL left JOINscore1;
SELECT * FROM student1 NATURAL right JOINscore1; 
子查询(非常重要)
         一个select语句中包含一个完整的select语句。
         子查询就是嵌套查询,如果一条语句中存在两个或者两个以上select,那么就是子查询。
子查询出现的位置:
         where后,作为被查询的一条件的一部分
         from后,作表
档子查询出现在where后面作为条件时,还可以使用如下关键字:
         any
         all
子查询结果集的形式:
         单行单列(用于条件)
         单行多列(用于条件)
         多行单列(用于条件)
         多行多列(用于表)
                   
CREATE TABLE emp11(
         empno               INT,
         ename               VARCHAR(50),
         job             VARCHAR(50),
         mgr           INT,
         hiredate   DATE,
         sal             DECIMAL(7,2),
         comm                DECIMAL(7,2),
         deptno               INT
) ;
 
INSERT INTO emp11VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp11VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp11VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp11VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp11VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp11VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp11 VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp11VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp11VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp11 VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp11VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp11VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp11VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp11VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);     
练习:
1.工资高于JONES的员工
分析:
查询条件:工资>JONES工资,其中JONES的工资需要一条子查询
第一步。查询JONES的工资
select sal froM emp11 where ename='JONES';
第二步。查询大于JONES的工资         
select * from emp11 where sal>(SELECTsal FROM emp11 WHERE ename='JONES');           
         
2.查询与SCOTT同一个部门的员工
         子查询作为条件
         子查询形式为单行单列
SELECT deptno FROM emp11 WHEREename='SCOTT'; 
SELECT * FROM emp11 WHERE deptno=(SELECTdeptno FROM emp11 WHERE ename='SCOTT');      
          3.工资高于30号部门所有人的员工信息
SELECT * FROM emp11 WHERE sal>(SELECTMAX(sal)FROM emp11 WHERE deptno=30 );
-- 查询30号部门所有人的工资
SELECT sal FROM emp11 WHERE deptno=30;
-- 查询高于30部门所有人工资的员工信息
SELECT * FROM emp11 WHERE sal>ALL(SELECTsal FROM emp11 WHERE deptno=30);
-- 子查询作为条件,子查询形式为多行单列
4.查询工作和工资与martin完全相同的员工信息
-- 查询出MARTIN的工作和工资
SELECT job,sal FROM emp11 WHEREename='MARTIN';
-- 查询出与他工作和工资相同的人
SELECT * FROM emp11 WHERE(job,sal)IN(SELECTjob,sal FROM emp11 WHERE ename='MARTIN');
5.有两个以上直接下属的员工信息
 SELECT * FROM emp11 WHERE empno IN(SELECT mgrFROM emp11 GROUP BY mgr HAVING COUNT(mgr)>=2 );
6.自连接: 自己连接自己,起别名
求7369员工编号、姓名、经理编号和经理姓名
SELECT e1.empno,e1.ename,e2.mgr,e2.enameFROM emp11 e1,emp11 e2 WHERE e1.mgr=e2.empno AND e1.empno=7369;
7.查询员工编号为7788的员工名称、员工工资、部门名称、部门地址
CREATE TABLE dept(
         deptno               INT,
         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');
-- 去除多表,只查一张表,这里去除部门表,只查员工表
 SELECT ename,sal FROM emp11 e WHEREempno=7788;
-- 让第一步与dept做内连接查询,添加主外键条件,去除无用笛卡尔积
SELECT e.ename,e.sal,d.dname,d.loc FROMemp11 e,dept d WHERE e.deptno=d.deptno AND empno=7788;
-- 第二步中的dept表表示所有行所有列的一张完整的表,这里可以把dept替换成所有行,但只有dname和loc列的表,这需要子查询
-- 查询dept表中dname和loc两列,因为deptno会被作为条件,用来去除无用笛卡尔积,所以需要查询他
SELECT dname ,loc,deptno FROM dept;
--替换第二步中的dept
SELECT e.ename,e.sal,d.dname,d.loc FROMemp11 e,(SELECT dname,loc,deptno FROM dept)d WHERE e.deptno=d.deptno ANDe.empno=7788;
MYSQL中的函数    
         
         
         
Mysql数据库的备份与恢复
1.      生成sql脚本,导出数据
在控制台使用mysqldump命令可以生成值得ing数据库的脚本文件。
Mysqldump  -u 用户名 –p密码 数据库名>生成的脚本文件路径
2.      执行sql,脚本恢复数据
在dos命令下登录数据库,然后选择指定数据库。
Source c:\mydb1.sql
还可以通过下面的方式执行脚本文件
Mysql –u 用户名–p 密码数据库< 要执行文件的脚本路径