解析查询类的sql 提取所有表名_Day3_MySQL高级查询

回顾:

DDL创库表,删库表

DML增删改

DQL查询(模糊查询、聚合函数、分页查询等等)

select from where gruop by having or between and limit count() sum() max()

学习内容:

1、数据的完整性及约束

2、联表查询的常用概念及表关系

3、连表查询

4、子查询

5、查询的其他操作符

6、SQL的DCL

外键约束的优点:保护数据的安全性

缺点:效率低

综合外键约束的优缺点:一般不建立外键约束。

一、多表概念

1、多表中常用概念

主表:当前表中主键列被其他的表引用,当前表叫主表,主表一定要有主键。

子表(从表):当前表中引用其他表中列,当前表叫子表。

公共列:俩个或以上表中表示相同意思的列叫公共列。一般情况下,公共列的列名相同

但是公共列的列名也可以不相同。

2、多表之间的关系

一对多:在多的一方的表中,引用一的一方表中主键来建立关系。

一个班级有多名学生,但是一个学生只属于一个班级。

一对一:在任何一方引用另一方表中主键都可以建立关系。

一个女人只能有一个老公,一个男人只能有一个老婆。

多对多:建立第三张表,在第三张表中引用俩张多的表中主键来建立关系。

一个老师可以教多名学生,一名也可以有多位老师。

二、联表查询:多张表连在一起共同查询数据,联表查询条件,表与表之间一定要有公共列,才能进行联表查询、

1、内连接:将2张或2张以上表进行联合查询数据,表与表之间的关系是平等的,2张表中有对应的数据就显示。

语法1:

select 列名列表 from 表名1 , 表名2, 表名3

where 表名1 .公共列=表名2.公共列

and 表名2.公共列=表名3.公共列

and 条件;

语法2:

select 列名列表 from 表名1

inner join 表名2 on 表名1.公共列=表名2.公共列

inner join 表名3 on 表名1.公共列=表名3.公共列

注意:n张表,只能建立n-1个桥梁(公共列关系)

公共列cid 主表 子表 联合查询

#内联接:查询所有学生姓名和班级名称。

select sname,cname from t_student,t_class where t_student.cid=t_class.cid;

select sname,cname from t_student inner JOIN t_class on t_student.cid=t_class.cid;

select sname,cname,t_student.cid

from t_student inner JOIN t_class on t_student.cid=t_class.cid;

2、外连接:2张或2张以上的表进行联合查询数据,注意查询表中数据全部显示,次要查询表中数据有对应的数据就显示,没有对应数据以空值显示,如果是次要查询表中有的数据,注意查询的表中没有之对应的数据就不显示。

2.1:左【外】连接:以左边的边为注意查询的表,右边的表为次要查询的表

语法:

select 列名列表 from 表名1

left [outer] join 表名2 on 表名1.公共列 = 表名2.公共列

left [outer] join 表名3 on 表名2.公共列 = 表名3.公共列

2.2右[外]连接:以右边的表为主要查询的表,左边的表为次要查询的表。

语法:select 列名列表 from 表名1

right [outer] join 表名2 on 表名1.公共列=表名2.公共列

right [outer] join 表名3 on 表名2.公共列=表名3.公共列

#外连接:查询所有学生姓名及与学生相关的班级名称

#分析:主要查询学生姓名,次要查询班级名称

select sname,cname from t_student s LEFT JOIN t_class c on s.cid=c.cid;

select sname,cname from t_class c RIGHT JOIN t_student s on c.cid=s.cid;

#外连接:查询所有班级及与班级相关的学生姓名

#分析:主要查询班级名称,次要查询学生姓名

SELECT sname,cname from t_class c LEFT JOIN t_student s on c.cid=s.cid;

select sname,cname from t_student s RIGHT JOIN t_class c on s.cid=c.cid;

三、子查询:一个查询结构中嵌套了另一个查询结构

注意:子查询的执行顺序是由内到外。

