第三章 SQL语言元素(一)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三章 SQL语言元素(一)相关的知识,希望对你有一定的参考价值。

参考技术A

InterSystems SQL命令(也称为SQL语句)以关键字开头,后跟一个或多个参数。其中一些参数可能是子句或函数,由它们自己的关键字标识。

InterSystems SQL关键字包括命令名称,函数名称,谓词条件名称,数据类型名称,字段约束,优化选项和特殊变量。它们还包括 AND , OR 和 NOT 逻辑运算符, NULL 列值指示符以及ODBC函数构造,例如 d dateval 和 fn CONCAT(str1,str2) 。

聚合函数是SQL固有函数,它计算列的所有值并返回单个聚合值。

这种写法只能在mac routine里,类文件里编译报错。

如果将用户提供的(外部)函数的使用配置为系统范围的选项,则该SQL语句只能调用用户提供的(外部)函数。默认为“否”。默认情况下,尝试调用用户提供的函数会发出 SQLCODE -372 错误。可以使用 %SYSTEM.SQL类的SetAllowExtrinsicFunctions() 方法在系统范围内配置SQL对外部函数的使用。若要确定当前设置,请调用 $SYSTEM.SQL.CurrentSettings() ,该显示显示“允许在SQL语句中使用外部函数”选项。

不能使用用户提供的函数来调用 %routine (名称以%字符开头的例程)。
尝试这样做会发出 SQLCODE -373 错误。

InterSystems SQL文字具有以下语法:

文字是一系列代表实际(文字)值的字符。它可以是数字或字符串。

