学习mysql必备工具即安装mysql客户端;mysql安装教程在网上有很多,在此处就不在仔细说明;

下面将仔细介绍一下关于SQL语句:

SQL语句:结构化查询语言(Structured Query Language)

SQL语法
1. SQL语句可以在单行或多行书写,以分号结尾
2. 可使用空格和缩进来增强语句的可读性
3. MySQL不区别大小写,建议使用大写

SQL语句分类:
1. DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
  > 创建、删除、修改:库、表结构!!!
2. DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
  > 增、删、改:表记录
3. DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
4. DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
ddl:数据库或表的结构操作
dml:对表的记录进行更新(增、删、改)
dql:对表的记录的查询
dcl:对用户的创建,及授权!

了解Sql语句的分类以后,下面我们将仔细总结一下关于DDL的使用:

从宏观的层面我们先介绍基于数据库的操作:

*查看所有数据库:SHOW DATABASES
* 切换(选择要操作的)数据库:USE 数据库名
* 创建数据库:CREATE DATABASE [IF NOT EXISTS] mydb1 [CHARSET=utf8]
* 删除数据库:DROP DATABASE [IF EXISTS] mydb1
* 修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8

-- 首先先进行查询数据库,下面是我的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bookstore |
| bos |
| category |
| chatroom |
| crm |
| dangdang | |
| maven |
| mmall |
| mybaits |
| mysql |
| o2o |
| performance_schema |
| registersystem |
| spring6 |
| spring_day03 |
| springmvc |
+--------------------+
29 rows in set (0.53 sec) --创建数据库Sql语句
mysql> create database if not exists mydb1 charset=utf8;
Query OK, 1 row affected (0.04 sec) -- 删除数据库的SQL语句
mysql> drop database mydb1;
Query OK, 0 rows affected (0.24 sec) -- 确认数据库是否删除
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bookstore |
| bos |
| category |
| chatroom |
| crm |
| dangdang |
| maven |
| mmall |
| mybaits |
| mysql |
| o2o |
| performance_schema |
| registersystem |
| spring6 |
| spring_day03 |
| springmvc |
+--------------------+
29 rows in set (0.00 sec)

2. 数据类型(列类型)

int:整型
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
decimal:浮点型,在表单钱方面使用该类型,因为不会出现精度缺失问题;
char:固定长度字符串类型; char(255),数据的长度不足指定长度,补足到指定长度!
varchar:可变长度字符串类型; varchar(65535), zhangSan
text(clob):字符串类型;
  > 很小
  > 小
  > 中
  > 大
blob:字节类型;
  > 很小
  > 小
  > 中
  > 大
date:日期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳类型;

对表操作的语法格式和案例:

语法:


* 创建表:
  CREATE TABLE [IF NOT EXISTS] 表名(ITCAST_0001
    列名 列类型,
    列名 列类型,
    ...
    列名 列类型
  );
* 查看当前数据库中所有表名称:SHOW TABLES;
* 查看指定表的创建语句:SHOW CREATE TABLE 表名(了解);
* 查看表结构:DESC 表名;
* 删除表:DROP TABLE 表名;
* 修改表:前缀:ALTER TABLE 表名
  > 修改之添加列:
    ALTER TABLE 表名 ADD (
      列名 列类型,
      列名 列类型,
      ...
    );
  > 修改之修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据):ALTER TABLE 表名 MODIFY 列名 列类型;
  > 修改之修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
  > 修改之删除列:ALTER TABLE 表名 DROP 列名;
  > 修改表名称:ALTER TABLE 原表名 RENAME TO 新表名;

