您的位置:首页 > 编程语言 > Java开发

java mysql笔记 基础知识回顾

2017-06-05 19:39 337 查看
数据库(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;

<
e0a7
p>         --查询指定列
         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 密码数据库< 要执行文件的脚本路径

        

         
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: