mysql从数据库表中查询的基本语句 -- select语句。

Select基本格式

SELECT
{* | <字段列名>}
[
FROM <表 1>, <表 2>…
[WHERE <表达式>
[GROUP BY <group by definition>
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
]

group by:查询数据按照指定字段分组。
order by:数据排序,升序-ASC,降序-DESC。
limit:查询条数。

去重distinct

select distinct <字段名> FROM <表名>;

设置别名as

xxx 原表名/列名 AS 别名 xxx;

设置字段别名

限制记录条数limit a,b

a-偏移量,b-返回数据数目,数据库的数据下标是从1开始的。

select * from tb_students_info LIMIT 3,5;

//从第四条数据开始,返回五条数据。

设置记录条数

排序order by

升序ASC为默认

SELECT name,height FROM tb_student_info ORDER BY height DESC,name ASC;

//先按height降序排列,再按name升序排列。

设置字段值显示顺序

子句 where 一个或多个表达式

子句

模糊查询Like

%-任何字符(包括空值),_-单个字符。

SELECT name FROM tb_students_info
    WHERE name LIKE 'T%'

//查询T开头的所有名字。

区间范围

between xxx and xxx

where 字段 between xxx and xxx;

子句

子查询 in

in + 子查询语句,判断一个定值是否存在子查询中。
exist + 子查询语句,用于判断子查询是否为空,不为空则返回true,否则返回false

SELECT name FROM tb_students_info
    -> WHERE dept_id IN
    -> (SELECT dept_id
    -> FROM tb_departments
    -> WHERE dept_type= 'A' );
SELECT * FROM tb_students_info
    -> WHERE EXISTS
    -> (SELECT dept_name
    -> FROM tb_departments
    -> WHERE dept_id=7);

分组查询Group by

结果按照列值进行逻辑分组,往往是在分组之后对数据再进行聚合操作
对于一个个人信息表,如果按照性别进行分组,就会有男性和女性两个分组,(使用表操作语句alter对需要的字段进行修改添加等操作)

分组查询

聚合函数

当数据分好组后就需要存在对于的函数进行操作

  • min(col):返回组中指定列的最小值
  • max(col):返回组中指定列的最大值
  • avg(col):返回指定列的平均值
  • count(col):返回列中非null值的个数
  • sum(col):返回指定列值和
  • group_concat(col):返回指定列的值

个数函数
列值函数

过滤条件hanving + 条件

数据进行分组后,使用having语句进行过滤操作

having 和 where的区别

  • 区别原理
    列值函数
  • having中可以使用别名
    列值函数
  • having可以使用统计函数
    列值函数

多表查询

多表查询:数据是从多个表中获得,查询语句就会涉及到多张表。
创建新表fisha_dep,并设置fisha_tb1的外键

 CREATE TABLE `fisha_dep` (
  `dep_id` int(11) NOT NULL AUTO_INCREMENT,
  `dep_name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`dep_id`)
) 
//fisha_tb1表中添加外键字段
alter table fisha_tb1 add column dep_id int(11);
//设置外键,外键名为dep_per,
alter table fisha_tb1 add constraint dep_per foreign key(dep_id) references fisha_dep(dep_id);
//设值
update fisha_tb1 set dep_id=1 where fisha_id in( 2,4);
update fisha_tb1 set dep_id=2 where fisha_id in( 1,3,5);

交叉连接 cross join

多个表间没有任何限制条件的连接称为交叉连接,而得到的结果集跟笛卡尔值一样
交叉连接

select * from fisha_tb1 cross join fisha_dep;
或者
select * from fisha_tb1,fisha_dep;

交叉连接
我暂时还不知道交叉连接在那里可以使用。

内连接 inner join

多个表中同时符合某条件的数据记录,跟交叉连接效果上相比,只多了限制条件。但是内连接是符合条件的数据记录组合。

select * from fisha_tb1 as a inner join fisha_dep as b on a.dep_id=b.dep_id and a.dep_id=1;
或者
select * from fisha_tb1 as a,fisha_dep as b where a.dep_id=b.dep_id and a.dep_id=1;

交叉连接

内连接也分为等值连接 不等值连接自连接,直观上就是有没有使用了等号

  • 上面例子中a.dep_id=b.dep_id就是等值连接
    不等值连接
  • 自连接
    连接的表为一张表,也就是自己连自己。

外连接 表a left/right outer join 表b on 条件

外连接分为左外连接右外连接,这里的左右是相对表而言的。

  • 左外连接 表a left outer join 表b on 条件
    会查出两个表中符合条件的数据记录,除此,还会显示左表中不符合条件的数据记录而对应右表的值就用null表示。
    左外连接

    select * from fisha_tb1 as a left outer join fisha_dep as b on a.dep_id > b.dep_id;

    左外连接

  • 右外连接 表a right outer join 表b on 条件
    右外连接意思跟左外连接一样,把左外连接中的表位置调换就相当于右外连接。

    select * from fisha_tb1 as a right outer join fisha_dep as b on a.dep_id > b.dep_id;
  • 例子
    select * from fisha_tb1 as a left outer join fisha_dep as b on a.dep_id = b.dep_id and b.dep_id is null;

    从代码可以看出两个表的限制条件关键是d.dep_id is null,而fisha_dep和fisha_tb1两个表中都没有条件符合,所有的dep_id都不为null。所以这时就只会输出左表 fish_tb1中dep_id不为空的数据记录。
    左外连接例子

联合查询 union

多个查询语句的结果集中放在一起,要求连接字使用的字段数量一致,重复的数据会合并为一条。

select 字段 from 表a union select 字段 from 表b;

全连接 full join

mysql中并不支持全连接,但是可以使用上面使用到的左右外连接和联合查询语句,来实现mysql的全连接。

select * from fisha_tb1 as a left outer join fisha_dep as b on a.dep_id = b.dep_id 
union 
select * from fisha_tb1 as a right outer join fisha_dep as b on a.dep_id = b.dep_id;

全连接

正则表达式查询

regexp

选项 说明 例子 匹配值示例
^ 匹配文本的开始字符 '^b' 匹配以字母 b 开头 的字符串 book、big、banana、 bike
$ 匹配文本的结束字符 'st$’ 匹配以 st 结尾的字 符串 test、resist、persist
. 匹配任何单个字符 'b.t’ 匹配任何 b 和 t 之间有一个字符 bit、bat、but、bite
* 匹配零个或多个在它前面的字符 'f*n’ 匹配字符 n 前面有 任意个字符 f fn、fan、faan、abcn
+ 匹配前面的字符 1 次或多次 'ba+’ 匹配以 b 开头,后 面至少紧跟一个 a ba、bay、bare、battle
<字符串> 匹配包含指定字符的文本 'fa’ fan、afa、faad
[字符集合] 匹配字符集合中的任何一个字符 '[xz]'匹配 x 或者 z dizzy、zebra、x-ray、 extra
[^] 匹配不在括号中的任何字符 '[^abc]’ 匹配任何不包 含 a、b 或 c 的字符串 desk、fox、f8ke
字符串{n,} 匹配前面的字符串至少 n 次 b{2} 匹配 2 个或更多 的 b bbb、 bbbb、 bbbbbbb
字符串{n,m} 匹配前面的字符串至少 n 次, 至多 m 次 b{2,4} 匹配最少 2 个, 最多 4 个 b bbb、 bbbb
SELECT * FROM tb_departments
    -> WHERE dept_name REGEXP '^C';