//创建表
mysql> create table tb_stu(
-> number char(10),
-> name varchar(50),
-> age int,
-> gender varchar(10)
-> );
Query OK, 0 rows affected (0.24 sec) -- 查看表
mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| tb_stu |
+----------------+
1 row in set (0.00 sec) -- 查看表结构
mysql> desc tb_stu;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| number | char(10) | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| gender | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.08 sec) -- 添加表的字段
mysql> alter table tb_stu
-> add(
-> education varchar(50)
-> );
Query OK, 0 rows affected (0.30 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| tb_stu |
+----------------+
1 row in set (0.00 sec) mysql> desc tb_stu;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| number | char(10) | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| gender | varchar(10) | YES | | NULL | |
| education | varchar(50) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
5 rows in set (0.02 sec) -- 修改表的字段信息
mysql> alter table tb_stu
-> modify education varchar(30);
Query OK, 0 rows affected (0.31 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> desc tb_stu;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| number | char(10) | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| gender | varchar(10) | YES | | NULL | |
| education | varchar(30) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
5 rows in set (0.02 sec) -- 删除表的字段
mysql> alter table tb_stu
-> drop education;
Query OK, 0 rows affected (0.31 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> desc tb_stu;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| number | char(10) | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| gender | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.02 sec) --修改表的名称
mysql> alter table tb_stu
-> rename to tb_student;
Query OK, 0 rows affected (0.07 sec) mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| tb_student |
+----------------+
1 row in set (0.00 sec)

DML(数据操作语言,它是对表记录的操作(增、删、改)!)

1. 插入数据
* INTERT INTO 表名(列名1,列名2, ...) VALUES(列值1, 列值2, ...);
  > 在表名后给出要插入的列名,其他没有指定的列等同与插入null值。所以插入记录总是插入一行,不可能是半行。
  > 在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应
* INTERT INTO 表名 VALUES(列值1, 列值2)
  > 没有给出要插入的列,那么表示插入所有列。
  > 值的个数必须是该表列的个数。
  > 值的顺序,必须与表创建时给出的列的顺序相同。

2. 修改数据
* UPDATE 表名 SET 列名1=列值1, 列名2=列值2, ... [WHERE 条件]
* 条件(条件可选的):
  > 条件必须是一个boolean类型的值或表达式:UPDATE t_person SET gender='男', age=age+1 WHERE sid='1';
  > 运算符:=、!=、<>、>、<、>=、<=、BETWEEN...AND、IN(...)、IS NULL、NOT、OR、AND

DCL

* 一个项目创建一个用户!一个项目对应的数据库只有一个!
* 这个用户只能对这个数据库有权限,其他数据库你就操作不了了!

1. 创建用户
  * CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';
    > 用户只能在指定的IP地址上登录
  * CREATE USER 用户名@'%' IDENTIFIED BY '密码';
    > 用户可以在任意IP地址上登录

2. 给用户授权
  * GRANT 权限1, … , 权限n ON 数据库.* TO 用户名@IP地址
    > 权限、用户、数据库
    > 给用户分派在指定的数据库上的指定的权限
    > 例如;GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
      * 给user1用户分派在mydb1数据库上的create、alter、drop、insert、update、delete、select权限
  * GRANT ALL ON 数据库.* TO 用户名@IP地址;
    > 给用户分派指定数据库上的所有权限

3. 撤销授权
  * REVOKE 权限1, … , 权限n ON 数据库.* FROM 用户名@IP地址;
    > 撤消指定用户在指定数据库上的指定权限
    > 例如;REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
      * 撤消user1用户在mydb1数据库上的create、alter、drop权限

4. 查看权限
  * SHOW GRANTS FOR 用户名@IP地址
    > 查看指定用户的权限

5. 删除用户
  * DROP USER 用户名@IP地址

*****DQL -- 数据查询语言
  查询不会修改数据库表记录!

一、 基本查询

1. 字段(列)控制
1) 查询所有列
 SELECT * FROM 表名;
 SELECT * FROM emp;
 --> 其中“*”表示查询所有列

2) 查询指定列
 SELECT 列1 [, 列2, ... 列N] FROM 表名;
 SELECT empno, ename, sal, comm FROM 表名;

3) 完全重复的记录只一次
 当查询结果中的多行记录一模一样时,只显示一行。一般查询所有列时很少会有这种情况,但只查询一列(或几列)时,这总可能就大了!
 SELECT DISTINCT * | 列1 [, 列2, ... 列N] FROM 表名;
 SELECT DISTINCT sal FROM emp;
 --> 保查询员工表的工资,如果存在相同的工资只显示一次!

