精华内容
下载资源
问答
  • 数据库查询语句内连接外连接效率

    千次阅读 2018-12-06 22:20:45
    今天老大问到内连接外连接的查询速度问题,之前没有了解过因为做的项目比较小所以没有在效率上考虑过。今天问到了就查一下文档和大佬们的博客总结一下,以后有需要也可以查看博客温习。 内连接和外连接其实是有步骤...

    今天老大问到内连接外连接的查询速度问题,之前没有了解过因为做的项目比较小所以没有在效率上考虑过。今天问到了就查一下文档和大佬们的博客总结一下,以后有需要也可以查看博客温习。

    内连接和外连接其实是有步骤区分的  外连接在步骤上是比内连接多出一步的从下图的解析上可以看出这个是mysql执行的时候执行顺序可以看出外连接是比内连接多出了一步操作。但是具体效率并没有多少区分还是由语句决定大部分的执行效率。而且左连接语句有时候会被数据库优化器自动转化为内连接,所以该语句优化器判断为合适执行内连接并且效率高。

                       下面是对语句的分析

    对于左连接和右连接来说对效率影响最大的还是约束的影响,所以where约束出的结果集大小决定其查询的效率(多表查询)

    在语句书写的时候有基础表和连接表区分。在连接时基础表数据量越少查询出的结果集就越少所以要将数据量少的表当做基础表来使用。然后就是where语句是由上至下执行的所以每一步产生的结果集大小影响下一步查询的效率所以要将产生结果集最少的约束往前放,当然两表连接的约束要放到最前。接下来就是索引,索引是对表的某个字段进行索引并记录到磁盘上,索引查询会直接读取记录比从表查询会快很多,但是如果数据量很大的话索引建立会很慢所以不能频繁的添加删除索引而且复合索引一定程度也会降低查询效率所以要适量增加索引不能盲目添加很多索引。在数据库记录更改的情况下,索引也是需要记录的所以在有表的记录是频繁更改的情况下不推荐添加索引或者添加大量索引,会造成索引大量维护,占用资源。

    在有索引的时候索引表最好作为内连接和外连接的副表,增加其查询效率。(主键是对表记录的约束,索引是对表记录的索引,类似于对表记录进行标记,在查询时依赖索引可以快速到大标记的那个记录增加效率)

    所以在外连接和内连接选取时更看重语句:实际情况是最重要的,语句应尽可能为下一个约束减少结果集的记录条数,数量大的时候应将有索引的约束置于前方。

    索引建立规范:

    表主键、外键一定有索引

    数据量大的应该有索引

    经常做连接查询的表应该在连接字段建立索引

    经常在where约束之后的字段,尤其表的字段非常多的情况下要加索引

    索引最好建立在小字段上,大文本或者超长字段均不适合加索引

    频繁对数据进行操作的表不适合建立索引

    无用的索引应尽早删除

    外连接步骤:先将主表全部列出将右表满足on约束的展示出来建立结果集,再通过where约束选取结果集

    内连接步骤:将两表由连接约束合并起来然后继续执行where约束选取结果集

    还有就是尽量减少查询结果集字段为*的情况,只查询有用的出来,因为如果是*的时候数据库会挨个匹配字段拿出也会影响效率!语句中对表的重命名如果表明很长尽量要重命名,减少数据库对表明的检索

    个人见解,如果有不同或者更优解释希望大佬指出谢谢!

    展开全文
  • 目录基本的sql语句索引触发器触发器实例储存过程系统储存过程:用户自定义储存过程视图约束约束的属性介绍:示例:游标表的关联查询内连接:左连接查询:右链接查询:完全外连接:交叉连接:UNION运算:EXCEPT运算:...

    目录

    基本的sql语句

    索引

    触发器

    触发器实例

    储存过程

    系统储存过程:

    用户自定义储存过程

    视图

    约束

    约束的属性介绍:

    示例:

    游标

    表的关联查询

    内连接:

    左连接查询:

    右链接查询:

    完全外连接:

    交叉连接:

    UNION运算:

    EXCEPT运算:

    INTERSECT运算:

    ADO

    连接字符串常用属性

    在程序中的事务操作

    调用储存过程

    sql语句生成id字段

    查询数据库的数据文件及日志文件的大小

    回到顶部

    基本的sql语句

    创建数据库:CREATE DATABASE database-name

    删除数据库:drop database dbname

    创建表:create table tabname(字段属性)

    删除表:drop table tabname

    增加列:Alter table tabname add column col type

    添加/删除主键:Alter table taname add/drop(删除) primary key(列名)

    创建索引:create [unique] index idxname on tabname(col….)

    创建视图:create view viewname as select statement

    查询:select * from table1 where 范围

    插入:insert into table1(field1,field2) values(value1,value2)

    删除:delete from table where 范围

    更新:update table1 set field1=value1 where 范围

    模糊查找:select * from table1 where field1 like ’%value%’

    排序:select * from table order by field1,field2 [desc]

    总数统计:select count(*) from table

    求和:select sum(field) as sumvalue from table

    平均:select avg(field) as avgvalue from table

    最大最小:select max/min(field) as value from table

    查询范围值: select * from table1 where time between time1 and time2

    UNION 运算符:请转表的关联查询

    EXCEPT 运算符:请转表的关联查询

    INTERSECT 运算符:请转表的关联查询

    外连接:请转表的关联查询

    分组:select age,SUM(age) from BaseTable GROUP BY age

    复制表(只复制表结构): select * into b from a where 1<>1

    复制数据: insert into b(列名) select 列名 from b;

    回到顶部

    索引

    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

    索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

    触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。

    触发器分为after触发器,insert触发器, update触发器, delete触发器。

    创建触发器语法:

    create trigger tgr_name

    on table_name

    for  触发器类型

    AS

    数据库执行的语句

    回到顶部

    触发器实例

    在ado数据库创建BaseTable的插入触发器:

    在向表BaseTable插入一条记录时,同时触发器会向Table表也插入一条数据作为记录触发器执行成功。

    ac29d29d824c0c2dbe1efdbc58a5b7ac.gif View Code

    回到顶部

    储存过程

    存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。

    储存过程的优点:存储过程允许标准组件式编程,存储过程能够实现较快的执行速度,存储过程减轻网络流量,存储过程可被作为一种安全机制来充分利用。

    系统储存过程:

    系统存储过程是系统创建的存储过程,系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程,有些也会在创建新数据库的时候自动创建在当前数据库。常用的系统储存过程有:

    exec sp_databases; --查看数据库

    exec sp_tables;        --查看表

    exec sp_columns student;--查看列

    exec sp_helpIndex student;--查看索引

    exec sp_helpConstraint student;--约束

    exec sp_stored_procedures;

    exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句

    exec sp_rename student, stuInfo;--修改表、索引、列的名称

    exec sp_renamedb myTempDB, myDB;--更改数据库名称

    exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库

    exec sp_helpdb;--数据库帮助,查询数据库信息

    储存过程的示例调用:

    重命名表的名字:exec sp_rename 'tablename', tablename1;

    用户自定义储存过程

    创建储存过程的语法:

    Create proc|procedure proc_name

    (

    @参数名 类型,

    ….

    )

    As

    Sql执行语句和一写判断处理

    创建示例:

    ac29d29d824c0c2dbe1efdbc58a5b7ac.gif View Code

    回到顶部

    视图

    视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。

    创建视图:create view view_BaseTable as select id,name from BaseTable

    数据库文件有一个BaseTableView.Sql文件执行即是此示例。

    回到顶部

    约束

    在此功能上我只在BaseTable表的age字段添加check约束使年龄不能超过50.

    约束的属性介绍:

    NOT NULL : 用于控制字段的内容一定不能为空(NULL)。

    UNIQUE : 控件字段内容不能重复,一个表允许有多个 Unique 约束。

    PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。

    FOREIGN KEY: FOREIGN KEY 约束用于预防破坏表之间连接的动作,FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

    CHECK: 用于控制字段的值范围。

    DEFAULT: 用于设置新记录的默认值。

    示例:

    NOT NULL :Create table MyTable

    (

    id varchar(32) not null,

    name varchar (32)

    )

    UNIQUE:Create table MyTable

    (

    id varchar(32) not null UNIQUE,

    name varchar (32)

    )

    Create table MyTable

    (

    id varchar(32) not null,

    name varchar (32),

    unique (id,.....)

    )

    PRIMARY KEY :Create table MyTable

    (

    id varchar(32) not null PRIMARY KEY,

    name varchar (32)

    )

    Foreign Key :Create table MyTable

    (

    id nvarchar(32) not null primary key,

    name nvarchar(32),

    foreign key(id) references myTB(id)

    )

    Check :Create table MyTable

    (

    id nvarchar(32) not null,

    age int not null,

    check (age>15 and age <30)

    )

    Default:Create table MyTable

    (

    id int,

    name nvarchar(32) default 'celly'

    )

    回到顶部

    游标

    游标是一种能从包含多条数据记录的结果集中每次提取一条记录的机制。将批操作变成行操作,对结果集中得某行进行操作。

    数据库文件BaseTableCsr.sql是游标示例。查询BaseTable表的id与name字段循环打印出来。

    回到顶部

    表的关联查询

    内连接:

    只根据表查找符合添加的,不返回所有表数据。

    示例代码:

    select * from BaseTable join tabname on BaseTable.id=tabname.id

    效果图

    53f92d1c8bb0246dc36cea9cc607acd0.png

    左连接查询:

    以左表为主第二张表加入有符合条件的则显示数据,没有则第二张表全部为空

    示例代码

    select * from BaseTable left join tabname on BaseTable.id=tabname.id

    效果图:

    fc3d09b9439b63fea9c9456d75efd178.png

    右链接查询:

    以右表为主查找符合的数据,没有符合项左表显示为空

    示例代码:

    select * from BaseTable right join tabname on BaseTable.id=tabname.id

    效果图:

    db862ac1545f3d4fb16bb97ed18502cc.png

    完全外连接:

    查找的表所有的数据合并成一张表进行显示

    示例代码:

    select * from BaseTable full join tabname on BaseTable.id=tabname.id

    效果图(tabname表只有一条数据):

    1fa62f3c0ac6cabd84c7780772b5c791.png

    交叉连接:

    没有where语句的交叉连接产生的是两张表行数的乘积数据,如果带where的结果与内连接的结果相同。

    示例代码:

    select * from BaseTable cross join tabname

    效果图:

    3b62b95bf51461ae7e7a2b479ee7c7f8.png

    UNION运算:

    分为UNION(检查重复)和UNION all(不检查重复)

    检查重复示例代码:

    select id from BaseTable union select id from  Tables

    效果图:

    7cf5b3baa360c4b3b1af3aa8b999d6ba.png

    不检查重复代码:

    select id from BaseTable union all select id from  Tables

    效果图:

    83a02ae520986638c782fce254271b10.png

    EXCEPT运算:

    从左查询中返回有右查询中没有找到的不重复项

    示例代码:

    select id from BaseTable except select id from tabname

    效果图:

    5d777b0aa7297c52951431817d4504cb.png

    INTERSECT运算:

    返回两个表都有的非重复项

    示例代码:

    select id From BaseTable intersect select id from tabname

    效果图:

    96b21e520cdee3db76c47ff56a5c7fe8.png

    回到顶部

    ADO

    连接字符串常用属性

    1、    Data Source:数据源。计算机名称或者IP地址。

    2、    Server:服务器。数据库所在计算机的名称

    3、    Database:数据库名称。

    4、    Initail Catalog:数据库的名称。

    5、    User ID:用于连接数据库的用户名称。

    6、    Password:用于连接数据库的用户密码。

    7、    Pooling:标志是否使用数据库连接池(少客户访问启用可以提高性能)。

    8、    Intergrated Security:系统集成安全验证。标志登录数据库时是否使用系统集成验证。

    9、    Connection Timeout:连接超时的时间。系统再次尝试连接数据库时所经历的时间,单位为秒,默认值为15秒。

    在程序中的事务操作

    首先创建事物:SqlTransaction st = conn.BeginTransaction();

    开始事物(即事物的赋值):cmd.Transaction = st;

    提交事务:st.Commit();

    回滚事务:st.Rollback();

    假如要创建某个事物保存点可以使用:st.save();

    根据事物操作可以做事物回滚的批量插入,修改操作,有一条不正确即可实现事物回滚,具体请看dome代码详细介绍。

    调用储存过程

    使用在数据库创建的储存过程在dome中通过ado进行调用,并得到返回的表。

    示例代码:

    26469a5db955e4b1ba62bd517fec9940.png

    注意点:在调用储存过程中,加入你的存储过程涉及到大量的操作,查询什么的,而你只需要返回其中的某个一条查询记录,需要在储存过程中找到需要返回的语句加上return ,这样在程序中调用只会返回本条语句结果。

    回到顶部

    sql语句生成id字段

    REPLACE(CAST(CAST(NEWID() as binary(10)) + CAST(GETDATE() as binary(6)) as uniqueidentifier),'-','')

    回到顶部

    查询数据库的数据文件及日志文件的大小

    查询出来的单位为MB

    select name, convert(float,size) * (8192.0/1024.0)/1024. from 数据库名称.dbo.sysfiles

    展开全文
  • 使用缺省配置的WallFilter...结合其他Filter一起使用......指定dbType有时候,一些应用框架做了自己的JDBC Proxy Driver,是的DruidDataSource无法正确识别数据库的类型,则需要特别指定,如下:...指定配置装载的目...

    使用缺省配置的WallFilter

    ...

    结合其他Filter一起使用

    ...

    这样,拦截检测的时间不在StatFilter统计的SQL执行时间内。

    如果希望StatFilter统计的SQL执行时间内,则使用如下配置

    ...

    指定dbType

    有时候,一些应用框架做了自己的JDBC Proxy Driver,是的DruidDataSource无法正确识别数据库的类型,则需要特别指定,如下:

    ...

    指定配置装载的目录

    缺省情况下,配置装载的目录如下:

    数据库类型

    目录

    mysql

    META-INF/druid/wall/mysql

    oracle

    META-INF/druid/wall/oracle

    sqlserver

    META-INF/druid/wall/sqlserver

    postgres

    META-INF/druid/wall/postgres

    从配置目录中以下文件中读取配置:

    deny-variant.txt

    deny-schema.txt

    deny-function.txt

    deny-table.txt

    deny-object.txt

    指定配置装载的目录是可以指定,例如:

    ...

    WallConfig详细说明

    本身的配置

    配置项缺省值

    dir

    按照dbType分别配置:

    mysql : META-INF/druid/wall/mysql

    oracle : META-INF/druid/wall/oracle

    sqlserver : META-INF/druid/wall/sqlserver

    拦截配置-语句

    配置项缺省值描述

    selelctAllow

    true

    是否允许执行SELECT语句

    selectAllColumnAllow

    true

    是否允许执行SELECT * FROM T这样的语句。如果设置为false,不允许执行select * from t,但select * from (select id, name from t) a。这个选项是防御程序通过调用select *获得数据表的结构信息。

    selectIntoAllow

    true

    SELECT查询中是否允许INTO字句

    deleteAllow

    true

    是否允许执行DELETE语句

    updateAllow

    true

    是否允许执行UPDATE语句

    insertAllow

    true

    是否允许执行INSERT语句

    replaceAllow

    true

    是否允许执行REPLACE语句

    mergeAllow

    true

    是否允许执行MERGE语句,这个只在Oracle中有用

    callAllow

    true

    是否允许通过jdbc的call语法调用存储过程

    setAllow

    true

    是否允许使用SET语法

    truncateAllow

    true

    truncate语句是危险,缺省打开,若需要自行关闭

    createTableAllow

    true

    是否允许创建表

    alterTableAllow

    true

    是否允许执行Alter Table语句

    dropTableAllow

    true

    是否允许修改表

    commentAllow

    false

    是否允许语句中存在注释,Oracle的用户不用担心,Wall能够识别hints和注释的区别

    noneBaseStatementAllow

    false

    是否允许非以上基本语句的其他语句,缺省关闭,通过这个选项就能够屏蔽DDL。

    multiStatementAllow

    false

    是否允许一次执行多条语句,缺省关闭

    useAllow

    true

    是否允许执行mysql的use语句,缺省打开

    describeAllow

    true

    是否允许执行mysql的describe语句,缺省打开

    showAllow

    true

    是否允许执行mysql的show语句,缺省打开

    commitAllow

    true

    是否允许执行commit操作

    rollbackAllow

    true

    是否允许执行roll back操作

    如果把selectIntoAllow、deleteAllow、updateAllow、insertAllow、mergeAllow都设置为false,这就是一个只读数据源了。 ## 拦截配置-永真条件

    配置项

    缺省值

    描述

    selectWhereAlwayTrueCheck

    true

    检查SELECT语句的WHERE子句是否是一个永真条件

    selectHavingAlwayTrueCheck

    true

    检查SELECT语句的HAVING子句是否是一个永真条件

    deleteWhereAlwayTrueCheck

    true

    检查DELETE语句的WHERE子句是否是一个永真条件

    deleteWhereNoneCheck

    false

    检查DELETE语句是否无where条件,这是有风险的,但不是SQL注入类型的风险

    updateWhereAlayTrueCheck

    true

    检查UPDATE语句的WHERE子句是否是一个永真条件

    updateWhereNoneCheck

    false

    检查UPDATE语句是否无where条件,这是有风险的,但不是SQL注入类型的风险

    conditionAndAlwayTrueAllow

    false

    检查查询条件(WHERE/HAVING子句)中是否包含AND永真条件

    conditionAndAlwayFalseAllow

    false

    检查查询条件(WHERE/HAVING子句)中是否包含AND永假条件

    conditionLikeTrueAllow

    true

    检查查询条件(WHERE/HAVING子句)中是否包含LIKE永真条件

    其他拦截配置

    配置项

    缺省值

    描述

    selectIntoOutfileAllow

    false

    SELECT ... INTO OUTFILE 是否允许,这个是mysql注入攻击的常见手段,缺省是禁止的

    selectUnionCheck

    true

    检测SELECT UNION

    selectMinusCheck

    true

    检测SELECT MINUS

    selectExceptCheck

    true

    检测SELECT EXCEPT

    selectIntersectCheck

    true

    检测SELECT INTERSECT

    mustParameterized

    false

    是否必须参数化,如果为True,则不允许类似WHERE ID = 1这种不参数化的SQL

    strictSyntaxCheck

    true

    是否进行严格的语法检测,Druid SQL Parser在某些场景不能覆盖所有的SQL语法,出现解析SQL出错,可以临时把这个选项设置为false,同时把SQL反馈给Druid的开发者。

    conditionOpXorAllow

    false

    查询条件中是否允许有XOR条件。XOR不常用,很难判断永真或者永假,缺省不允许。

    conditionOpBitwseAllow

    true

    查询条件中是否允许有"&"、"~"、"|"、"^"运算符。

    conditionDoubleConstAllow

    false

    查询条件中是否允许连续两个常量运算表达式

    minusAllow

    true

    是否允许SELECT * FROM A MINUS SELECT * FROM B这样的语句

    intersectAllow

    true

    是否允许SELECT * FROM A INTERSECT SELECT * FROM B这样的语句

    constArithmeticAllow

    true

    拦截常量运算的条件,比如说WHERE FID = 3 - 1,其中"3 - 1"是常量运算表达式。

    limitZeroAllow

    false

    是否允许limit 0这样的语句

    selectLimit

    -1

    配置最大返回行数,如果select语句没有指定最大返回行数,会自动修改selct添加返回限制

    禁用对象检测配置

    配置项

    缺省值

    描述

    tableCheck

    true

    检测是否使用了禁用的表

    schemaCheck

    true

    检测是否使用了禁用的Schema

    functionCheck

    true

    检测是否使用了禁用的函数

    objectCheck

    true

    检测是否使用了“禁用对对象”

    variantCheck

    true

    检测是否使用了“禁用的变量”

    readOnlyTables

    指定的表只读,不能够在SELECT INTO、DELETE、UPDATE、INSERT、MERGE中作为"被修改表"出现<

    Jdbc相关配置

    配置项

    缺省值

    描述

    metadataAllow

    true

    是否允许调用Connection.getMetadata方法,这个方法调用会暴露数据库的表信息

    wrapAllow

    true

    是否允许调用Connection/Statement/ResultSet的isWrapFor和unwrap方法,这两个方法调用,使得有办法拿到原生驱动的对象,绕过WallFilter的检测直接执行SQL。

    WallFilter配置说明

    配置项

    缺省值

    描述

    logViolation

    false

    对被认为是攻击的SQL进行LOG.error输出

    throwException

    true

    对被认为是攻击的SQL抛出SQLException

    config

    provider

    刚开始引入WallFilter的时候,把logViolation设置为true,而throwException设置为false。就可以观察是否存在违规的情况,同时不影响业务运行。

    https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter#%E6%8C%87%E5%AE%9Adbtype

    展开全文
  • 文章目录MySQL数据高级语句1、MySQL进阶查询【1】按关键字排序//升序排列//降序排列//和条件配合使用降序排列【2】对结果进行分组【3】限制结果条目【4】设置别名【5】通配符【6】子查询(查询、嵌套查询)【7】...

    MySQL数据高级语句

    MySQL查询

    在对 MySQL 数据库的增、删、改、查操作有一定了解之后,就可以学习一些 SQL 语句的高级使用方法。SQL 语句的熟练使用,在平时的运维工作中可以提供不小的帮助,尤其是在一些规模较小的公司,运维身兼数职,可能会有不少数据库的相关工作。本章将从不 同的方面出发介绍 SQL 语句的高级运用方法。

    【1】按关键字排序

    ORDER BY A,B desc 指 A 用升序,B 用降序;
    ORDER BY A asc,B desc 指 A 用升序,B 用降序;
    ORDER BY A desc,B desc 指 A 用降序,B 用降序;

    mysql> select * from student1;
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  1 | lisi     | 99.00 |      1 |
    |  2 | zhangsan | 88.00 |      1 |
    |  3 | tianqi   | 77.00 |      2 |
    |  4 | qianba   | 78.00 |      3 |
    +----+----------+-------+--------+
    4 rows in set (0.00 sec)
    
    (1)升序排列
    mysql> select * from student1 order by socre asc;
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  3 | tianqi   | 77.00 |      2 |
    |  4 | qianba   | 78.00 |      3 |
    |  2 | zhangsan | 88.00 |      1 |
    |  1 | lisi     | 99.00 |      1 |
    +----+----------+-------+--------+
    4 rows in set (0.00 sec)
    
    (2)降序排列
    mysql> select * from student1 order by socre desc;
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  1 | lisi     | 99.00 |      1 |
    |  2 | zhangsan | 88.00 |      1 |
    |  4 | qianba   | 78.00 |      3 |
    |  3 | tianqi   | 77.00 |      2 |
    +----+----------+-------+--------+
    4 rows in set (0.00 sec)
    
    (3)和条件配合使用降序排列
    mysql> select * from student1 where course=1 order by socre desc;
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  1 | lisi     | 99.00 |      1 |
    |  2 | zhangsan | 88.00 |      1 |
    +----+----------+-------+--------+
    2 rows in set (0.00 sec)
    

    【2】对结果进行分组

    通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现。GROUP BY 从字面上看,是以 BY 后面的内容对查询出的数据进行分组,就是将一个“数据集”划分成若干个“小区域”,然后针对这些个“小区域”进行数据处理。GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),这些聚合函数的用法在后面函数小节会有更详细的讲解。GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。

    mysql> select name,socre,count(socre) from student1 where course=2 or course=3 
                 group by socre order by socre desc;
    +--------+-------+--------------+
    | name   | socre | count(socre) |
    +--------+-------+--------------+
    | qianba | 78.00 |            1 |
    | tianqi | 77.00 |            1 |
    +--------+-------+--------------+
    2 rows in set (0.00 sec)
    
    mysql> select name,socre,max(socre) from student1 where course=1 group by course;
    +------+-------+------------+
    | name | socre | max(socre) |
    +------+-------+------------+
    | lisi | 99.00 |      99.00 |
    +------+-------+------------+
    1 row in set (0.00 sec)
    
    mysql> select name,socre,max(socre) from student1 where course=1 group by name;
    +----------+-------+------------+
    | name     | socre | max(socre) |
    +----------+-------+------------+
    | lisi     | 99.00 |      99.00 |
    | zhangsan | 88.00 |      88.00 |
    +----------+-------+------------+
    2 rows in set (0.00 sec)
    
    mysql> select name,socre,max(socre) from student1 where course=1 group by socre;
    +----------+-------+------------+
    | name     | socre | max(socre) |
    +----------+-------+------------+
    | zhangsan | 88.00 |      88.00 |
    | lisi     | 99.00 |      99.00 |
    +----------+-------+------------+
    2 rows in set (0.00 sec)
    

    【3】限制结果条目

    在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录。有时候仅需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句。

    格式:
    SELECT column1, column2, ... FROM table_name LIMIT [位置偏移量], number
    

    第一个参数位置偏移量从0开始,第二个参数number是设置返回记录行的最大数目。

    mysql> select * from student1;
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  1 | lisi     | 99.00 |      1 |
    |  2 | zhangsan | 88.00 |      1 |
    |  3 | tianqi   | 77.00 |      2 |
    |  4 | qianba   | 78.00 |      3 |
    +----+----------+-------+--------+
    4 rows in set (0.00 sec)
    

    //查询前三个用户

    mysql> select * from student1 limit 3;
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  1 | lisi     | 99.00 |      1 |
    |  2 | zhangsan | 88.00 |      1 |
    |  3 | tianqi   | 77.00 |      2 |
    +----+----------+-------+--------+
    3 rows in set (0.00 sec)
    

    //查询从第二个用户开始的两个用户

    mysql> select * from student1 limit 1,2;
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  2 | zhangsan | 88.00 |      1 |
    |  3 | tianqi   | 77.00 |      2 |
    +----+----------+-------+--------+
    2 rows in set (0.00 sec)
    

    【4】设置别名

    在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性。设置别名使用 AS 语句。其中的关键字as可以省略。
    字段别名设置格式:

    SELECT 字段名 AS 别名 FROM 表名;
    

    举例说明

    mysql> select name,socre,max(socre) as '最高成绩' from student1 where course=1 group by soocre;
    +----------+-------+--------------+
    | name     | socre | 最高成绩     |
    +----------+-------+--------------+
    | zhangsan | 88.00 |        88.00 |
    | lisi     | 99.00 |        99.00 |
    +----------+-------+--------------+
    2 rows in set (0.00 sec)
    

    表别名设置格式:

    SELECT 字段名 FROM 表名 AS 表别名;
    

    //两表相连

    mysql> select * from student1 inner join course on student1.course=course.id;
    +----+----------+-------+--------+----+--------+---------+
    | id | name     | socre | course | id | name   | teacher |
    +----+----------+-------+--------+----+--------+---------+
    |  1 | lisi     | 99.00 |      1 |  1 | 语文   | NULL    |
    |  2 | zhangsan | 88.00 |      1 |  1 | 语文   | NULL    |
    |  3 | tianqi   | 77.00 |      2 |  2 | 数学   | NULL    |
    |  4 | qianba   | 78.00 |      3 |  3 | 英语   | NULL    |
    +----+----------+-------+--------+----+--------+---------+
    4 rows in set (0.00 sec)
    

    //student1的别名是stu1,course的别名是c

    mysql> select * from student1 as stu1 inner join course c on stu1.course=c.id;
    +----+----------+-------+--------+----+--------+---------+
    | id | name     | socre | course | id | name   | teacher |
    +----+----------+-------+--------+----+--------+---------+
    |  1 | lisi     | 99.00 |      1 |  1 | 语文   | NULL    |
    |  2 | zhangsan | 88.00 |      1 |  1 | 语文   | NULL    |
    |  3 | tianqi   | 77.00 |      2 |  2 | 数学   | NULL    |
    |  4 | qianba   | 78.00 |      3 |  3 | 英语   | NULL    |
    +----+----------+-------+--------+----+--------+---------+
    4 rows in set (0.00 sec)
    

    【5】通配符

    通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。通常通配符都是跟 LIKE 一起使用的,并协同 WHERE 子句共同来完成查询任务。常用的通配符有两个,分别是:
    %:百分号表示零个、一个或多个字符
    _:下划线表示单个字符

    mysql> select * from student1 where name like '%zhang_a_';
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  2 | zhangsan | 88.00 |      1 |
    +----+----------+-------+--------+
    1 row in set (0.00 sec)
    

    【6】子查询(内查询、嵌套查询)

    查询语句里面还嵌套着另一个查询语 句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。子查询操作符:

    (1)IN 用来判断某个值是否在给定的结果集中

    格式为:

    <表达式> [NOT] IN <子查询>
    
    mysql> select * from student1 where course in (
                select course from course where name='语文'
                );
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  1 | lisi     | 99.00 |      1 |
    |  2 | zhangsan | 88.00 |      1 |
    |  3 | tianqi   | 77.00 |      2 |
    |  4 | qianba   | 78.00 |      3 |
    +----+----------+-------+--------+
    4 rows in set (0.00 sec)
    
    mysql> select * from student1 where course not in (
                 select course from course where name='语语文'
                 );
    Empty set (0.00 sec)
    
    (2)子查询上也可以使用比较运算符(=、<、>、>=、<=)

    这些运算符主要是对运算符前面的表达式和后面的子查询进行比较运算。

    mysql> select * from student1 where name='qianba';
    +----+--------+-------+--------+
    | id | name   | socre | course |
    +----+--------+-------+--------+
    |  4 | qianba | 78.00 |      3 |
    +----+--------+-------+--------+
    1 row in set (0.00 sec)
    
    (3)EXIST 这个关键字

    在子查询时,主要用于判断子查询的结果集是否为空。如果不为空, 则返回 TRUE;反之,则返回 FALSE。

    mysql> select min(socre) '最低分' from student1 where exists(
                 select * from student1 where name='tianba'
                 );       
    +-----------+
    | 最低分    |
    +-----------+
    |      NULL |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> select min(socre) '最低分' from student1 where exists(
                 select * from student1 where name='zhangsan'
                 );
    +-----------+
    | 最低分    |
    +-----------+
    |     66.00 |
    +-----------+
    1 row in set (0.00 sec)
    
    (4)UPDATE 、delete语句也可以使用子查询。

    UPDATE 内的子查询,在 set 更新内容时,可以是单独的一列,也可以是多列。

    mysql> select * from student1;
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  1 | lisi     | 99.00 |      1 |
    |  2 | zhangsan | 88.00 |      1 |
    |  3 | tianqi   | 77.00 |      2 |
    |  4 | qianba   | 78.00 |      3 |
    |  5 | tianbi   | 66.00 |      3 |
    +----+----------+-------+--------+
    5 rows in set (0.00 sec)
    
    mysql> update student1 set socre=socre+5 where socre>=88;
    Query OK, 2 rows affected (0.01 sec)
    Rows matched: 2  Changed: 2  Warnings: 0
    
    mysql> select * from student1 where socre>=88;
    +----+----------+--------+--------+
    | id | name     | socre  | course |
    +----+----------+--------+--------+
    |  1 | lisi     | 104.00 |      1 |
    |  2 | zhangsan |  93.00 |      1 |
    +----+----------+--------+--------+
    2 rows in set (0.00 sec)
    

    【7】null值

    在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL。

    1】null和空值得比较

    (1)空值就是在表的字段中存储空字符(‘’),空值的长度为 0,不占用空间的;而 NULL 值的长度是 NULL,是占用空间的。
    (2)IS NULL 或者 IS NOT NULL,是用来判断字段是不是为 NULL 或者不是 NULL,不能查出是不是空值的。
    (3)空值的判断使用=’’或者<>’’来处理。
    (4)在通过 count()计算有多少记录数时,如果遇到 NULL 值会自动忽略掉,遇到空值会加入到记录中进行计算。

    mysql> select * from student1;
    +----+----------+--------+--------+----------+
    | id | name     | socre  | course | teacher  |
    +----+----------+--------+--------+----------+
    |  1 | lisi     | 104.00 |      1 | yanglong |
    |  2 | zhangsan |  93.00 |      1 | yanglong |
    |  3 | tianqi   |  77.00 |      2 |          |
    |  4 | qianba   |  78.00 |      3 | NULL     |
    |  5 | tianbi   |  66.00 |      3 | NULL     |
    +----+----------+--------+--------+----------+
    5 rows in set (0.00 sec)
    
    mysql> select * from student1 where teacher is null;
    +----+--------+-------+--------+---------+
    | id | name   | socre | course | teacher |
    +----+--------+-------+--------+---------+
    |  4 | qianba | 78.00 |      3 | NULL    |
    |  5 | tianbi | 66.00 |      3 | NULL    |
    +----+--------+-------+--------+---------+
    2 rows in set (0.00 sec)
    
    mysql> select * from student1 where teacher is not null;
    +----+----------+--------+--------+----------+
    | id | name     | socre  | course | teacher  |
    +----+----------+--------+--------+----------+
    |  1 | lisi     | 104.00 |      1 | yanglong |
    |  2 | zhangsan |  93.00 |      1 | yanglong |
    |  3 | tianqi   |  77.00 |      2 |          |
    +----+----------+--------+--------+----------+
    3 rows in set (0.00 sec)
    

    【8】数据库正则表达式

    MySQL 的正则表达式使用 REGEXP 这个关键字来指定正则表达式的匹配模式
    在这里插入图片描述

    (1)以特定字符串开头
    mysql> select * from student1 where name regexp '^zhang';
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  2 | zhangsan | 88.00 |      1 |
    +----+----------+-------+--------+
    1 row in set (0.00 sec)
    
    (2)以特定字符串结尾
    mysql> select * from student1 where name regexp 'si$';
    +----+------+-------+--------+
    | id | name | socre | course |
    +----+------+-------+--------+
    |  1 | lisi | 99.00 |      1 |
    +----+------+-------+--------+
    1 row in set (0.00 sec)
    
    (3)包含指定字符串
    mysql> select * from student1 where name regexp 'ba';
    +----+--------+-------+--------+
    | id | name   | socre | course |
    +----+--------+-------+--------+
    |  4 | qianba | 78.00 |      3 |
    +----+--------+-------+--------+
    1 row in set (0.00 sec)
    
    (4)以“.”字符串中的任意一个字符
    mysql> select * from student1 where name regexp 'tian.';
    +----+--------+-------+--------+
    | id | name   | socre | course |
    +----+--------+-------+--------+
    |  3 | tianqi | 77.00 |      2 |
    |  5 | tianbi | 66.00 |      3 |
    +----+--------+-------+--------+
    2 rows in set (0.00 sec)
    
    (5)匹配包含“或”关系的记录
    mysql> select * from student1 where name regexp 'qi|bi';
    +----+--------+-------+--------+
    | id | name   | socre | course |
    +----+--------+-------+--------+
    |  3 | tianqi | 77.00 |      2 |
    |  4 | qianba | 78.00 |      3 |
    |  5 | tianbi | 66.00 |      3 |
    +----+--------+-------+--------+
    3 rows in set (0.00 sec)
    
    (6)“*”匹配前面字符的任意多次
    mysql> select * from student1 where name regexp 'qi*';
    +----+--------+-------+--------+
    | id | name   | socre | course |
    +----+--------+-------+--------+
    |  3 | tianqi | 77.00 |      2 |
    |  4 | qianba | 78.00 |      3 |
    +----+--------+-------+--------+
    2 rows in set (0.00 sec)
    
    (7)“+”匹配前面字符至少一次
    mysql> select * from student1 where name regexp 'qi+';
    +----+--------+-------+--------+
    | id | name   | socre | course |
    +----+--------+-------+--------+
    |  3 | tianqi | 77.00 |      2 |
    |  4 | qianba | 78.00 |      3 |
    +----+--------+-------+--------+
    2 rows in set (0.00 sec)
    
    (8)匹配指定字符集中的一个
    mysql> select * from student1 where name regexp '^[a-z]';
    +----+----------+-------+--------+
    | id | name     | socre | course |
    +----+----------+-------+--------+
    |  1 | lisi     | 99.00 |      1 |
    |  2 | zhangsan | 88.00 |      1 |
    |  3 | tianqi   | 77.00 |      2 |
    |  4 | qianba   | 78.00 |      3 |
    |  5 | tianbi   | 66.00 |      3 |
    +----+----------+-------+--------+
    5 rows in set (0.00 sec)
    

    【9】数据库运算符

    在这里插入图片描述

    (1)算术运算符
    mysql> select 1+2,2-1,2*2,2/2,4%3;
    +-----+-----+-----+--------+------+
    | 1+2 | 2-1 | 2*2 | 2/2    | 4%3  |
    +-----+-----+-----+--------+------+
    |   3 |   1 |   4 | 1.0000 |    1 |
    +-----+-----+-----+--------+------+
    1 row in set (0.00 sec)
    
    mysql> select 1+2,2-1,2*2,2/2,4%3,(2+5)*5+3;
    +-----+-----+-----+--------+------+-----------+
    | 1+2 | 2-1 | 2*2 | 2/2    | 4%3  | (2+5)*5+3 |
    +-----+-----+-----+--------+------+-----------+
    |   3 |   1 |   4 | 1.0000 |    1 |        38 |
    +-----+-----+-----+--------+------+-----------+
    1 row in set (0.00 sec)
    
    (2)比较运算符
    mysql> select 2=4,2='2','e'=e,(2+5)=2*4,'r'=null;
    ERROR 1054 (42S22): Unknown column 'e' in 'field list'
    mysql> select 2=4,2='2','e'='e',(2+5)=2*4,'r'=null;
    +-----+-------+---------+-----------+----------+
    | 2=4 | 2='2' | 'e'='e' | (2+5)=2*4 | 'r'=null |
    +-----+-------+---------+-----------+----------+
    |   0 |     1 |       1 |         0 |     NULL |
    +-----+-------+---------+-----------+----------+
    1 row in set (0.00 sec)
    
    mysql> select 'kgc'<>'bdqn','khc'='kgc',1<>2,3=3,3!=3,null<>null;
    +---------------+-------------+------+-----+------+------------+
    | 'kgc'<>'bdqn' | 'khc'='kgc' | 1<>2 | 3=3 | 3!=3 | null<>null |
    +---------------+-------------+------+-----+------+------------+
    |             1 |           0 |    1 |   1 |    0 |       NULL |
    +---------------+-------------+------+-----+------+------------+
    1 row in set (0.00 sec)
    
    //在ASCII码中0是48,A是65,a是98
    mysql> select 5>4,'a'>'A','a'>'b',4>=3,'z'>=null;
    +-----+---------+---------+------+-----------+
    | 5>4 | 'a'>'A' | 'a'>'b' | 4>=3 | 'z'>=null |
    +-----+---------+---------+------+-----------+
    |   1 |       0 |       0 |    1 |      NULL |
    +-----+---------+---------+------+-----------+
    1 row in set (0.00 sec)
    
    mysql> select 2 is null,'d' is not null,null is null;
    +-----------+-----------------+--------------+
    | 2 is null | 'd' is not null | null is null |
    +-----------+-----------------+--------------+
    |         0 |               1 |            1 |
    +-----------+-----------------+--------------+
    1 row in set (0.00 sec)
    
    mysql> select 4 between 2 and 6,5 between 5 and 8,'c' between 'a' and 'd',
                 6 between 2 and 4;
    +-------------------+-------------------+-------------------------+-------------------+
    | 4 between 2 and 6 | 5 between 5 and 8 | 'c' between 'a' and 'd' | 6 between 2 and 4 |
    +-------------------+-------------------+-------------------------+-------------------+
    |                 1 |                 1 |                       1 |                 0 |
    +-------------------+-------------------+-------------------------+-------------------+
    1 row in set (0.00 sec)
    
    mysql> select least(45,99,1,5,0,-1),least('A','s','x','v','f'),
                greatest(45,99,1,5,0,-1),greatest(reatest('A','s','x','v','f');
    +-----------------------+----------------------------+--------------------------+-------------------------------+
    | least(45,99,1,5,0,-1) | least('A','s','x','v','f') | greatest(45,99,1,5,0,-1) | greatest('A','s','x','v','f') |
    +-----------------------+----------------------------+--------------------------+-------------------------------+
    |                    -1 | A                          |                       99 | x                             |
    +-----------------------+----------------------------+--------------------------+-------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select 2 in (56,5,5,2,2),'c' not in ('a','b','c','d');
    +-------------------+------------------------------+
    | 2 in (56,5,5,2,2) | 'c' not in ('a','b','c','d') |
    +-------------------+------------------------------+
    |                 1 |                            0 |
    +-------------------+------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select 'bd' like 'bdqz','test' like 'te%','hot' not like '%te__';
    +------------------+-------------------+------------------------+
    | 'bd' like 'bdqz' | 'test' like 'te%' | 'hot' not like '%te__' |
    +------------------+-------------------+------------------------+
    |                0 |                 1 |                      1 |
    +------------------+-------------------+------------------------+
    1 row in set (0.00 sec)
    
    (3)逻辑运算符
    mysql> select not 2,!2,not 0,!(2-2);
    +-------+----+-------+--------+
    | not 2 | !2 | not 0 | !(2-2) |
    +-------+----+-------+--------+
    |     0 |  0 |     1 |      1 |
    +-------+----+-------+--------+
    1 row in set (0.00 sec)
    
    mysql> select 2 and 3,4 && 0,0 && null, null && null;
    +---------+--------+-----------+--------------+
    | 2 and 3 | 4 && 0 | 0 && null | null && null |
    +---------+--------+-----------+--------------+
    |       1 |      0 |         0 |         NULL |
    +---------+--------+-----------+--------------+
    1 row in set (0.00 sec)
    
    mysql> select 1 or 1,1 or 0,0 || null, null || null,0 || 0;
    +--------+--------+-----------+--------------+--------+
    | 1 or 1 | 1 or 0 | 0 || null | null || null | 0 || 0 |
    +--------+--------+-----------+--------------+--------+
    |      1 |      1 | NULL      | NULL         | 00     |
    +--------+--------+-----------+--------------+--------+
    1 row in set (0.00 sec)
    
    mysql> select 1 xor 1,1 xor 0,0 xor null, null xor null,0 xor 0;
    +---------+---------+------------+---------------+---------+
    | 1 xor 1 | 1 xor 0 | 0 xor null | null xor null | 0 xor 0 |
    +---------+---------+------------+---------------+---------+
    |       0 |       1 |       NULL |          NULL |       0 |
    +---------+---------+------------+---------------+---------+
    1 row in set (0.00 sec)
    
    (4)位运算符
    mysql> select 10 & 15,10 | 15,10 ^ 15,~15;
    +---------+---------+---------+----------------------+
    | 10 & 15 | 10 | 15 | 10 ^ 15 | ~15                  |
    +---------+---------+---------+----------------------+
    |      10 |      15 |       5 | 18446744073709551600 |
    +---------+---------+---------+----------------------+
    1 row in set (0.00 sec)
    
    mysql> select 10 & 15,10 | 15,10 ^ 15,10 & ~15;
    +---------+---------+---------+----------+
    | 10 & 15 | 10 | 15 | 10 ^ 15 | 10 & ~15 |
    +---------+---------+---------+----------+
    |      10 |      15 |       5 |        0 |
    +---------+---------+---------+----------+
    1 row in set (0.00 sec)
    
    mysql> select 1<<2,2<<2,10>>2,15>>4;
    +------+------+-------+-------+
    | 1<<2 | 2<<2 | 10>>2 | 15>>4 |
    +------+------+-------+-------+
    |    4 |    8 |     2 |     0 |
    +------+------+-------+-------+
    1 row in set (0.00 sec)
    
    (5)运算符优先级

    在这里插入图片描述

    【10】连接查询

    MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接。

    //查看student1表的信息
    mysql> select * from student1;
    +----+----------+--------+--------+
    | id | name     | socre  | course |
    +----+----------+--------+--------+
    |  1 | lisi     | 104.00 |      1 |
    |  2 | zhangsan |  93.00 |      1 |
    |  3 | tianqi   |  77.00 |      2 |
    |  4 | qianba   |  78.00 |      3 |
    |  5 | tianbi   |  66.00 |      3 |
    +----+----------+--------+--------+
    5 rows in set (0.00 sec)
    
    //查看student表的信息
    mysql> select * from student;
    +----+----------+--------+--------+
    | id | name     | socre  | course |
    +----+----------+--------+--------+
    |  1 | lisi     | 104.00 |      1 |
    |  2 | zhangsan |  93.00 |      1 |
    |  3 | tianqi   |  77.00 |      2 |
    |  4 | long     | 120.00 |      3 |
    |  5 | zhuge    |  20.00 |      2 |
    +----+----------+--------+--------+
    5 rows in set (0.00 sec)
    
    //查询course表的信息
    mysql> select * from course;
    +----+--------+---------+
    | id | name   | teacher |
    +----+--------+---------+
    |  1 | 语文   | yangqi  |
    |  2 | 数学   | yangba  |
    |  3 | 英语   | yangjiu |
    +----+--------+---------+
    3 rows in set (0.00 sec)
    
    (1)内连接

    MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件。内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表。

    格式一:连接两表关系查询
    SELECT 字段 FROM 表1 INNER JOIN 表2 ON 表1.外键 =表2.主键;
    格式二:显示两表相同内容
    SELECT 字段 FROM 表1 INNER JOIN 表2 ON 字段关系;
    

    在这里插入图片描述
    如果表中至少有一个匹配项,INNER JOIN 关键字将返回一行。如果没有匹配项,则不会有输出结果。
    格式一举例:

    mysql> select student1.name,socre,course,course.name,teacher from student1
                inner join courrse on student1.course=course.id;
    +----------+--------+--------+--------+---------+
    | name     | socre  | course | name   | teacher |
    +----------+--------+--------+--------+---------+
    | lisi     | 104.00 |      1 | 语文   | yangqi  |
    | zhangsan |  93.00 |      1 | 语文   | yangqi  |
    | tianqi   |  77.00 |      2 | 数学   | yangba  |
    | qianba   |  78.00 |      3 | 英语   | yangjiu |
    | tianbi   |  66.00 |      3 | 英语   | yangjiu |
    +----------+--------+--------+--------+---------+
    5 rows in set (0.00 sec)
    

    格式二举例:

    //只查询相同的部分
    mysql> select * from student1 inner join student on student1.name=student.name;
    +----+----------+--------+--------+----+----------+--------+--------+
    | id | name     | socre  | course | id | name     | socre  | course |
    +----+----------+--------+--------+----+----------+--------+--------+
    |  1 | lisi     | 104.00 |      1 |  1 | lisi     | 104.00 |      1 |
    |  2 | zhangsan |  93.00 |      1 |  2 | zhangsan |  93.00 |      1 |
    |  3 | tianqi   |  77.00 |      2 |  3 | tianqi   |  77.00 |      2 |
    +----+----------+--------+--------+----+----------+--------+--------+
    3 rows in set (0.00 sec)
    
    (2)外连接之左连接

    MySQL 除了内连接,还可以使用外连接。区别于 MySQL 外连接是将表分为基础表和参考表,再依据基础表返回满足条件或不满足条件的记录。外连接按照连接时表的顺序来分, 有左连接和右连接之分。左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。

    格式:
    select * from 表1  left join 表2 on 字段关系;
    

    在这里插入图片描述
    从原理图可以看出,左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索 条件的记录,也就是图中交叉的部分。右表记录不足的地方均为 NULL。

    //左侧表全部显示,右侧表显示相同部分,不同部分显示null值
    mysql> select * from student1 left join student on student1.name=student.name;
    +----+----------+--------+--------+------+----------+--------+--------+
    | id | name     | socre  | course | id   | name     | socre  | course |
    +----+----------+--------+--------+------+----------+--------+--------+
    |  1 | lisi     | 104.00 |      1 |    1 | lisi     | 104.00 |      1 |
    |  2 | zhangsan |  93.00 |      1 |    2 | zhangsan |  93.00 |      1 |
    |  3 | tianqi   |  77.00 |      2 |    3 | tianqi   |  77.00 |      2 |
    |  4 | qianba   |  78.00 |      3 | NULL | NULL     |   NULL |   NULL |
    |  5 | tianbi   |  66.00 |      3 | NULL | NULL     |   NULL |   NULL |
    +----+----------+--------+--------+------+----------+--------+--------+
    5 rows in set (0.00 sec)
    
    (3)外连接之右连接

    右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。也就是说匹配右表中的每一行及左表中符合条件的记录。

    格式:
    select * from 表1 right join b_player 表2 on 字段关系;
    

    在这里插入图片描述
    在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足。

    //右侧部分全部显示,左侧部分只显示相同部分,不同部分显示null值
    mysql> select * from student1 right join student on student1.name=student.name;
    +------+----------+--------+--------+----+----------+--------+--------+
    | id   | name     | socre  | course | id | name     | socre  | course |
    +------+----------+--------+--------+----+----------+--------+--------+
    |    1 | lisi     | 104.00 |      1 |  1 | lisi     | 104.00 |      1 |
    |    2 | zhangsan |  93.00 |      1 |  2 | zhangsan |  93.00 |      1 |
    |    3 | tianqi   |  77.00 |      2 |  3 | tianqi   |  77.00 |      2 |
    | NULL | NULL     |   NULL |   NULL |  4 | long     | 120.00 |      3 |
    | NULL | NULL     |   NULL |   NULL |  5 | zhuge    |  20.00 |      2 |
    +------+----------+--------+--------+----+----------+--------+--------+
    5 rows in set (0.00 sec)
    
    展开全文
  • 内连接(inner join)。 外连接: 全连接(full join)、左连接(left join)、右连接(right join)。 交叉联接(cross join)。 外连接与内连接不一样,外连接返回的查询结果中不仅包含符合条件的行,还包括左表(左...
  • C#Winform基于SQL Server的网络连接数据库和本地连接,实现增删改查(数据库查询语句以及数据库配置,适合新手)
  • 数据库内连接 内连接查询出的结果就是满足条件的两个表的内容。t1和t2中名字相同的数据: 数据库左连接 左连接输出左表中所有数据和右表中满足on后面条件的数据。 加上where语句与上一个相比就是多了一个...
  • 一般所说的左连接,外连接是指左外连接,右外连接 先说左外连接和右外连接
  • Q:什么是数据库内连接、外连接? A:其实这两个是最好区分的 我们在高中高一的时候学的数学的第一堂课学的是并集与交集 这里用他们来理解是最好的 内连接你可以看做是取两个表的交集 其中只有两条互相对应着的数据...
  • 内连接内连接中,只有满足连接条件的元组才能作为结果输出,即当任一个表中为null则不会输出。 SQL 语句:123SELECT FIRST.Cno,SECOND.CpnoFROM Course FIRST,Course SECONDWHERE FIRST.Cpno=SECOND.Cno; 左外连接...
  • 数据库内连接 INNER JOIN 数据库内连接限制较多,要求连接的关系表之间必有一一行对应关系,不然容易出现一对多产生长幅数据表,如下图: 要求每位学生选择一门课程,则两表匹配后会出现sx关系表情况,事实上匹配...
  • 假设有A,B两个表。 表A记录如下: aID aNum 1 a20050111 ...注:left和right是外连接,Inner是内连接。 多看看SQL的帮助就明白了 参考资料: http://aoshiyuan.com/bbs/showtopic-3.aspx
  • ORACLE数据库表连接以及SQL语句的执行流程 表连接的三种方式 内连接 内连接有3种类型 > 等值连接 : 使用“=”比较两张表的关联字段 >不等连接 : 使用“>,>=,<,<=,<>,!=”等不等的比较...
  • 连接  1.left join  示例:SQL语句:select * from student left join course on student.ID=course.ID  左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为...
  • 对内连接,外连接,交叉连接的讲解: 1、内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。 联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 ...
  • 左外链接查询:A left join B on conidtion where condition 用左表 的全部数据去匹配 右表 右表无匹配数据... 右外连接查询:A left join B on condition where condition 用右表的全部数据去匹配左表 左表数
  • 行级锁是一种排他锁,防止其他事务修改此行;在使用以下语句时,Oracle会自动应用...SELECT … FOR UPDATE语句允许用户一次锁定多条记录进行更新使用COMMIT或ROLLBACK语句释放锁 表级锁又分为5类: 行共享 (ROW SH...
  • 用一句话概括就是:左连接就是左边全部保留按条件查出右边,右连接就是右边...数据库建表语句如下: create database if not exists `emp`; USE `emp`; DROP TABLE IF EXISTS `dept`; CREATE TABLE `dep
  • 小白一枚 ,第一次尝试写博客 不喜勿喷 ...内连接:用代码来说就是用join on 也称自然连接, 例如有emp dept两张表 字段如下: 等值连接sql语句: select * from emp,dept where emp.deptno=dept.deptno 内
  • 在之前,我对MSSQL中的内连接和外连接所得出的数据集不是很清楚。这几天重新温习了一下SQL的书本,现在的思路应该是很清楚了,现在把自己的理解发出来给大家温习下。希望和我一样对SQL的连接语句不太理解的朋友能够...
  • 前面主要介绍了单表操作时的相关查询语句,接下来介绍一下多表之间的关系,这里主要是多表数据记录的查询,也就是如何...连接查询分为外连接查询和内连接查询。 一、表和表之间的关系 并(UNION):并操作是把具有...
  • 内连接:inner join 或者直接写join 表示查询连接的表中字段相匹配的数据,返回的数据中只有匹配的数据,相当于根据条件,求交集; 写法: select a.字段1......,b.字段1......from 表1 别名1 inner join 表2 别名...
  • 数据库查询基本语句

    热门讨论 2021-01-09 09:32:35
    1:基本连接 基本规则:每个目标前必须写明指定表名称 ...2:内连接---等值连接,自动消除不匹配的行 SELECT A.列1,B.列1,B.列2 FROM 表1 A join 表2 B ON A.列1=B.列1 WHERE 条件 '可加可不加, 3:外连接---返...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,361
精华内容 944
关键字:

数据库内连接语句