show databases;:显示所有数据库

use test;:进入到test数据库中

show tables from information_schema;:显示information_schema数据库中的所有的表

select database();:查询当前在哪个数据库中(database()是mysql提供的函数)

desc student;:查询student表的表结构,如下图所示:

mysql一行拆分成多行 mysql一行转多行_mysql字符串分割成多列

select version();:查询数据库版本

mysql不区分大小写。建议关键字大写,表名、字段名小写。

注释:

    单行注释:#xxx 或者 -- xxx

    多行注释:/*xxx*/

select语句不仅可以查询表的字段,也可以查询常量值、表达式和函数等:

select 1;

select 'john';

select 1%2;

select version();

别名可以使查询结果便于理解;如果连表查询时有字段重名,可以使用别名进行区分。

起别名时AS关键字可省略。

别名中有特殊字符(如空格)时,需用双引号包裹。

mysql中的加号只作为运算符,不能用于拼接字符串。如果操作数中有字符串,mysql会自动尝试将字符串转为数字。如果转换失败,则转成0。如果操作数中有null,则结果为null。

mysql中&&和and等价。

mysql通配符:

    %:匹配任意多个字符,包括0个字符。

    _:任意单个字符。如果要将下划线当作普通字符使用,需进行转义,默认使用反斜杠进行转义,也可以临时指定一个转义符,如:

select * from student where name like '$_%' ESCAPE '$';

BETWEEN关键字指定的是闭区间。

IN关键字不支持通配符。

不能使用等于号判断字段是否为null,用is null。

<=>:安全等于,可以用于判断null。不建议使用,可读性差。

order by支持单个字段、多个字段、表达式、函数和别名。

mysql中字符串索引从1开始。

sum()、avg()、max()、min():忽略为null的值

count(字段名):忽略null值

count(*):如果一行中所有字段都为null,则忽略。

count(1):在表中插入一列,每一行的这一列的值都设为1,然后统计这一列的不为null的数量,其实就等价于查询表的行数。

在MYISAM引擎中,count(*)效率最高,因为引擎中存储了表的行数。

在INNODB引擎中,count(*)和count(1)的效率差不多,比count(字段)高。

where:在分组前筛选

having:在分组后筛选

1.内连接:

  1. 等值连接
  2. 非等值连接
  3. 自连接

2. 外连接:

  1. 左外连接
  2. 右外连接
  3. 全外连接

3. 交叉连接

等值连接:

select * 

from student , teacher 

where student.teacher_id = teacher.id;

先将student表的每一行与teacher表的每一行匹配,然后根据where条件过滤。如果student表中的行无法与teacher表的任意一行匹配,则过滤掉,所以内连接取的是两个表的交集。内连接时表的顺序可以任意。

mysql一行拆分成多行 mysql一行转多行_mysql一行拆分成多行_02

非等值连接:where条件不是等于。

自连接:连接的两张表是同一张表。

上例中的等值连接也可以这样写:

select * 

from student 

inner join teacher 

on student.teacher_id = teacher.id;

ta left join tb:ta是主表。

ta right join tb:tb是主表。

full outer join:全外连接。mysql貌似不支持。效果如下:

mysql一行拆分成多行 mysql一行转多行_mysql两个查询结果拼接_03

写法:

select *

from A

full outer join B

on A.xx = B.xx

cross join:交叉连接。输出笛卡尔乘积。

如果想达到如下效果:

mysql一行拆分成多行 mysql一行转多行_mysql一行拆分成多行_04

可以这样写:

select * 

from A

left join B

on A.xxx = B.xxx

where B.xxx  is null;

如果想达到如下效果:

mysql一行拆分成多行 mysql一行转多行_mysql字符串分割成多列_05

可以这样写:

select *

from A

full outer join B

on A.xx = B.xx

where A.xx is null or B.xx is null;

子查询可以出现在:

  1. select 后面
  2. from 后面
  3. where或having后面
  4. exists后面

按查询的结果集划分:

  1. 标量子查询(结果集只有一行一列)
  2. 列子查询(结果集只有一列,但有多行)
  3. 行子查询(结果集只有一行,但有多列)
  4. 表子查询(结果集有多行多列)

select 后面只支持标量子查询;

from后面只支持表子查询;

where或having后面支持标量子查询和列子查询、行子查询;

exists后面支持表子查询。