4) 列运算
 I 数量类型的列可以做加、减、乘、除运算
   SELECT sal*1.5 FROM emp;
   SELECT sal+comm FROM emp;

II 字符串类型可以做连续运算
   SELECT CONCAT('$', sal) FROM emp;

III 转换NULL值
   有时需要把NULL转换成其它值,例如com+1000时,如果com列存在NULL值,那么NULL+1000还是NULL,而我们这时希望把NULL当前0来运算。
   SELECT IFNULL(comm, 0)+1000 FROM emp;
   --> IFNULL(comm, 0):如果comm中存在NULL值,那么当成0来运算。

IV 给列起别名
   你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了
   SELECT IFNULL(comm, 0)+1000 AS 奖金 FROM emp;
   --> 其中AS可以省略

2. 条件控制
1) 条件查询
  与前面介绍的UPDATE和DELETE语句一样,SELECT语句也可以使用WHERE子句来控制记录。
  * SELECT empno,ename,sal,comm FROM emp WHERE sal > 10000 AND comm IS NOT NULL;
  * SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000;
  * SELECT empno,ename,job FROM emp WHERE job IN ('经理', '董事长');
2) 模糊查询
  当你想查询姓张,并且姓名一共两个字的员工时,这时就可以使用模糊查询
  * SELECT * FROM emp WHERE ename LIKE '张_';
  --> 模糊查询需要使用运算符:LIKE,其中_匹配一个任意字符,注意,只匹配一个字符而不是多个。
  --> 上面语句查询的是姓张,名字由两个字组成的员工。
  * SELECT * FROM emp WHERE ename LIKE '___'; /*姓名由3个字组成的员工*/

如果我们想查询姓张,名字几个字可以的员工时就要使用“%”了。
  SELECT * FROM emp WHERE ename LIKE '张%';
  --> 其中%匹配0~N个任意字符,所以上面语句查询的是姓张的所有员工。
  SELECT * FROM emp WHERE ename LIKE '%阿%';
  --> 千万不要认为上面语句是在查询姓名中间带有阿字的员工,因为%匹配0~N个字符,所以姓名以阿开头和结尾的员工也都会查询到。
  SELECT * FROM emp WHERE ename LIKE '%';
  --> 这个条件等同与不存在,但如果姓名为NULL的查询不出来!

二、排序
1) 升序
  SELECT * FROM WHERE emp ORDER BY sal ASC;
  --> 按sal排序,升序!
  --> 其中ASC是可以省略的
2) 降序
  SELECT * FROM WHERE emp ORDER BY comm DESC;
  --> 按comm排序,降序!
  --> 其中DESC不能省略
3) 使用多列作为排序条件
  SELECT * FROM WHERE emp ORDER BY sal ASC, comm DESC;
  --> 使用sal升序排,如果sal相同时,使用comm的降序排

三、聚合函数
  聚合函数用来做某列的纵向运算。
1) COUNT
  SELECT COUNT(*) FROM emp;
  --> 计算emp表中所有列都不为NULL的记录的行数
  SELECT COUNT(comm) FROM emp;
  --> 云计算emp表中comm列不为NULL的记录的行数
2) MAX
  SELECT MAX(sal) FROM emp;
  --> 查询最高工资
3) MIN
  SELECT MIN(sal) FROM emp;
  --> 查询最低工资
4) SUM
  SELECT SUM(sal) FROM emp;
  --> 查询工资合
5) AVG
  SELECT AVG(sal) FROM emp;
  --> 查询平均工资

四、分组查询
  分组查询是把记录使用某一列进行分组,然后查询组信息。
  例如:查看所有部门的记录数。
  SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
  --> 使用deptno分组,查询部门编号和每个部门的记录数
  SELECT job, MAX(SAL) FROM emp GROUP BY job;
  --> 使用job分组,查询每种工作的最高工资

组条件
  以部门分组,查询每组记录数。条件为记录数大于3
  SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;

五、limit子句(方言)
  LIMIT用来限定查询结果的起始行,以及总行数。
  例如:查询起始行为第5行,一共查询3行记录
  SELECT * FROM emp LIMIT 4, 3;
  --> 其中4表示从第5行开始,其中3表示一共查询3行。即第5、6、7行记录。

