一、数据类型
数据类型的作用:
比较方式:排序方式
存储空间:取值范围
参与的运算:
1、字符型:
char(N):固定长度,N指字符数,不区分大小写,最多支持255个字符
varchar(N):可变长度,需要结束符,结束符最少占据一个空间。N指最大字符数,不区分大小写,最多支持65535个字符
binary(N):区分大小写
varbinary(N):区分大小写
text(N):tinytext,text,mediumtext,longtext 大段文本,不区分大小写
blob(N):tinyblob,blob,mediumblob,longblob 大段文本,区分大小写
2、数值型:
1)精确数值型:
int(整形):tinyint(微,1B),smallint(小,2B),mediumint(中,3B),int(4B),bigint(大,4B)
decimal(十进制):
2)近似数值型:
浮点型:
float:单精度
double:双精度
3、日期时间型:
date,3B
time,3B
datetime,8B
timestamp:时间戳
year(2),year(4)
4、布尔型:1|0
5、 NULL:
6、内置类型:
ENUM:枚举型(一定范围内挑一个,字符型) 也属于字符型
SET:集合型(集合内字符任意组合,不能使用集合外的字符) 也属于字符型
二、mysql使用
1、客户端命令:命令在客户端执行,不需要命令终止符,通常默认为分号“;”
\q|quit|exit
\?|?|h|help
\g:把命令发送给服务器端执行,相当于“;”
\G:把行分段显示
\c:取消命令执行
mysql> SELECT user,host,password from mysql.user\g
+------+------------+-------------------------------------------+
| user | host | password |
+------+------------+-------------------------------------------+
| root | localhost | *CC67043C7BCFF5EEA5566BD9B1F3C74FD9A5CF5D |
| root | BAIYU\_179 | |
| root | 127.0.0.1 | *CC67043C7BCFF5EEA5566BD9B1F3C74FD9A5CF5D |
| | BAIYU\_179 | |
+------+------------+-------------------------------------------+
4 rows in set (0.00 sec)
mysql> SELECT user,host,password from mysql.user\G
*************************** 1. row ***************************
user: root
host: localhost
password: *CC67043C7BCFF5EEA5566BD9B1F3C74FD9A5CF5D
*************************** 2. row ***************************
user: root
host: BAIYU\_179
password:
*************************** 3. row ***************************
user: root
host: 127.0.0.1
password: *CC67043C7BCFF5EEA5566BD9B1F3C74FD9A5CF5D
*************************** 4. row ***************************
user:
host: BAIYU\_179
password:
4 rows in set (0.00 sec)
2、服务器端命令:命令发送到服务器端执行
BIF:内建函数
SELECT BIF();
选取(选部分行)和投影(选部分列)
select col1,col2,...from tb1,tb2,...where clause;
where col1 > 30;
SHOW DATABASES; 显示有权限查看的所有库
USE database_name:使用某库
SHOW TABLES; 显示其库所有表
CREATE DATABASE database_name;创建库
DROP DATABASE database_name;删除某库
mysql> SELECT CURRENT_TIME();
+----------------+
| CURRENT_TIME() |
+----------------+
| 00:10:18 |
+----------------+
1 row in set (0.00 sec)
命令帮助的获取:mysql> help KEYWORD
命令不区分字符大小写(建议大写),但与文件系统相关的部分是否区分大小写根据OS
3、mysql使用:
交互模式:
非交互|批处理模式:
[root@BAIYU_179 ~]# mysql -uroot -p123456789 -e 'SELECT USER();'
+----------------+
| USER() |
+----------------+
| root@localhost |
+----------------+
[root@BAIYU_179 ~]# echo -e "SHOW DATABASES;\nCREATE DATABASE testdb;\nSHOW DAT
ABASES;" > a.sql
[root@BAIYU_179 ~]# mysql -uroot -p123456789 < a.sql
Database
information_schema
mysql
performance_schema
test
Database
information_schema
mysql
performance_schema
test
testdb
4、键:key
约束:constraint
主键约束:对一张表来讲,主键只能有一个,主键数据不能相同,主键不能为空(NULL)
唯一键约束:可以为NULL,可以有多个
外键约束:
检查式约束:用户自定义有效取值范围
键:就是选取出来的字段
主键:能唯一标识表中每一个记录的字段或字段的组合
候选键:能作为主键的字段,
5、表:table
由行和列组成的二维关系
字段:字段名,约束,字段类型
创建表:
CREATE TABLE table_name(col1_name col1_type 修饰符,col2 col2_type 修饰符...);
删除表:
DROP TABLE table_name;
字段或字段类型还可以有修饰符:
NOT NULL:不能为空
NULL:可为空
UNSIGNED:无符号,无负值
DEFAULT 'STRING': 默认值
AUTO_INCREMENT:自动增长类型的字段必须为主键或唯一键
PRIMARY KEY:主键,如何把多个字段定义为主键则用括号把多个字段括起来在后面加PRIMARY KEY
字符要加上引号,数值不能加引号
show character set 字符集
show collation 字符集的排序方式
character set ' ':使用的字符集
collation:使用的排序规则
mysql> CREATE TABLE students(name varchar(30),age tinyint,gender ENUM('f','m'))
;
Query OK, 0 rows affected (0.02 sec)
mysql> DESCRIBE students;
+--------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| name | varchar(30) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| gender | enum('f','m') | YES | | NULL | |
+--------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> DROP TABLE students;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW TABLES;
Empty set (0.00 sec)
mysql> CREATE TABLE students(name varchar(30) NOT NULL,age tinyint UNSIGNED NOT
NULL,gender ENUM('F','M') DEFAULT 'M');
Query OK, 0 rows affected (0.00 sec)
mysql> DESC students;
+--------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| name | varchar(30) | NO | | NULL | |
| age | tinyint(3) unsigned | NO | | NULL | |
| gender | enum('F','M') | YES | | M | |
+--------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> CREATE TABLE students(stuID int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY
KEY, name varchar(30) NOT NULL,age tinyint UNSIGNED NOT NULL,gender ENUM('F','
M') NOT NULL DEFAULT 'M');
Query OK, 0 rows affected (0.01 sec)
mysql> DESC students;
+--------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+----------------+
| stuID | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(30) | NO | | NULL | |
| age | tinyint(3) unsigned | NO | | NULL | |
| gender | enum('F','M') | NO | | M | |
+--------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
6、数据
插入:
INSERT INTO table_name (col1,col2,...) value|values(val1,val2,...)
INSERT INTO table_name VALUES(val1,val2,...)
mysql> INSERT INTO students values(1,'xj',25,'M');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM students;
+-------+------+-----+--------+
| stuID | name | age | gender |
+-------+------+-----+--------+
| 1 | xj | 25 | M |
+-------+------+-----+--------+
1 row in set (0.00 sec)
mysql> INSERT INTO students values(2,'xxj',23,'M'),(3,'xiexiaojun',24,'M');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM students;
+-------+------------+-----+--------+
| stuID | name | age | gender |
+-------+------------+-----+--------+
| 1 | xj | 25 | M |
| 2 | xxj | 23 | M |
| 3 | xiexiaojun | 24 | M |
+-------+------------+-----+--------+
3 rows in set (0.00 sec)
mysql> INSERT INTO students(name,gender) value('xx','M'),('xiexie','F');
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 1
mysql> SELECT * FROM students;
+-------+------------+-----+--------+
| stuID | name | age | gender |
+-------+------------+-----+--------+
| 1 | xj | 25 | M |
| 2 | xxj | 23 | M |
| 3 | xiexiaojun | 24 | M |
| 4 | xx | 0 | M |
| 5 | xiexie | 0 | F |
+-------+------------+-----+--------+
5 rows in set (0.00 sec)
查询:
SELECT col1,col2,... FROM table_name WHERE 条件表达式;
SELECT * FROM table_name;
条件表达式:
=,>,<,>=,<
like(通配符):
%:任意长度的任意字符
_:匹配任意单个字符
rlink:正则表达式
组合条件:
and
or
not
mysql> SELECT name,age,gender FROM students WHERE age>20;
+------------+-----+--------+
| name | age | gender |
+------------+-----+--------+
| xj | 25 | M |
| xxj | 23 | M |
| xiexiaojun | 24 | M |
+------------+-----+--------+
3 rows in set (0.00 sec)
mysql> SELECT name,age,gender FROM students WHERE gender=F;
ERROR 1054 (42S22): Unknown column 'F' in 'where clause'
mysql> SELECT name,age,gender FROM students WHERE gender='F';
+--------+-----+--------+
| name | age | gender |
+--------+-----+--------+
| xiexie | 0 | F |
+--------+-----+--------+
1 row in set (0.00 sec)
mysql> SELECT name,age,gender FROM students WHERE age<25 AND gender='F';
+--------+-----+--------+
| name | age | gender |
+--------+-----+--------+
| xiexie | 0 | F |
+--------+-----+--------+
1 row in set (0.00 sec)
删除:
DELETE FROM table_name;
DELETE FORM table_name WHERE 条件表达式;
mysql> DELETE FROM students WHERE age<20;
Query OK, 2 rows affected (0.00 sec)
mysql> SELECT * FROM students;
+-------+------------+-----+--------+
| stuID | name | age | gender |
+-------+------------+-----+--------+
| 1 | xj | 25 | M |
| 2 | xxj | 23 | M |
| 3 | xiexiaojun | 24 | M |
+-------+------------+-----+--------+
3 rows in set (0.00 sec)
mysql> DELETE FROM students WHERE NAME LIKE '%o%';
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM students;
+-------+------+-----+--------+
| stuID | name | age | gender |
+-------+------+-----+--------+
| 1 | xj | 25 | M |
| 2 | xxj | 23 | M |
+-------+------+-----+--------+
2 rows in set (0.00 sec)
更新:
UPDATE table_name SET col1=values,col2=values,...;
UPDATE table_name SET col1=values,... WHERE 条件表达式;
mysql> UPDATE students SET age=30;
Query OK, 2 rows affected (0.02 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> SELECT * FROM students;
+-------+------+-----+--------+
| stuID | name | age | gender |
+-------+------+-----+--------+
| 1 | xj | 30 | M |
| 2 | xxj | 30 | M |
+-------+------+-----+--------+
2 rows in set (0.00 sec)
mysql> UPDATE students SET age=33 WHERE STUID=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM students;
+-------+------+-----+--------+
| stuID | name | age | gender |
+-------+------+-----+--------+
| 1 | xj | 33 | M |
| 2 | xxj | 30 | M |
+-------+------+-----+--------+
2 rows in set (0.00 sec)
7、查看类命令:
show crearte table tb_name;查询创建表时使用的命令
show engines;查询数据库支持的存储类型
show table status\G;查询当前数据库的存储类型
show table status like 's%'\G;查询某个表的存储类型
字符集:如何实现从字节编码(二进制)到为汉字的映射
GBK,GB2312,GB18030,UTF-8,big5
每种字符集可能存在多种不同的排序规则:
show character set 字符集
show collation 字符集的排序方式
character set ' ':使用的字符集
collation:使用的排序规则
默认会从数据库或表中就继承
8、Mysql服务器的工作特性的定义是通过服务器变量实现的:
show variables 查看服务器变量(默认查看的是session的变量)
show global variables 查看全局变量
show session variables 查看会话的变量
show variables like 'data%';
MySQL服务器运行中的状态是通过状态变量输出的:
show status:服务器运行状态
show global status 查看全局变量
show session status 查看会话的变量
三、SQL
ANSI SQL:SQL-86,SQL-89,SQL-92,SQL-99,SQL-03
DDL:数据定义语言(结构)
CREATE #在数据库中创建对象
DB组件:数据库、表、索引、视图、用户、存储过程、存储函数、触发器、事件调度器等
CREATE相关的常用命令:
CREATE DATABASE
CREATE EVENT
CREATE FUNCTION
CREATE FUNCTION UDF
CREATE INDEX
CREATE PROCEDURE
CREATE SERVER
CREATE TABLE
CREATE TABLESPACE
CREATE TRIGGER
CREATE USER
CREATE VIEW
ALTER #修改数据结构
DROP #删除对象
RENAME #重命名对象
DML:数据操作的语言 (内容)
INSERT #向一个表格中插入数据
UPDATE #更新一个表格中的已有数据
DELETE #删除表格中的数据
DCL:数据控制语言(权限)
GRANT #赋予一个用户对数据库或数据表格等制定权限
REVOKE #删除一个用户对数据库或数据表格等制定权限
DDL:
创建数据库:
CREATE DATABASE db_name;
CREATE DATABASE IF NOT EXISTS db_name;
删除数据库:DROP DATABASE db_name;
创建表:
CREATE TABLE tb_name(列1 数据类型 修饰符,列2 数据类型 修饰符,..列n 数据类型 修饰符);
查看库中的表;SHOW TABLES FROM db_name;
查看表的结构:DESC tables_name;
删除表:DROP TABLE tables_name;
修改表:ALTER TABLE tb_name MODIFY #改变字段属性
CHANGE #改变字段名称
ADD
DROP
例:ALTER TABLE students ADD course VARCHAR(20) NOT NULL;
ALTER TABLE students CHANGE course Course VARCHAR(10) AFTER Name;
DML:
INSERT INTO tb_name (col1,col2,...) VALUES|VALUE('STRING',NUM,...);
例:INSERT INTO students (Name,Age) VALUE ('LingHuChong',25),('Xiaolongnv',18);
例:INSERT INTO students VALUES ('Xiaoxiangzi', 'Hamagong', '55');
UPDATE tb_name SET column=value WHERE CONDITION;
例:UPDATE students SET Course='pixiejianfa';
UPDATE students SET Course='kuifabaodian' WHERE Name='Xiaoxiangzi';
#WHERE指定条件
选择:指定以某字段做为搜索码,与某值做逻辑比较,筛选符合条件的行。
投影:筛选符合条件的列
例: SELECT Name,Age From students WHERE Course='pixiejianf';
DELETE FROM tb_name WHERE CONDITION;#删除的是行
例:DELETE FROM students WHERE Course='kuifabaodi';
SELECT col1,col2 FROM tb_name WHERE CONDITION;
*:所有字段
WHERE:没有条件表示所有行
DCL:
CREATE USER 'USERNAME'@'HOST' IDENTIFIED BY 'PASSWORD'; 创建用户
DROP USER 'USERNAME'@'HOST'; 删除用户
HOST:
IP
HOSTNAME
NETWORK
通配符 _:匹配任意单个字符,172.16.0 _
%:匹配任意字符
例:jerry@'%'
GRANT pri1,pri2,... ON db_name.tb_name TO 'username'@'host' [IDENTIFIED BY 'PASSWORD'];
REVOKE pri1,pri2,... ON db_name.tb_name TO 'username'@'host';
SHOW GRANTS FOR 'username'@'host';查看用户权限
GRANT ALL PRIVILEGES ON test.* TO 'xiejun'@'%'; 赋予用户xiejun从任何主机登录并对数据库test下所有表具有全部权限
四、补充
1、sql_mode
SQL_MODE:定义Mysqld对约束等的响应行为
修改方式:
mysql> SET GLOBA sql_mode='MODE';
mysql> SET @@global.sq._mode='MODE';
需要修改权限,仅对修改后新创建的会话有效:对已建立的会话无效
mysql> SET [SEESION] sql_mode='MODE';
mysql> SET @@session.sql_mode='MODE';
常用MODE:TRADITIONAL, STRICT_TRANS_TABLES, or STRICT_ALL_TABLES
2、表
表:二维关系
设计表:遵循规范;
定义:字段,索引
字段:字段名,字段数据类型,修改符
约束,索引:应该创建在经常用作查询条件的字段上;
索引:实现级别在存储引擎;
分类:
稠密索引、稀疏索引
B+索引、hash索引、R树索引、FULLTEXT索引
聚集索引、非聚集索引
简单索引、组合索引
3、创建表:CREATE TABLE
(1) 直接创建;
(2) 通过查询现存的表创建;新表会被直接插入查询而来的数据;
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [partition_options] select_statement
(3) 通过复制现存的表的表结构创建;不复制数据;
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
注意:Storage Engine是指表类型,也即在表创建时指明其使用的存储引擎;同一个库中表要使用同一种存储引擎类型;
查看表结构:
DESCRIBE tbl_name;
查看表状态信息:
SHOW [FULL] TABLES [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr] 修改表:ALTER TABLE
删除表:DROP TABLE
4、MySQL基础
单进程多线程:
用户连接:连接线程
MySQL数据文件类型:
数据文件、索引文件
重做日志、撤消日志、二进制日志、错误日志、查询日志、慢查询日志、(中继日志)
DDL & DML:
索引管理:
按特定数据结构存储的数据;
索引类型:
聚集索引、非聚集索引:数据是否与索引存储在一起;
主键索引、辅助索引
稠密索引、稀疏索引:是否索引了每一个数据项;
B+ TREE、HASH、R TREE
简单索引、组合索引
左前缀索引
覆盖索引
管理索引的途径:
创建索引:创建表时指定;
CREATE INDEX 索引名 ON tablename;
ALTER TABLE tablename ADD INDEX(索引名);
创建或删除索引:修改表的命令
删除索引:DROP INDEX
查看表上的索引:
SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr]
EXPLAIN:能够分析查询语句执行过程中是否用到索引,以及是如何获取到数据的
视图:VIEW:虚表
创建方法:
CREATE
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
删除视图:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
视图中的数据事实上存储于“基表”中,因此,其修改操作也会针对基表实现;其修改操作受基表限制;
DML:
INSERT, DELETE, UPDATE, SELECT
INSERT:
一次插入一行或多行数据;
Syntax:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
INSERT tbl_name [(col1,...)] VALUES (val1,...), (val2,...)
Or:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
DELETE:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
注意:一定要有限制条件,否则将清空表中的所有数据;
限制条件:
WHERE
LIMIT
UPDATE:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
注意:一定要有限制条件,否则将修改所有行的指定字段;
限制条件:
WHERE
LIMIT
SELECT:
Query Cache:查询缓存
查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎;
SELECT语句的执行流程:
FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause (过滤)--> ORDER BY --> SELECT --> LIMIT
单表查询:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[SQL_CACHE | SQL_NO_CACHE]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[FOR UPDATE | LOCK IN SHARE MODE]
DISTINCT: 数据去重;
SQL_CACHE: 显式指定存储查询结果于缓存之中;
SQL_NO_CACHE: 显式查询结果不予缓存;
query_cache_type的值为'ON'时,查询缓存功能打开;
SELECT的结果符合缓存条件即会缓存,否则,不予缓存;
显式指定SQL_NO_CACHE,不予缓存;
query_cache_type的值为'DEMAND'时,查询缓存功能按需进行;
显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存;
字段显示可以使用别名:
col1 AS alias1, col2 AS alias2, ...
WHERE子句:指明过滤条件以实现“选择”的功能:
过滤条件:布尔型表达式;
算术操作符:+, -, *, /, %
比较操作符:=, !=, <>, <=>, >, >=, <, <=
BETWEEN min_num AND max_num
IN (element1, element2, ...) #多值等于,等于集合中的一个即可
IS NULL
IS NOT NULL
LIKE:
%: 任意长度的任意字符;
_:任意单个字符;
RLIKE:
REGEXP:匹配字符串可用正则表达式书写模式;
逻辑操作符:
NOT
AND
OR
XOR
GROUP:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算:
avg(), max(), min(), count(), sum()
例:
mysql> SELECT count(StuID) AS NOS,ClassessID FROM students GROUP BY ClassID;
HAVING: 对分组聚合运算后的结果指定过滤条件;
mysql> SELECT count(StuID) AS NOS,ClassessID FROM students GROUP BY ClassID HAVING NOS>2;
ORDER BY: 根据指定的字段对查询结果进行排序;
升序:ASC
降序:DESC
mysql> SELECT count(StuID) AS NOS,ClassessID FROM students GROUP BY ClassID HAVING NOS>2 ORDER BY Age DESC;
LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制;
对查询结果中的数据请求施加“锁”:
FOR UPDATE: 写锁,排他锁;
LOCK IN SHARE MODE: 读锁,共享锁
练习:导入hellodb.sql生成数据库
(1) 在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄;
(2) 以ClassID为分组依据,显示每组的平均年龄;
(3) 显示第2题中平均年龄大于30的分组及平均年龄;
(4) 显示以L开头的名字的同学的信息;
(5) 显示TeacherID非空的同学的相关信息;
(6) 以年龄排序后,显示年龄最大的前10位同学的信息;
(7) 查询年龄大于等于20岁,小于等于25岁的同学的信息;用三种方法;
多表查询:
交叉连接:笛卡尔乘积;
内连接:
等值连接:让表之间的字段以“等值”建立连接关系;
例:SELECT * FROM students,teachers WHERE students.TeacherID=teachers.TID;
不等值连接
自然连接
自连接
外连接:
左外连接:
FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
右外连接
FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
子查询:在查询语句嵌套着查询语句
基于某语句的查询结果再次进行的查询
用在WHERE子句中的子查询:
(1) 用于比较表达式中的子查询;子查询仅能返回单个值;
SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);
(2) 用于IN中的子查询:子查询应该单键查询并返回一个或多个值从构成列表;
SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
(3) 用于EXISTS;
用于FROM子句中的子查询;
使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
示例:
SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;
联合查询:UNION
SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;