子查询可以多层嵌套,但是目前一般情况下,2层到3层嵌套比较多。

#子查询:查询NZJava1910班的所有学生姓名及班级编号

#先查询出NZJava1901班级编码

#再查询班级编号查询学生姓名及班级编号

SELECT s.sname,s.cid from t_student s

where cid=(select cid from t_class where cname='NZjava1901');

select s.sname,s.cid from t_student s INNER JOIN t_class c on s.cid=c.cid where c.cname='NZ1901';

注意:

1、能用子查询解决的问题一般情况下可以用联表查询解决。

能用联表查询的问题,不一定能用子查询解决

2、在查询语句中,能有精确查询的就不要用模糊查询。

3、在查询语句中,如果一个题目既可以用联表查询解决,也可以用子查询解决,

优先选用子查询解决

四、联合查询:将查询出来的结果集合并,前提条件:2个或以下查询结果的列名相同才能合并。

1、union和union all 都可以将查询结果合并。

不同是:union 合并结果集后要去除重复的元素,但是union all不能去除重复的元素。

#查询年龄小于20和年龄大于25岁的所有学生信息

select sid,sname,sage,sex,address from t_student WHERE sage<20 or sage>25;

#union(去重)/union all:查询年龄小于20和年龄大于17岁的所有学生信息

select sid,sname,sage,sex,address from t_student WHERE sage<20

union

select sid,sname,sage,sex,address from t_student WHERE sage>17;

#不去重

select sid,sname,sage,sex,address from t_student WHERE sage<20

union ALL

select sid,sname,sage,sex,address from t_student WHERE sage>17;

[] : 可选项

五.查询的总语法:

select 列名列表

from 表名1

[inner join 表名2 on 表名1.公共列=表名2.公共列]

[left/right join 表名3 on 表名2.公共列=表名3.公共列]

[where 条件] //边查询边筛选

[group by 列名1,列名2...] //得到查询结果再分组

[having 条件] //对结果集分组完成后再筛选

[order by 列名1 asc/desc,列名2 asc/desc....] //对结果进行排序

[limit 数字1 [,数字2]]

六.DCL:数据库控制语言.

1.创建用户:create user 用户名 identified by 密码;

2.删除用户:drop user 用户名;

3.给用户授权:grant 权限 on 库名.表名 to 用户名@主机名 identified by 密码;

4.撤消用户权限:revoke 权限 on 库名.表名 from 用户名@主机名;

eg:#创建用户

create user 'sx' IDENTIFIED by '123';

#删除用户

drop user 'sx';

#给用户授权

GRANT all on myschool.t_student to 'sx'@localhost IDENTIFIED by '123';

#撤消用户权限

REVOKE all on myschool.t_student from 'sx'@localhost;

5.数据库备份:

第一种用sql命令备份:用管理员身份运行cmd->cd MySql安装目录bin->输入命令:

mysqldump -u 用户名 -p 数据库名>文件路径文件名.sql;

第二种用Navicat备份:在Navicat中选中数据库名->右键->转存为Sql文件->选择文 件保存的文件夹->关闭.

6.数据库还原(还原数据库中表及数据):

第一种用sql命令还原:用管理员身份运行cmd->用sql命令登录MySql数据库->创建 数据库->use 数据库名->用命令还原数据:source 文件路径文件名.sql;

第二种用Navicat还原:在Navicat中选中链接->创建数据库->选中数据库->右键-> 运行Sql文件->选择之前备份的Sql文件->开始->关闭.

列:

从备份到还原

解析查询类的sql 提取所有表名_Day3_MySQL高级查询_第1张图片

show databases; 查询当前所有数据库名称

create database xiaomi1; 创建数据库

select database();

use xiaomi;

source d:xiaomi.sql

解析查询类的sql 提取所有表名_Day3_MySQL高级查询_第2张图片

你可能感兴趣的:(解析查询类的sql,提取所有表名)