约束
* 约束是添加在列上的,用来约束列的!

1. 主键约束(唯一标识)
  ****非空***
  ****唯一***
  ****被引用****(学习外键时)

* 当表的某一列被指定为主键后,该列就不能为空,不能有重复值出现。
  * 创建表时指定主键的两种方式:
    >
    CREATE TABLE stu(
    sid        CHAR(6) PRIMARY KEY,
    sname    VARCHAR(20),
    age        INT,
    gender    VARCHAR(10)
    );
    指定sid列为主键列,即为sid列添加主键约束
    >
    CREATE TABLE stu(
    sid        CHAR(6),
    sname    VARCHAR(20),
    age        INT,
    gender    VARCHAR(10),
    PRIMARY KEY(sid)
    );
    指定sid列为主键列,即为sid列添加主键约束
  * 修改表时指定主键:ALTER TABLE stu ADD PRIMARY KEY(sid);
  * 删除主键:ALTER TABLE stu DROP PRIMARY KEY;

2. 主键自增长
  * 因为主键列的特性是:必须唯一、不能为空,所以我们通常会指定主键类为整型,然后设置其自动增长,这样可以保证在插入数据时主键列的唯一和非空特性。
  * 创建表时指定主键自增长
  CREATE TABLE stu(
        sid INT PRIMARY KEY AUTO_INCREMENT,
        sname    VARCHAR(20),
        age        INT,
        gender    VARCHAR(10)
  );
  * 修改表时设置主键自增长:ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
  * 修改表时删除主键自增长:ALTER TABLE stu CHANGE sid sid INT;
  * 测试主键自增长:
    > INSERT INTO stu VALUES(NULL, 'zhangSan',23,'male');
    > INSERT INTO stu(sname,age,gender) VALUES('zhangSan',23,'male');

3. 非空约束
  * 因为某些列不能设置为NULL值,所以可以对列添加非空约束。
  * 例如:
  CREATE TABLE stu(
        sid INT PRIMARY KEY AUTO_INCREMENT,
        sname    VARCHAR(20) NOT NULL,
        age        INT,
        gender    VARCHAR(10)
  );
  * 对sname列设置了非空约束

4. 唯一约束
  * 车库某些列不能设置重复的值,所以可以对列添加唯一约束。
  * 例如:
  CREATE TABLE stu(
        sid INT PRIMARY KEY AUTO_INCREMENT,
        sname    VARCHAR(20) NOT NULL UNIQUE,
        age        INT,
        gender    VARCHAR(10)
  );
  * 对sname列设置了非空约束

5. 概念模型

对象模型:可以双向关联,而且引用的是对象,而不是一个主键!
关系模型:只能多方引用一方,而且引用的只是主键,而不是一整行记录。

对象模型:在java中是domain!!!例如:User、Student
is a
has a(关联)
  > 1对1
  > 1对多
  > 多对多
use a

关系模型:在数据库中表!!!

当我们要完成一个软件系统时,需要把系统中的实体抽取出来,形成概念模型。
  例如部门、员工都是系统中的实体。概念模型中的实体最终会成为Java中的类、数据库中表。
  实体之间还存在着关系,关系有三种:
  * 1对多:例如每个员工都从属一个部门,而一个部门可以有多个员工,其中员工是多方,而部门是一方。
  * 1对1:例如老公和老婆就是一对一的关系,一个老公只能有一个老婆,而一个老婆只能有一个老公。
  * 多对多:老师与学生的关系就是多对多,一个老师可以有多个学生,一个学生可以有多个老师。

概念模型在Java中成为实体类(javaBean)
  类就使用成员变量来完成关系,一般都是双向关联!
  多对一双向中关联,即员工关联部门,部门也关联员工
  class Employee {//多方关联一方
     ...
     private Department department;
  }
  class Department {//一方关联多方
     ...
     private List<Employee> employees;
  }

class Husband {
     ...
     private Wife wife;
  }
  class Wife {
     ...
     private Husband
  }

class Student {
     ...
     private List<Teacher> teachers
  }
  class Teacher {
     ...
     private List<Student> students;
  }

