sql语句进阶教程,where关键字的区别

06-表的操作

创设两张表并插入一些多少

转载自:

 

create table class(
  class_id int,
  class_name varchar(20),
  class_grade char(1)
);

insert into class values (1,'语文','A');
insert into class values (2,'数学','B');
insert into class values (3,'英语','C');

create table score(
  class_id int,
  stu_id varchar(20),
  Score int
);

insert into score values (1,'A001',91);
insert into score values (2,'A001',95);
insert into score values (1,'A002',82);
insert into score values (2,'A002',87);
insert into score values (3,'B003',65);

新近从体育场地借了本介绍SQL的书,筹算复习一下基本语法,记录一下笔记,收拾一下思路,以备日后复习之用。

本节牵线

  • 积累引擎介绍(掌握卡塔 尔(英语:State of Qatar)
  • 表的增加和删除改查

 

PS:本文适用SQL Server2009语法。

生机勃勃、存款和储蓄引擎(驾驭卡塔尔

前几节我们领略mysql中国建工业总会公司立的库===》文件夹,库中的表====》文件

现实生活中大家用来囤积数据的文本有例外的品类,每个文件类型对应各自不相同的管理机制:例如拍卖公事用txt类型,管理表格用excel,管理图片用png等

数据库中的表也应当有分裂的种类,表的体系不相同,会对应mysql差异的存取机制,表类型又称作存款和储蓄引擎。

ps: 存款和储蓄引擎说白了正是哪些存储数据、如何为存款和储蓄的数目创建目录和怎么着立异、查询数据等技能的落实格局。因为在关周详据库中多少的囤积是以表的花样储存的,所以存款和储蓄引擎也足以称呼表类型(即存款和储蓄和操作此表的类型卡塔尔

在Oracle 和SQL Server等数据库中唯有一种存款和储蓄引擎,全部数据存款和储蓄管理机制未有不一致的。而MySql
数据库提供了多种存款和储蓄引擎。客户可以依附分歧的必要为数据表选择差别的积存引擎,客户也能够依附
和睦的须求编写制定本人的蕴藏引擎

图片 1

SQL 深入深入分析器、SQL 优化器、缓冲池、存款和储蓄引擎等零部件在各个数据库中都设有,但不是每一个数据库皆好似此多存款和储蓄引擎。MySQL 的插件式存款和储蓄引擎能够让存款和储蓄引擎层的开辟职员设 计他们愿意的存款和储蓄层,譬如,有的利用供给满意职业的渴求,有的使用则不须求对职业有这 么强的渴求 ;有的盼望多少能始终如风华正茂存款和储蓄,有的只期望放在内部存款和储蓄器中,不常并异常快地提供对数据 的询问。

 

翻看表中的多少

大器晚成、关系型数据库和SQL

其实准确的讲,SQL是一门语言,并非三个数据库。

如何是SQL呢?简单来说,SQL正是保卫安全定和睦行使关系型数据库中的的数量的意气风发种标准的微电脑语言。

二、mysql帮助的仓库储存引擎

mysql> show enginesG;# 查看所有支持的引擎
mysql> show variables like 'storage_engine%'; # 查看正在使用的存储引擎

 

1、InnoDB 存款和储蓄引擎----常用

援助职业,其陈设指标根本面向联机事务管理(OLTP)的接收。其

特色是行锁设计、扶植外键,并扶持相像 Oracle 的非锁定读,即私下认可读取操作不会时有产生锁。 从 MySQL 5.5.8 版本开首是私下认可的囤积引擎。

InnoDB 存款和储蓄引擎将数据放在二个逻辑的表空间中,那个表空间就像黑盒同样由 InnoDB 存款和储蓄引擎本身来保管。从 MySQL 4.1(富含 4.1)版本开头,能够将种种InnoDB 存款和储蓄引擎的 表单独寄放到三个独自的 ibd 文件中。别的,InnoDB 存款和储蓄引擎援救将裸设备(row disk)用 于创建其表空间。

InnoDB 通过应用多版本出现调整(MVCC)来获得高并发性,何况达成了 SQL 标准 的 4 种隔断等级,默以为 REPEATABLE 等第,同一时间使用风度翩翩种叫做 netx-key locking 的战略来 防止幻读(phantom)现象的发生。除此而外,InnoDB 存款和储蓄引擎还提供了插入缓冲(insert buffer)、二遍写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高品质和高可用的功效。

对此表中多少的积累,InnoDB 存款和储蓄引擎选拔了汇集(clustered)的主意,每张表都以按 主键的次第进行仓库储存的,若无显式地在表定义时钦命主键,InnoDB 存款和储蓄引擎会为每后生可畏 行生成一个 6 字节的 ROWID,并以此作为主键。

InnoDB 存款和储蓄引擎是 MySQL 数据库最为常用的风度翩翩种引擎,推文(Tweet卡塔 尔(英语:State of Qatar)、Google、Yahoo 等 集团的功成名就运用已经表达了 InnoDB 存储引擎具有高可用性、高质量以致高可扩展性。对其 底层达成的理解和理解也供给时刻和本领的积存。假若想浓郁摸底 InnoDB 存款和储蓄引擎的行事 原理、达成和采取,能够参见《MySQL 技术内部原因:InnoDB 存储引擎》风度翩翩书。

2、MyISAM 存款和储蓄引擎----常用

不扶助专业、表锁设计、辅助全文索引,首要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本早前是默许的储存引擎(除 Windows 版本外)。数据库系统 与文件系统二个超级大的分化在于对作业的支撑,MyISAM 存款和储蓄引擎是不帮衬职业的。究其根 本,那也并简单通晓。客商在具备的选用中是还是不是都亟待职业呢?在数据仓库中,如果未有ETL 那几个操作,只是简短地经过报表查询还亟需专门的职业的援助吧?别的,MyISAM 存款和储蓄引擎的 另三个独特之处是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,那与 大多数的数据库都差异等。

3、NDB 存储引擎

年,MySQL AB 集团从 Sony Ericsson 公司收购了 NDB 存款和储蓄引擎。 NDB 存款和储蓄引擎是四个集群存款和储蓄引擎,相似于 Oracle 的 RAC 集群,可是与 Oracle RAC 的 share everything 结构不生机勃勃的是,其组织是 share nothing 的集群架构,因而能提供越来越高档别的 高可用性。NDB 存储引擎的性格是多少总体位居内部存款和储蓄器中(从 5.1 版本最初,能够将非索引数 据放在磁盘上),由此主键查找(primary key lookups)的进度异常快,并且能够在线增添 NDB 数据存款和储蓄节点(data node)以便线性地进步数据库质量。简单的说,NDB 存款和储蓄引擎是高可用、 高品质、高可扩充性的数据库集群系统,其面向的也是 OLTP 的数据库应用场目。

4、Memory 存款和储蓄引擎----常用

正如其名,Memory 存款和储蓄引擎中的数据都存放在内部存款和储蓄器中,数据库重 启或产生崩溃,表中的数目都将未有。它极度相符于储存 OLTP 数据库应用中一时半刻数据的有的时候表,也能够看做 OLAP 数据库应用中数据酒馆的维度表。Memory 存款和储蓄引擎暗中同意使用哈希 索引,并不是兴味索然熟练的 B+ 树索引。

5、Infobright 存款和储蓄引擎

其三方的存款和储蓄引擎。其性状是储存是依照列而非洲开发银行的,因而十一分 符合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上边有为数不菲成功的多少 商旅案例可供深入分析。

6、NTSE 存款和储蓄引擎

新浪公司开销的面向其内部使用的蕴藏引擎。方今的本子不扶植职业, 但提供压缩、行级缓存等风味,不久的前天会促成面向内部存款和储蓄器的作业扶持。

7、BLACKHOLE----常用

黑洞存款和储蓄引擎,能够选用于主备复制中的分发主库。

MySQL 数据库还会有众多其余存款和储蓄引擎,上述只是列举了有加无己常用的有个别引擎。若是你高兴,完全能够编写专门项目于自身的引擎,那正是开源付与我们的技术,也是开源的魅力所在。

 

钦命表类型/存款和储蓄引擎

create table t1(id int)engine=innodb;# 默认不写就是innodb

 

小练习:

始建四张表,分别使用innodb,myisam,memory,blackhole存款和储蓄引擎,进行插队数据测验 

create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
create table t4(id int)engine=blackhole;

翻开data文件下db1数据库中的文件:

图片 2

图片 3

#.frm是存储数据表的框架结构

# .ibd是mysql数据文件 

#.MYD是MyISAM表的数据文件的扩展名

#.MYI是MyISAM表的索引的扩展名

#发现后两种存储引擎只有表结构,无数据

#memory,在重启mysql或者重启机器后,表内数据清空
#blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录

图片 4

 

mysql> select * from class;
+----------+------------+-------------+
| class_id | class_name | class_grade |
+----------+------------+-------------+
|        1 | 语文       | A           |
|        2 | 数学       | B           |
|        3 | 英语       | C           |
+----------+------------+-------------+
3 rows in set (0.00 sec)

mysql> select * from score;
+----------+--------+-------+
| class_id | stu_id | Score |
+----------+--------+-------+
|        1 | A001   |    91 |
|        2 | A001   |    95 |
|        1 | A002   |    82 |
|        2 | A002   |    87 |
|        3 | B003   |    65 |
+----------+--------+-------+
5 rows in set (0.00 sec)

mysql>

1.1 SQL语言重要有3个首要的组成都部队分。

  1. DML(Data Manipulation Language)数据垄断语言。那些模块能够让大家探索、校订、增添、删除数据库中的数据。
  2. DDL(Data Definition Language)数据定义语言。是的我们能够创制和改过数据库本人。如:DDL提供ALTER讲话,他让大家能够修正数据库中表的计划性。
  3. DCL(Data Control Language)数据调节语言,用于保证数据库的安全。

在SQL术语中,记录(record)和字段(田野(field))实际上就叫做行(row)和列(column)。

三、表介绍

表也就是文件,表中的一条记下就一定于文件的大器晚成行内容,差别的是,表中的一条记下有关照的题目,称为表的字段

图片 5

id,name,sex,age,birth称为字段,别的的,风流倜傥行内容称为一条记下

 

 

1.2 主键和外键

主键之所以有需求:

  • 首先让你唯生龙活虎标志表中独立的一站式。主键确定保障了唯大器晚成性。
  • 能够比较轻便的将二个表和另一个表关联。
  • 主键日常就可以自行暗中认可创立索引,升高了查询速度。

外键正是说A表中的有些字段,同期是B中的主键,那么那些字段正是A表中的外键。希望A表中的那么些外键的值必需是B中已经存在的值。

四、创建表

语法:

图片 6

create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);

#注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的

图片 7

1.创制数据库

create database db2 charset utf8;

2.行使数据库

use db2;

3.创建a1表

create table a1(
  id int,
  name varchar(50),
  age int(3)
);

4.插入表的记录

insert into a1 values
(1,'mjj',18),
(2,'wusir',28);

ps:以;作为mysql的甘休语

5.查询表的数目和协会

(1卡塔 尔(阿拉伯语:قطر‎查询a1表中的存款和储蓄数据

图片 8

mysql> select * from a1;
+------+-------+------+
| id | name | age |
+------+-------+------+
| 1 | mjj   | 18  |
| 2 | wusir | 28  |
+------+-------+------+
2 rows in set (0.02 sec)

mysql>

图片 9

 

(2卡塔尔查看a1表的布局

图片 10

mysql> desc a1;
+-------+-------------+------+-----+---------+-------+
| Field     | Type           | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id        | int(11)        | YES  |      | NULL    |       |
| name      | varchar(50)    | YES  |      | NULL    |       |
| age       | int(3)         | YES  |      | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.16 sec)

图片 11

(3卡塔 尔(英语:State of Qatar)查看表的详实结构

图片 12

mysql> show create table a1G;
*************************** 1. row ***************************
       Table: a1
Create Table: CREATE TABLE `a1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `age` int(3) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

图片 13

6.复制表

(1卡塔 尔(阿拉伯语:قطر‎新创造一个数据库db3

mysql> create database db3 charset utf8;
Query OK, 1 row affected (0.00 sec)

(2)使用db3

mysql> use db3;
Database changed

图片 14

#这是上个创建的db2数据库中的a1表
mysql> select * from db2.a1;
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | mjj   |   18 |
|    2 | wusir |   28 |
+------+-------+------+

图片 15

(3卡塔 尔(阿拉伯语:قطر‎复制db2.a1的表结商谈笔录

# 这就是复制表的操作(既复制了表结构,又复制了记录)
mysql> create table b1 select * from db2.a1;
Query OK, 2 rows affected (0.03 sec)

(4卡塔 尔(英语:State of Qatar)查看db3.b第11中学的数据和表结构

图片 16

#再去查看db3文件夹下的b1表发现 跟db2文件下的a1表数据一样
mysql> select * from db3.b1;
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | mjj   |   18 |
|    2 | wusir |   28 |
+------+-------+------+
2 rows in set (0.00 sec)

图片 17

 

ps1:要是假定表结构,不要记录

#在db2数据库下新创建一个b2表,给一个where条件,条件要求不成立,条件为false,只拷贝表结构
mysql> create table b2 select * from db2.a1 where 1>5;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

查看表结构:

图片 18

# 查看表结构
mysql> desc b2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int(3)      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)

#查看表结构中的数据,发现是空数据
mysql> select * from b2;
Empty set (0.00 sec)

图片 19

 

ps2:还或许有后生可畏种做法,使用like(只拷贝表结构,不拷贝记录)

图片 20

mysql> create table b3 like db2.a1;
Query OK, 0 rows affected (0.01 sec)

mysql> desc b3;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int(3)      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)

mysql> select * from db3.b3;
Empty set (0.00 sec)

图片 21

 

7.删除表:

drop table 表名;

相比较上边几组查询结果
--就算您对left join丰盛熟识的话,先不用看结果,是或不是足以平素透露上面查询的结果

1.3 数据类型

日常来说,有3中最重要的数据类型:

  1. 数字(Numeric)
  2. 字符(Character)
  3. 以致日期/时间(Date/Time)

bit是数字型,它只同意多个值,0和1。

字符类型差距^1):

类型 长度 说明
char 固定长度
nchar 固定长度 处理unicode数据类型(所有的字符使用两个字节表示)
varchar 可变长度 效率没char高 灵活
nvarchar 可变长度 处理unicode数据类型(所有的字符使用两个字节表示)
  • 1字节=8位
  • bit便是位,也叫比特位,是Computer表示数据最小的单位。
  • byte就是字节,1byte=8bit,1byte便是1B;
  • 二个字符=2字节;
mysql> select * from class A left join score B on A.class_id=B.class_id;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |        1 | A001   |    91 |
|        2 | 数学       | B           |        2 | A001   |    95 |
|        1 | 语文       | A           |        1 | A002   |    82 |
|        2 | 数学       | B           |        2 | A002   |    87 |
|        3 | 英语       | C           |        3 | B003   |    65 |
+----------+------------+-------------+----------+--------+-------+
5 rows in set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id and 1=1;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |        1 | A001   |    91 |
|        2 | 数学       | B           |        2 | A001   |    95 |
|        1 | 语文       | A           |        1 | A002   |    82 |
|        2 | 数学       | B           |        2 | A002   |    87 |
|        3 | 英语       | C           |        3 | B003   |    65 |
+----------+------------+-------------+----------+--------+-------+
5 rows in set (0.01 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id and 1=0;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |     NULL | NULL   |  NULL |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
|        3 | 英语       | C           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
3 rows in set (0.00 sec)

mysql> select * from class A left join score B on 1=0;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |     NULL | NULL   |  NULL |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
|        3 | 英语       | C           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
3 rows in set (0.00 sec)

mysql> left join的最重要特点是:不管on后面是什么条件,都会返回左表中的所有行!

1.3 空值

空值不对等空格或空白。使用NULL表示空值。

 

二、轻易增加和删除改查

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='语文';
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |        1 | A001   |    91 |
|        1 | 语文       | A           |        1 | A002   |    82 |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
|        3 | 英语       | C           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
4 rows in set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='数学';
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        2 | 数学       | B           |        2 | A001   |    95 |
|        2 | 数学       | B           |        2 | A002   |    87 |
|        1 | 语文       | A           |     NULL | NULL   |  NULL |
|        3 | 英语       | C           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
4 rows in set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='英语';
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        3 | 英语       | C           |        3 | B003   |    65 |
|        1 | 语文       | A           |     NULL | NULL   |  NULL |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
3 rows in set (0.01 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='体育';
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |     NULL | NULL   |  NULL |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
|        3 | 英语       | C           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
3 rows in set (0.00 sec)

mysql>

2.1 查(列名有空格的气象卡塔尔国

1
2
SELECT [ last name]
FROM Customers

用方括号将有空格的列名括起来。
PS: MySQL使得重音符`(~卡塔 尔(英语:State of Qatar)开关。Oracle用双引号。

设若on前面包车型大巴基准是左表中的列(and leftTable.colName='***'),左表中满意条件的行和右表中的行实行相称(依照on leftTable.id=rightTable.id);左表中不满足条件的行,直接出口,其相应的右表中的列都是null。

询问顺序,SQL推行种种^2):

1
2
3
4
5
6
Select -1>选择列,-2>distinct,-3>top
  1>…From 表
  2>…Where 条件
  3>…Group by 列
  4>…Having 筛选条件
  6>…Order by 列

 

2.2 增

1
2
3
4
5
6
INSERT INTO tablename
(columnlist)
VALUES
(RowValues1)
(RowValues2)
(repeat any number of times)
mysql> select * from class A left join score B on A.class_id=B.class_id and B.Score=90;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |     NULL | NULL   |  NULL |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
|        3 | 英语       | C           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
3 rows in set (0.01 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id and B.Score=65;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        3 | 英语       | C           |        3 | B003   |    65 |
|        1 | 语文       | A           |     NULL | NULL   |  NULL |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
3 rows in set (0.01 sec)

mysql>

2.3 改

1
2
3
UPDATE  table
SET column1=expression1,column2=expression2(repeat any number of times)
WHERE condition

若果on前面包车型大巴规范是右表中的列(and rightTable.colName='***'),首先会基于(and rightTable.colName='***')过滤掉右表中不满意条件的行;然后,左表中的行依照(on leftTable.id=rightTable.id)和右表中满意条件的行开展相配。

2.4 删

1
2
3
DELETE
FROM table
WHERE condition

剔除前能够证实一下:

1
2
3
4
SELECT 
COUNT(*)
FROM table
WHERE condition

 

举个例子想要删除全部的行,可以:

1
DELETE FROM table

 

或者

1
TRUNCATE TABLE table

 

TRUNCATE TABLE优势在于速度越来越快,但是不提供记录事务的结果。
其它叁个分歧点是,TRUNCATE TABLE再也设置了用来自增型的列的近日值,DELETE不会。

 

三、别名

关键字:AS

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='语文' and B.Score=90;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |     NULL | NULL   |  NULL |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
|        3 | 英语       | C           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
3 rows in set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='语文' and B.Score=91;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |        1 | A001   |    91 |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
|        3 | 英语       | C           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
3 rows in set (0.01 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='体育' and B.Score=90;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |     NULL | NULL   |  NULL |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
|        3 | 英语       | C           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
3 rows in set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='体育' and B.Score=82;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |     NULL | NULL   |  NULL |
|        2 | 数学       | B           |     NULL | NULL   |  NULL |
|        3 | 英语       | C           |     NULL | NULL   |  NULL |
+----------+------------+-------------+----------+--------+-------+
3 rows in set (0.00 sec)

mysql>

3.1 计算字段

运用总结字段可以做如下的业务:

  • 挑选特定的单词恐怕数值
  • 对单个大概八个列进行测算
  • 把列和间接量组合在协同。

/**********************过滤条件在on中时**********************/
总结一下,即便 left join on leftTable.id=rightTable.id 后还应该有别的条件:
(1)and leftTable.colName='***',过滤左表,但是左表不满意条件的行直接出口,并将右表对应部分置为null
(2)and rightTable.colName='***',过滤右表,对左表没有影响
(3)and leftTable.colName='***' and rightTable.colName='***',正是下边(1)和(2)一齐发挥效用

3.2 直接量

以此直接量和表中的数量未有其余关联,正是为了证实所用,上边这连串型的表明式就叫做直接量(literal value)。
图片 22

1
2
SELECT '直接量' AS `类型`,firstname,lastname 
FROM `customers` ;

图片 23
如图,结果中央直属机关接量就在一列中了。

不管on前边有如何原则,left join都要回去左表中的全部行!

3.3 算数运算

例子1:

1
2
SELECT  num*price AS total
FROM orders

 

例子2:

1
2
SELECT  firstname+' '+lastname AS 'fullname'
FROM users

 

在MySql中一连若是用CONCAT函数:

1
2
3
SELECT OrderID,FirstName,LastName,
CONCAT(FirstName,' ',LastName) AS 'fullname'
FROM orders

 

 

3.4 别名

1卡塔尔列的外号

1
2
SELECT firstname AS fn
FROM customers

 

2卡塔 尔(英语:State of Qatar) 表的别名

1
2
SELECT firstname 
FROM customers AS cu

 

说明:

  1. 列的别名是为着展现用的,外号会作为查询结果的表头,不可能在WHERE中运用列的外号,会出错!!!
  2. 表的外号确实是为着便利操作用的,能够在WHERE中应用列的外号举办!
mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='语文';
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |        1 | A001   |    91 |
|        1 | 语文       | A           |        1 | A002   |    82 |
+----------+------------+-------------+----------+--------+-------+
2 rows in set (0.01 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='数学';
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        2 | 数学       | B           |        2 | A001   |    95 |
|        2 | 数学       | B           |        2 | A002   |    87 |
+----------+------------+-------------+----------+--------+-------+
2 rows in set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='英语';
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        3 | 英语       | C           |        3 | B003   |    65 |
+----------+------------+-------------+----------+--------+-------+
1 row in set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='体育';
Empty set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id where B.Score=90;
Empty set (0.01 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id where B.Score=91;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |        1 | A001   |    91 |
+----------+------------+-------------+----------+--------+-------+
1 row in set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='语文' and B.Score=90;
Empty set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='语文' and B.Score=91;
+----------+------------+-------------+----------+--------+-------+
| class_id | class_name | class_grade | class_id | stu_id | Score |
+----------+------------+-------------+----------+--------+-------+
|        1 | 语文       | A           |        1 | A001   |    91 |
+----------+------------+-------------+----------+--------+-------+
1 row in set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='体育' and B.Score=90;
Empty set (0.00 sec)

mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='体育' and B.Score=91;
Empty set (0.00 sec)

mysql> 

四、使用函数

函数要有大器晚成组圆括号跟在根本字背后,圆括号报告我们,那是三个函数!

/**********************过滤条件在where中时**********************/

4.1 字符函数

过滤条件写在where中时,先遵照where条件对表进行过滤,然后再进行left join

LEFT&RIGHT

LEFT(CharacterValue,NumberOfCharacters)
含义:选择CharacterValue字段的左边NumberOfCharacters多少个字符。
ps:智跑IGHT是左手多少个字符。

LTRIM&RTRIM

LTRIM(CharacterValue)
能够去除左边带头的空格。RTEscortIM功用相近。

SUBSTRING

SUBSTRING(CharacterValue,StartPositon,NumberOfCharacters)
意思:采用从开始地点(满含卡塔尔,N个长度的字符。

1
2
SELECT 
SUBSTRING('thewhitegoat',4,5) AS 'The Answer'

 

返回:white

4.2 日期/时间函数

GETDATE

1
SELECT GETDATE()

归来当前不久子和岁月。
PS:在MySql中,等价函数是NOW,在Oracle中是CURRENT_DATE

本文由澳门新葡亰平台官网发布于数据库,转载请注明出处:sql语句进阶教程,where关键字的区别

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。