空字符串是文字字符串;它由两个单引号字符( \'\' )表示。 NULL 不是文字值;它表示没有任何值。

注意:在嵌入式SQL中,不允许在字符串文字中使用以 ## 开头的一些字符序列,如“使用嵌入式SQL”一章的“文字值”中所述。此限制不适用于其他SQL调用,例如动态SQL。

使用单引号( \' )字符作为字符串定界符。 SQL兼容性支持双引号字符( “ )的使用,但由于与定界标识符标准冲突,因此强烈建议不要使用。将一对双引号字符 "" 解析为无效的定界标识符。并生成 SQLCODE -1 错误。

要在字符串中指定单引号字符作为字面字符,请指定一对这样的字符作为字面转义序列。
例如, \'a \'normal\' string\' 。

双竖条( || )是首选的SQL连接操作符。
它可以用于连接两个数字、两个字符串或一个数字和一个字符串。

下划线( _ )作为SQL连接操作符提供,以保证ObjectScript的兼容性。
此连接操作符只能用于连接两个字符串。

如果两个操作数都是字符串,并且两个字符串都具有相同的排序规则类型,则所得的级联字符串具有该排序规则类型。在所有其他情况下,连接的结果是排序类型 EXACT 。

使用 NULL 关键字表示没有指定值。
在SQL中, NULL 始终是表示数据值因任何原因未指定或不存在的首选方式。

SQL零长度字符串(空字符串)由两个单引号字符指定。
空字符串( " )与空字符串是不同的。
空字符串是一个已定义的值,一个不包含字符的字符串,一个长度为0的字符串。
一个零长度的字符串在内部由非显示字符 $CHAR(0) 表示。

注意:不建议使用SQL零长度字符串作为字段输入值或字段默认值。
使用 NULL 表示数据值的缺失。

在SQL编码中应避免使用SQL零长度字符串。
但是,由于许多SQL操作都会删除末尾的空格,所以只包含空格字符(空格和制表符)的数据值可能会导致SQL的零长度字符串。

注意,不同的SQL length函数返回不同的值: length 、 CHAR_LENGTH 和 DATALENGTH 返回SQL长度。
$LENGTH 返回ObjectScript表示长度。
长度不计算尾随空格;
所有其他长度函数都计算末尾的空格。

NOT NULL数据约束要求字段必须接收一个数据值;
不允许指定NULL而不是值。
这个约束不阻止使用空字符串值。

SELECT 语句的 WHERE 或 HAVING 子句中的 IS NULL 谓词选择空值;
它不选择空字符串值。

IFNULL 函数计算一个字段值,如果字段值为 NULL ,则返回第二个参数中指定的值。
它不会将空字符串值视为非空值。

COALESCE 函数从提供的数据中选择第一个非空值。
它将空字符串值视为非空值。

当 CONCAT 函数或 concenate 操作符( || )连接一个字符串和一个 NULL 时,结果是 NULL 。
如下面的例子所示:

AVG、COUNT、MAX、MIN 和 SUM 聚合函数在执行操作时忽略 NULL 值。
( COUNT * 统计所有行,因为不可能有一个所有字段都为空值的记录。)
SELECT 语句的 DISTINCT 关键字在其操作中包含 NULL ;
如果指定的字段有空值, DISTINCT 返回一个空行.

AVG 、 COUNT 和 MIN 、聚合函数受空字符串值的影响。
MIN 函数将空字符串视为最小值,即使存在值为0的行。
MAX 和 SUM 聚合函数不受空字符串值的影响。

对大多数SQL函数提供 NULL 作为操作数将返回 NULL 。

任何以NULL作为操作数的SQL算术操作都返回 NULL 值。
因此,7 +零=零。
这包括二元运算加法( + )、减法( - )、乘法( * )、除法( / )、整数除法( \\ )和取模( # ),以及一元符号运算符加号( + )和减号( - )。

算术操作中指定的空字符串将被视为0(零)值。
除法( / ),整数除法( \\ ),或对空字符串( 6/ " )取模( # )会导致 <DIVIDE> 错误。

在SQL中, NULL 的长度是没有定义的(它返回 < NULL > )。
然而,空字符串的长度被定义为长度为0。
如下面的例子所示:

如本例所示,SQL LENGTH 函数返回SQL长度。

可以使用 ASCII 函数将SQL的零长度字符串转换为 NULL ,示例如下:

但是,对标准 SQL 的某些系统间IRIS扩展对 NULL 和空字符串的长度的处理是不同的。
$LENGTH函数返回这些值的InterSystems IRIS内部表示: NULL 表示为长度为0的已定义值,SQL空字符串表示为长度为0的字符串。
该功能与ObjectScript兼容。

这些值的内部表示方式的另一个重要位置是 %STRING 、 %SQLSTRING 和 %SQLUPPER 函数,它们将空格附加到值中。
因为 NULL 实际上没有值,所以在它后面添加一个空格会创建一个长度为1的字符串。
但是一个空字符串确实有一个字符值,所以在它后面加上一个空格会创建一个长度为2的字符串。
如下面的例子所示:

注意,这个例子使用的是 CHAR_LENGTH ,而不是 LENGTH 。
因为 LENGTH 函数删除了末尾的空格,所以 LENGTH(%STRING(NULL)) 返回长度为0的字符串;
LENGTH(%STRING(")) 返回长度为2的字符串, 因为 %STRING 追加的是前导空格,而不是尾随空格。

当SQL NULL 输出到ObjectScript时,它由ObjectScript空字符串( "" )表示,长度为0的字符串。

当SQL零长度字符串数据输出到ObjectScript时,它由包含 $CHAR(0) 的字符串表示,该字符串长度为1。

在ObjectScript中,没有值通常用空字符串( "" )表示。
当这个值被传递到嵌入式SQL中时,它会被视为空值,如下面的例子所示:

如果指定了一个未定义的输入主机变量,嵌入式SQL将其值视为 NULL 。

当将NULL或空字符串值从嵌入式SQL传递到ObjectScript时, NULL 被转换为长度为0的字符串,空字符串被转换为长度为1的字符串。
如下面的例子所示:

在下面的例子中,SQL的空字符串加上一个空格被传递为长度为2的字符串:

第三章 - SQL基础及元数据获取

SQL的介绍

SQL的定义:结构化查询语句
SQL的作用:对库和表进行操作

SQL的常用分类

  • DDL 数据定义语言(Data Definition Language)
  • DCL 数据控制语言(Data Control Language)
  • DML 数据操作语言(Data Manipulation Language )
  • DQL 数据查询语言(Data Query Language)

表的核心属性介绍

列的属性

数据类型

## 数值类型
  - tinyint  极小整数数据类型(0-255)
  - INT      常规大小的整数数据类型

## 字符类型
  - CHAR 	  固定长度字符串、最多为255个字符
  - VARCHAR   可变长度字符串、最多为65535个字符
  - ENUM      有一个固定的合法值组成的枚举(相当组成个选项列表)

- 时间类型
  - DATETIME	范围从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
  - TIMESTAMP   范围从 1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
             	注意:TIMESAMP会受到时区的影响
## 二进制类型
   一般不使用(MYSQL不适合存储图片,视频等)
   neo4J 专门用来做图片视频的存储

约束((一般建表时添加))

primary key  #主键约束
设置为主键的列,此列的值必须非空且唯一,主键在一个表中只能有一个,但是可以有多个列一起构成。

not null	 #非空约束
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0

unique key	 #唯一键
列值不能重复

其他属性

unsigned   #无符号
针对数字列,非负数。

key   #索引
可以在某列上建立索引,来优化查询,一般是根据需要后添加

default	#默认值
列中,没有录入值时,会自动使用default的值填充

auto_increment	#自增长
针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量)
comment	#注释

表的属性

存储引擎

默认存储引擎:INNoDB

字符集

GBK       //一个中文字符占用2个字节  
UTF8	  //一个中文字符占用3个字节
utf8mb4   //一个中文字符占用4个字节长度  

UTF8与UTF8MB4区别:
UTF8MB4支持emoji  支持音标

校对规则(collation)

校对规则是跟着字符集走的.
例如: utf8mb4
utf8mb4_general_ci     --> 通用的校对,默认值,大小写不区分(默认规则)
utf8mb4_bin			  --> 大小写区分

-- 查看字符集校对规则
show collation;

-- 修改字符集校对规则
alter database world charset utf8mb4 collate utf8mb4_bin;

SQL基础操作-DDL

库的定义

建库

create database school;
create schema sch;
CREATE DATABASE test CHARSET utf8;
create database xyz charset utf8mb4 collate utf8mb4_bin;
-- 
建库规范:
	库名使用小写
	库名不能是数字开头
	库名要和业务有关
	建库时要添加字符集
-- 

删库

drop database test;

改库

alter database test charset utf8mb4;

查库

show databases;		//查看所有库
show create database test;	//查看单个库

表定义

建表

-- 建表格式:
create table  表名(
列名1  数据类型  约束  其他属性,
列名2  数据类型  约束  其他属性,
列名n  数据类型  约束  其他属性,
)engine=innodb charset=utf8mb4;

USE school;
CREATE TABLE stu(
id      INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT \'学号\',
sname   VARCHAR(255) NOT NULL COMMENT \'姓名\',
sage    TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT \'年龄\',
sgender ENUM(\'m\',\'f\',\'n\') NOT NULL DEFAULT \'n\' COMMENT \'性别\',
sfz     CHAR(18) NOT NULL UNIQUE  COMMENT \'身份证\',
intime  TIMESTAMP NOT NULL DEFAULT NOW() COMMENT \'入学时间\'   
) ENGINE=INNODB CHARSET=utf8mb4 COMMENT \'学生表\';

 #DEFAULT NOW()  当前时间的意思
 #ENGINE 指定使用的表结构   

建表规范:
1.表名小写,无数字开头,与业务有关
2.必须要有主键,一般是一个自增长的无关列
3.选择合适的数据类型,字符长度要适中
4.每个列都非空,并设置默认值
5.每个列必须要有注释
6.必须设置存储引擎和字符集

删表

-- 表定义和数据全部删除
drop table stu;

-- 清空表的区,数据清空,表定义保留
truncate table stu;	

改表

-- 在表中插入一列(默认最后列)
ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL UNIQUE COMMENT \'qq号\';  //在stu表中添加qq列

-- 在指定列后插入一列--AFTER
ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT \'微信号\' AFTER sname; //在sname后添加wechat列(after)

-- 在第一列前插入一列-- FIRST
ALTER TABLE stu ADD num INT NOT NULL COMMENT \'数字\' FIRST;

-- 删除列
ALTER TABLE stu DROP wechat;

-- 修改列的数据类型的属性 -- MODIFY
ALTER TABLE stu MODIFY sname VARCHAR(128) NOT NULL;

-- 修改列名称(数据类型需要指定) -- CHANGE
ALTER TABLE stu CHANGE sgender sg CHAR(1) NOT NULL DEFAULT \'n\' ;

查表

-- 查看表结构
desc xs;

-- 查看单张表
show create table xs;

-- 查看当前库中所有表
show tables;

复制表结构

CREATE TABLE ceshi LIKE stu;  //将stu表结构复制到ceshi

SQL基础操作-DCL

权限回收

-- revoke 权限 on 范围  from 用户;
revoke delete on zhihu.* from zhihu@\'10.0.0.%\';

用户授权

-- grant 权限 	no 对象	to 用户
grant all on *.* to admin@\'10.0.0.%\' identified by \'123456\';
grant all on *.* to admin1@\'10.0.0.%\' identified by \'123456\' with grant option;  
//with grant option:超级管理员才具备的,给别的用户授权的功能

SQL基础操作-DML

插入表数据 -- INSERT

USE school //进入指定库

-- 插入一条数据-最简单写法
INSERT INTO student VALUES(1,\'oldguo\',\'22654481\',18);

-- 插入一条数据(标准) //推荐
INSERT INTO student(sno,sname,sage,ssex)
VALUES (2,\'zhang3\',18,\'m\');

-- 插入多条数据 //推荐
INSERT INTO student(sno,sname,sage,ssex)
VALUES
(3,\'zhang4\',18,\'m\'),
(4,\'li4\',18,\'m\'),
(5,\'wang5\',19,\'f\');

-- 针对性录入数据
INSERT INTO student(sname,sage,ssex)
VALUES (\'zhang3\',18,\'m\');

修改表数据 - UPDATE

-- 语法格式

UPDATE 表名 SET 列名=\'值\'  where 列名=\'值\' AND 列名=\'值\'  //UPDATE一定要加where条件,多个条件加AND

-- 将student表中名字li4为zhang1
update student set sname=\'zhang1\' where sno=3;

-- 将1号学员的1001课程分数修改为89
update sc  set score=89 where sno=1 and cno=1001;

删除表数据 -- DELETE

-- 删除1号学员的所有成绩信息(sno为1)
delete from sc_bak where sno=1;	

使用update代替delete -- 伪删除

1.额外添加一个状态列 
alter table student add status enum(1,0) default 1;

2.使用update
update student set status=\'0\' where sid=1;

3.应用查询存在的数据(业务语句查询语句进行调整)
select * from student where status=1;

SQL基础应用 - DQL

SELECT 语句应用

SELECT (单表)的执行逻辑

select 列1,列2
from
where
group
having
order by
limit

SELECT 单独使用的情况(MySQL独家)

-- SELEECT @@参数
SELECT @@datadir;
SELECT @@port;
SELECT @@socket;
SELECT @@innodb_flush_log_at_trx_commit;
SHOW VARIABLES LIKE \'innodb%\';

-- select 函数()
SELECT NOW();
SELECT DATABASE();
SELECT USER();
SELECT 12*12;
SELECT CONCAT(\'HELLO  WORD\');
SELECT CONCAT(USER,\'@\',HOST) FROM mysql.user;
SELECT GROUP_CONCAT(USER,\'@\',HOST) FROM mysql.user;

FROM 子句应用

以下操作使用world库,world说明

SELECT * FROM city;    //查看city的所有信息
SELECT NAME,countrycode FROM city;    //查看city的name和countrtcode列

where 子句应用

-- 等值查询
SELECT * FROM city WHERE CountryCode=\'CHN\';     //查询中国所有城市的信息

-- 不等值查询 (>,<,<=,>=,<>)
SELECT * FROM city WHERE Population<100;        //查询人口数据小于100人的城市
SELECT * FROM city WHERE countrycode!=\'CHN\';    //查询不是中国的城市(尽量不要使用,可能不走索引)
SELECT * FROM city WHERE countrycode<>\'CHN\';    //查询不是中国的城市(尽量不要使用,可能不走索引)

-- 模糊查询
SELECT * FROM city WHERE CountryCode LIKE \'CH%\';    //查询国家代号为CH开头的城市信息

-- 逻辑连接符(and,or)
SELECT * FROM city WHERE countrycode=\'CHN\' AND Population>5000000;    //查询中国城市人口超过500W的城市信息
SELECT * FROM city WHERE district=\'shandong\' OR District=\'hebei\';     //查看山东省或河北的城市信息

-- 配合between and 使用
SELECT * FROM city WHERE Population BETWEEN 1000000 AND 2000000;    //查询人口数在100W-200W区间的城市信息(包含头尾,)

-- 配合 in 使用
SELECT * FROM city WHERE district IN (\'shandong\',\'hebei\');    //查询山东省或河北的城市信息

-- 配合 not in 使用
SELECT * FROM city WHERE countrycode NOT IN (\'CHN\',\'USA\');    //查询不是中国或美国的城市信息

group by + 常用聚合函数

作用

根据 by后面的条件进行分组,方便统计,by后面跟一个列或多个列

常用的聚合函数

COUNT()	 -- 计数
AVG()	 -- 平均值
SUM()	 -- 求和
MIN()	 -- 最小值
MAX()	 -- 最大值
group_concat()	-- 列转行

举个例子

-- 统计每个国家的城市个数
SELECT countrycode,COUNT(id) FROM city 
GROUP BY countrycode;

-- 统计每个国家的总人口数
SELECT countrycode,SUM(Population) FROM city 	
GROUP BY countrycode;

-- 统计各个国家的城市名列表
SELECT countrycode ,GROUP_CONCAT(NAME)
FROM city
GROUP BY countrycode

having 子句使用

-- 统计中国,每个省的,城市个数,省总人口数
--  只显示人口总数大于800w的省
SELECT District,COUNT(NAME),SUM(Population) FROM city
WHERE countrycode=\'CHN\'
GROUP BY District
HAVING SUM(Population)>8000000;

order by 子句

ORDER BY 语句用于对结果集进行排序。
默认升序,DESC 降序

-- 以上例子,将人口数进行排序输出
SELECT district, COUNT(NAME),SUM(population) 
FROM  city  
WHERE countrycode=\'CHN\' 
GROUP BY district 
HAVING  SUM(population)>8000000
ORDER BY SUM(population) DESC ;

-- 查询中国所有城市信息,并以人口数降序输出
SELECT * FROM city WHERE countrycode=\'CHN\'
ORDER BY population  DESC ;

limit 应用

-- 查询中国所有城市信息,并以人口数降序输出,只显示前五名
SELECT * FROM city WHERE countrycode=\'CHN\'
ORDER BY population  DESC
LIMIT 5 ;

-- 跳过前N行,显示M行(N和M代表的是数字)
LIMIT M  offet N 
LIMIT N,M

distinct -去重复

-- 查询所有的国家代号信息
SELECT  DISTINCT countrycode FROM city ;

union 与 union all

-- 中国或美国城市信息

SELECT * FROM city 
WHERE countrycode IN (\'CHN\' ,\'USA\');

SELECT * FROM city WHERE countrycode=\'CHN\'
UNION ALL
SELECT * FROM city WHERE countrycode=\'USA\'

说明:一般情况下,我们会将 IN 或者 OR 语句 改写成 UNION ALL,来提高性能
UNION     去重复
UNION ALL 不去重复

join 多表连接查询

多表连接查询通过表之间的关联字段,一次查询多表数据。

多表连接类型

  • 内连接
  • 外连接
  • 全连接
  • 笛卡尔

内连接的类型

  • 传统连接(where)
  • 自连接
  • join uing
  • join on

join on的语法

-- 两张表连接
select xxxx
from A
join B
on A.xxx = B.yyy

-- 多张表连接
select xxx
from A 
Join C
on A.xx=C.yy
join B
on C.aa=B.bb

多表连接联系

--- 5.1 查询人口数量少于100人的城市所在:国家名,国土面积,城市名,人口数
USE world;
DESC city;
DESC country;

SELECT    
country.name ,country.SurfaceArea,city.name,city.Population
FROM city  
JOIN country
ON city.CountryCode=country.code
WHERE city.Population<100;

--- 5.2 统计zhang3学习了几门课程
SELECT student.sname,COUNT(sc.cno)
FROM student  
JOIN sc
ON student.sno=sc.sno
WHERE student.sname=\'zhang3\';

--- 5.3  统计zhang3学习课程名称
SELECT student.sname,GROUP_CONCAT(course.cname) 
FROM student 
JOIN sc
ON student.sno=sc.sno
JOIN course
ON sc.cno=course.cno
WHERE student.sname=\'zhang3\';

--- 5.4 oldguo老师教了学生的个数
SELECT teacher.tname,COUNT(student.sno)
FROM teacher 
JOIN course 
ON teacher.tno=course.tno
JOIN sc
ON course.cno=sc.cno 
JOIN student
ON sc.sno=student.sno 
WHERE teacher.tname=\'oldguo\';


--- 5.5 每位老师所教课程的平均分,并按平均分排序

SELECT teacher.tname,AVG(sc.score)
FROM teacher 
JOIN course 
ON teacher.tno=course.tno
JOIN sc
ON course.cno=sc.cno
GROUP BY teacher.tno
ORDER BY AVG(sc.score) ;

--- 5.6 查询oldguo所教的不及格的学生姓名
SELECT teacher.tname,student.sname,sc.score
FROM teacher 
JOIN course 
ON teacher.tno=course.tno
JOIN sc
ON course.cno=sc.cno 
JOIN student
ON sc.sno=student.sno 
WHERE teacher.tname=\'oldguo\' AND sc.score<60;

--- 5.7 查询所有老师所教学生不及格的信息
SELECT teacher.tname,GROUP_CONCAT(student.sname)
FROM teacher 
JOIN course 
ON teacher.tno=course.tno
JOIN sc
ON course.cno=sc.cno 
JOIN student
ON sc.sno=student.sno 
WHERE sc.score<60
GROUP BY teacher.tname;

多表连接总结

  1. 多表连接中,小表驱动大表
  2. 通过left join 强制选定驱动表

AS 别名

表别名

​表别名一般是在from的表的别名,或者join后的表的别名。在where, group by ,select 后的列,having,order by

SELECT a.tname,GROUP_CONCAT(d.sname)
FROM teacher  AS a
JOIN course   AS b
ON a.tno=b.tno
JOIN sc AS c
ON b.cno=c .cno 
JOIN student AS d
ON c.sno=d.sno 
WHERE c.score<60
GROUP BY a.tname;

列表名

列别名一般是在select后的列,定义的别名。结果集显示会以别名形式展示,在having和order by中可以调用列别名。

SELECT a.tname AS 讲师,AVG(c.score) AS 平均分
FROM teacher AS a 
JOIN course  AS b
ON a.tno=b.tno
JOIN sc AS c 
ON b.cno=c.cno
GROUP BY a.tno
ORDER BY 平均分 ;

元数据获取

基表: 数据字典信息(列结构frm),系统状态,对象状态

元数据获取方式

  • information_schema
  • show 语句

show 语句(MySQL独家)

show databases;           		-- 查看所有数据库名
show tables;   		      		-- 查看当前库下的表名
show tables from world;   		-- 查看world数据库下的表名
show create database      		-- 查看建库语句
show create table         		-- 查看建表语句
show grants for root@\'localhost\' 	-- 查看用户权限信息
show charset				-- 查看所有的字符集
show collation				-- 查看校对规则
show full processlist			-- 查看数据库连接情况
show status				-- 查看数据库的整体状态
show status	like \'%lock%\'		-- 模糊查看数据库的整体状态
show variables 				-- 查看数据库所有变量情况
show variables 	like \'%innodb%\'		-- 查看数据库所有变量情况
show engines				-- 查看所有支持存储引擎
show engine innodb status  		-- 查看所有innodb存储引擎状态情况
show binary logs			-- 查看二进制日志情况			
show binlog events in 			-- 查看二进制日志事件 
show relaylog events in 		-- 查看relay日志事件
show slave status 			-- 查看从库状态
show master status 			-- 查看数据库binlog位置信息
show index from				-- 查看表的索引情况

information_schema 虚拟库

创建视图

information_schema ---> VIEWS 视图

CREATE VIEW test AS SELECT    
country.name AS co_name,country.SurfaceArea,city.name AS ci_name,city.Population
FROM city   JOIN country
ON city.CountryCode=country.code
WHERE city.Population<100;

VIEWS 视图: TABLES

存储整个数据库中,所有表的元数据的查询方法

use information_schema;
desc tables;
常用的
TABLE_SCHEMA 	-- 表所在的库
TABLE_NAME      -- 表名
TABLE_TYPE      -- 表类型	
ENGINE          -- 表的存储引擎
TABLE_ROWS      -- 表的行数
AVG_ROW_LENGTH  -- 平均行长度/用于计算真正的存储空间表的行数
INDEX_LENGTH    -- 索引的长度

举个例子

-- 1. 查询 world 数据库下的所有表名
show tables from world;

-- 2. 查询整个数据库下的所有表名
SELECT table_name FROM information_schema.tables;

-- 3. 查询所有InnoDB引擎的表
SELECT table_schema,table_name,ENGINE FROM information_schema.tables
WHERE ENGINE=\'innodb\';

-- 4. 统计每张表的实际占用空间大小情况(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)
SELECT 
table_name ,
AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH
FROM information_schema.tables;

-- 5. 统计每个库的空间使用情况大小情况
SELECT 
table_schema,
SUM(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)/1024/1024  AS total_mb
FROM information_schema.tables
GROUP BY table_schema

-- 6. 对MySQL的数据库进行分库分表备份
-- mysqldump -uroot -p123  world city >/backup/world_city.sql
SELECT CONCAT("mysqldump -uroot -p123456 ",table_schema ," ",table_name ," >/backup/",table_schema,
"_",table_name,".sql")
FROM information_schema.tables INTO OUTFILE \'/tmp/bak1.sql\';

-- 7. 模仿模板语句,批量生成对world数据库下的表操作的语句
-- alter table world.city discard tablespace;
SELECT CONCAT("alter table ",table_schema,".",table_name," discard tablespace;")
FROM information_schema.tables
WHERE table_schema=\'world\'
INTO OUTFILE \'/tmp/discard.sql\';

以上是关于第三章 SQL语言元素(一)的主要内容,如果未能解决你的问题,请参考以下文章

第三章 关系数据库语言 SQL 总结

Web前端开发笔记——第三章 CSS语言 第六节 CSS定位

Web前端开发笔记——第三章 CSS语言 第五节 盒子模型

第三章 - SQL基础及元数据获取

第三章: 简单Sql语句介绍

第三章 PL/SQL编程