6. 外键约束
  * 外键必须是另一表的主键的值(外键要引用主键!)
  * 外键可以重复
  * 外键可以为空
  * 一张表中可以有多个外键!

概念模型在数据库中成为表
  数据库表中的多对一关系,只需要在多方使用一个独立的列来引用1方的主键即可
  /*员工表*/
  create talbe emp (
    empno int primary key,/*员工编号*/
    ...
    deptno int/*所属部门的编号*/
  );
  /*部门表*/
  create table dept (
    deptno int  primary key,/*部门编号*/
    ...
  );
  emp表中的deptno列的值表示当前员工所从属的部门编号。也就是说emp.deptno必须在dept表中是真实存在!
  但是我们必须要去对它进行约束,不然可能会出现员工所属的部门编号是不存在的。这种约束就是外键约束。
  我们需要给emp.deptno添加外键约束,约束它的值必须在dept.deptno中存在。外键必须是另一个表的主键!

语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键)
  创建表时指定外键约束
  create talbe emp (
    empno int primary key,
    ...
    deptno int,
    CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)  
  );

修改表时添加外键约束
  ALERT TABLE emp
  ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);

修改表时删除外键约束
  ALTER TABLE emp
  DROP FOREIGN KEY fk_emp_deptno;/*约束名称*/
 
7. 数据库一对一关系
  在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。
  create table husband(
    hid int PRIMARY KEY,
    ...
  );
  create table wife(
    wid int PRIMARY KEY,
    ...
    ADD CONSTRAINT fk_wife_wid FOREIGN KEY(wid) REFERENCES husband(hid)
  );
  其中wife表的wid即是主键,又是相对husband表的外键!
  husband.hid是主键,不能重复!
  wife.wid是主键,不能重复,又是外键,必须来自husband.hid。
  所以如果在wife表中有一条记录的wid为1,那么wife表中的其他记录的wid就不能再是1了,因为它是主键。
  同时在husband.hid中必须存在1这个值,因为wid是外键。这就完成了一对一关系。

*****从表的主键即是外键!

8. 数据库多对多关系
  在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。
  create table student(
    sid int PRIMARY KEY,
    ...
  );
  create table teacher(
    tid int PRIMARY KEY,
    ...
  );

create table stu_tea(
    sid int,
    tid int,
    ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),
    ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)
  );
  这时在stu_tea这个中间表中的每条记录都是来说明student和teacher表的关系
  例如在stu_tea表中的记录:sid为1001,tid为2001,这说明编号为1001的学生有一个编号为2001的老师
  sid    tid
  101    201 /*编号为101的学生有一个编号为201的老师*/
  101    202 /*编号为101的学生有一个编号为202的老师*/
  101    203 /*编号为101的学生有一个编号为203的老师*/
  102    201 /*编号为102的学生有一个编号为201的老师*/
  102    204 /*编号为102的学生有一个编号为204的老师*/
select *
from emp, dept, (select * from emp)
where
group by
having
order by
limit

多表查询
  1. 分类:
    * 合并结果集(了解)
    * 连接查询
    * 子查询

合并结果集
  * 要求被合并的表中,列的类型和列数相同
  * UNION,去除重复行
  * UNION ALL,不去除重复行

SELECT * FROM cd
UNION ALL
SELECT * FROM ab;

连接查询
  1. 分类
    * 内连接
    * 外连接
      > 左外连接
      > 右外连接
      > 全外连接(MySQL不支持)
    * 自然连接(属于一种简化方式)

2. 内连接
    * 方言:SELECT * FROM 表1 别名1, 表2 别名2 WHERE 别名1.xx=别名2.xx
    * 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
    * 自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2
    * 内连接查询出的所有记录都满足条件。
 
  3. 外连接
    * 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      > 左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL
    * 左外自然:SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
    * 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      > 右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表不满足条件的记录,其左表部分都为NULL
    * 右外自然:SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
    * 全链接:可以使用UNION来完成全链接

子查询
  :查询中有查询(查看select关键字的个数!)
  1. 出现的位置:
    * where后作为条件存在
    * from后作为表存在(多行多列)

2. 条件
    * (***)单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件)
    * (**)多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件)
    * (*)单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件)
    * (***)多行多列:SELECT * FROM 表1 别名1 , (SELECT ....) 别名2 WHERE 条件

mysql系列一的更多相关文章

  1. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  2. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  3. MySQL 系列(二) 你不知道的数据库操作

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...

  4. MySQL 系列(五) 多实例、高可用生产环境实战

    MySQL 系列(五) 多实例.高可用生产环境实战   第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 史上最屌.你不知道的数据库操作 第三 ...

  5. 屌炸天实战 MySQL 系列教程(二) 史上最屌、你不知道的数据库操作

    此篇写MySQL中最基础,也是最重要的操作! 第一篇:屌炸天实战 MySQL 系列教程(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:屌炸天实战 MySQL 系列教程(二) 史上最屌.你不 ...

  6. MySQL系列(一)--基础知识大总结

    MySQL系列(一)---基础知识大总结 前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里只是作为简单的介绍,但是具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续 ...

  7. MySQL系列(二)---MySQL事务

    MySql 事务 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 什么是事务(transaction) 保证成批操作要么完全执行,要么完全不执行,维护数据的完整性.也 ...

  8. MySQL系列(三)---索引

    MySQL系列(三)---索引 前言:如果有疏忽或理解不当的地方,请指正. 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 MySQL系列(三):索引 什么是索引 如 ...

  9. MySQL系列(四)---引擎

    MySql中的引擎 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 MySQL系列(三):索引 引擎种类 FEDERATED MRG_MYISAM MyISAM BL ...

  10. MySQL系列(五)---总结MySQL中的锁

    MySQL中的锁 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 MySQL系列(三):索引 MySQL系列(四):引擎 概述 MyISAM支持表锁,InnoDB支持 ...

随机推荐

  1. Linux ARP代理 与 NAT

    有时候我们会在一个已有网络(10.10.10.0/24)内组建一个实验网络(192.168.1.0/24),网络结构如上图所示. 假设我们不能控制(修改)A网络内除D主机以外的系统配置,但可以完全控制 ...

  2. PHP环境配置解释

    PHP中注释:#,//,/* */ 一.修改Apache配置 DocumentRoot  "G:\PHP"        //修改完需要重启Apache //以下二选一 ----- ...

  3. Web前端面试指导(九):盒子模型你是怎么理解的?

    问题分析 这道题问得比较宽泛,一定要找准切入点,如果切入点找不准,很容易乱答,甚至答偏,所以找准切入点是非常的重要的. 解答思路 1)盒子模型有两种,W3C和IE盒子模型 (1)W3C定义的盒子模型包 ...

  4. CSS快速入门

    一.概述 层叠样式表;可以对HTML的元素,进行控制,使HTML的元素展现的效果和位置更好; 二.基本语法 css规则由两个部分构成:选择器和语句 语句规则: 1.css选择器的名称区分大小写;属性名 ...

  5. Microsoft Fluent Design System

    转载自:http://www.ui.cn/detail/131217.html 就在刚刚举办的 Microsoft Build 2017 中,微软对外公布了它们最新的设计语言--"Fluen ...

  6. PrintDocument打印、预览、打印机设置和打印属性的方法(较完整) .

    private void Form1_Load(object sender, System.EventArgs e) { //获取或设置一个值,该值指示是否发送到文件或端口 printDocument ...

  7. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  8. php调用含有命名空间的类

    现有a.php 和 b.php在同一个目录下 a.php中 namespace myspace; class A{ __construct(){} .... } b.php中调用类A require_ ...

  9. 【面试虐菜】—— 常用SQL语句

    创建表 create table emp( id decimal, name ), age decimal) 删除表 DROP TABLE EMP 插入默认值 CREATE TABLE EMP( Id ...

  10. Fiori Launchpad Tile点击后跳转的调试技巧

    在SAP Fiori launchpad 里点击某个tile之后,后台会计算出跳转的目标url返回给前台. 下图中一个个白色的方框就成为tile.每个tile点击之后,会打开一个对应的Fiori应用. ...