MariaDB数据库(三)
1. 基本查询
查询基本使用包括:条件、排序、聚合函数、分组和分页。
实例详解查询
1> 创建students表用作实验
MariaDB [testdb]> drop table students; #删除上节创建的表
MariaDB [testdb]> create table students ( #创建students表
-> id int unsigned not null auto_increment primary key,
-> name varchar() default '',
-> age tinyint unsigned default ,
-> high decimal(,),
-> gender enum('男', '女', '中性', '保密') default '保密',
-> cls_id int unsigned default ,
-> is_delete bit default
-> );
MariaDB [testdb]> show table students; #给表里面写入数据
ERROR (): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'students' at line
MariaDB [testdb]> insert into students values
-> (,'小明',,180.00,,,),
-> (,'小月月',,180.00,,,),
-> (,'彭于晏',,185.00,,,),
-> (,'刘德华',,175.00,,,),
-> (,'黄蓉',,160.00,,,),
-> (,'凤姐',,150.00,,,),
-> (,'王祖贤',,170.00,,,),
-> (,'周杰伦儿',,null,,,),
-> (,'程坤',,181.00,,,),
-> (,'和珅',,166.00,,,),
-> (,'刘亦菲',,162.00,,,),
-> (,'金星',,180.00,,,),
-> (,'静香',,170.00,,,),
-> (,'郭靖',,167.00,,,),
-> (,'周杰',,178.00,,,),
-> (,'钱小豪',,178.00,,,),
-> (,'谢霆锋',,175.00,,,),
-> (,'陈冠希',,175.00,,,);
2> 查询
查询所有列(字段)
格式: select * from 表名
MariaDB [testdb]> select * from students;
+----+---------------+-- ---+-------+----------+--------+---------+
| id | name | age | high | gender | cls_id |is_delete |
+----+--------------+----- -+--------+--------+--------+----------+
| | 小明 | | 180.00 | 男 | | |
| | 小月月 | | 180.00 | 男 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 黄蓉 | | 160.00 | 女 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 刘亦菲 | | 162.00 | 女 | | |
| | 金星 | | 180.00 | 中性 | | |
| | 静香 | | 170.00 | 女 | | |
| | 郭靖 | | 167.00 | 男 | | |
| | 周杰 | | 178.00 | 男 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | | |
+----+---------- --+------+--------+--------+-------+------------+
rows in set (0.001 sec)
一定条件查询:
用条件语句where,后面跟条件。
MariaDB [testdb]> select * from students where id>; #支持条件表达式、逻辑语言and、&&、or、||
+----+-----------+------+--------+--------+---------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+---------+-----------+
| | 凤姐 | | 150.00 | 保密 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 刘亦菲 | | 162.00 | 女 | | |
| | 金星 | | 180.00 | 中性 | | |
| | 静香 | | 170.00 | 女 | | |
| | 郭靖 | | 167.00 | 男 | | |
| | 周杰 | | 178.00 | 男 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | 1 | |
+----+----------+------+---------+--------+---------+-----------+
select * from语句虽然简单,但对于企业来说,数据量特别大,使用该命令会列出所有的数据,严重影响内存。一般不直接用该命令。
3> 查看指定列
MariaDB [testdb]> select id,name from students;
+----+--------------+
| id | name |
+----+--------------+
| | 小明 |
| | 小月月 |
| | 彭于晏 |
| | 刘德华 |
| | 黄蓉 |
| | 凤姐 |
| | 王祖贤 |
| | 周杰伦儿 |
| | 程坤 |
| | 和珅 |
| | 刘亦菲 |
| | 金星 |
| | 静香 |
| | 郭靖 |
| | 周杰 |
| | 钱小豪 |
| | 谢霆锋 |
| | 陈冠希 |
+----+--------------+
4>通过表名查询
大量含有相同字段的不同类型的表查询时容易混淆,因此加表名进行查询得到的结果比较合理。
MariaDB [testdb]> select students.id,students.name from students;
+----+--------------+
| id | name |
+----+--------------+
| | 小明 |
| | 小月月 |
| | 彭于晏 |
| | 刘德华 |
| | 黄蓉 |
| | 凤姐 |
| | 王祖贤 |
| | 周杰伦儿 |
| | 程坤 |
| | 和珅 |
| | 刘亦菲 |
| | 金星 |
| | 静香 |
| | 郭靖 |
| | 周杰 |
| | 钱小豪 |
| | 谢霆锋 |
| | 陈冠希 |
5> 给表起别名查询
使用as
MariaDB [testdb]> select s.id,s.name from students as s;
+----+--------------+
| id | name |
+----+--------------+
| | 小明 |
| | 小月月 |
| | 彭于晏 |
| | 刘德华 |
| | 黄蓉 |
| | 凤姐 |
| | 王祖贤 |
| | 周杰伦儿 |
| | 程坤 |
| | 和珅 |
| | 刘亦菲 |
| | 金星 |
| | 静香 |
| | 郭靖 |
| | 周杰 |
| | 钱小豪 |
| | 谢霆锋 |
| | 陈冠希 |
+----+-------------+
6>消除重复行查询
对于students表的age列有重复,可以用distinct去重复查询
MariaDB [testdb]> select distinct age from students;
+------+
| age |
+------+
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
7> 条件查询
#查询年纪大于18岁的信息
MariaDB [testdb]> select * from students where age > ;
+----+--------------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------------+------+--------+--------+--------+-----------+
| | 小月月 | | 180.00 | 男 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 黄蓉 | | 160.00 | 女 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 刘亦菲 | | 162.00 | 女 | | |
| | 金星 | | 180.00 | 中性 | | |
| | 郭靖 | | 167.00 | 男 | | |
| | 周杰 | | 178.00 | 男 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | | |
+----+--------------+------+--------+--------+--------+-----------+ #查询年龄介于18岁到28岁之间的
MariaDB [testdb]> select * from students where age between and ;
MariaDB [testdb]> select * from students where age>= and age<=;
+----+-----------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
| | 小明 | | 180.00 | 男 | | |
| | 小月月 | | 180.00 | 男 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 静香 | 18 | 170.00 | 女 | | |
| | 郭靖 | | 167.00 | 男 | | | #查询年龄18岁以上或者身高180上
MariaDB [testdb]> select * from students where age> or high>;
+----+---------------+------+--------+--------+--------+-----------+
| id | name | age | high |gender |cls_id |is_delete |
+----+---------------+------+--------+-------+---------+-----------+
| | 小月月 | | 180.00 | 男 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 黄蓉 | | 160.00 | 女 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 刘亦菲 | | 162.00 | 女 | | |
| | 金星 | | 180.00 | 中性 | | |
| | 郭靖 | | 167.00 | 男 | | |
| | 周杰 | | 178.00 | 男 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | | |
+----+--------------+------+--------+---------+--------+----------+
8> 模糊查询
like
% 替代0个或多个,与shell里的命令*相同
__ 代表一个字符
#查询名字中带有锋的数据
MariaDB [testdb]> select * from students where name like '%锋%';
+----+-----------+------+---------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+-----------+------+---------+--------+--------+-----------+
| | 谢霆锋 | | 175.00 | 男 | | |
+----+-----------+------+---------+--------+--------+-----------+ #查询名字是两个字的数据
MariaDB [testdb]> select * from students where name like '__';
+----+--------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------+------+--------+--------+--------+-----------+
| | 小明 | | 180.00 | 男 | | |
| | 黄蓉 | | 160.00 | 女 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 金星 | | 180.00 | 中性 | | |
| | 静香 | | 170.00 | 女 | | |
| | 郭靖 | | 167.00 | 男 | | |
| | 周杰 | | 178.00 | 男 | | |
+----+--------+------+--------+--------+--------+-----------+ #查找名字至少三个字以上的数据
MariaDB [testdb]> select * from students where name like '___%';
+----+--------------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------------+------+--------+--------+--------+-----------+
| | 小月月 | | 180.00 | 男 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 刘亦菲 | | 162.00 | 女 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | | |
+----+--------------+------+--------+--------+--------+-----------+
#查询名字中带有锋的数据
MariaDB [testdb]> select * from students where name like '%锋%';
+----+-----------+------+---------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+-----------+------+---------+--------+--------+-----------+
| | 谢霆锋 | | 175.00 | 男 | | |
+----+-----------+------+---------+--------+--------+-----------+ #查询名字是两个字的数据
MariaDB [testdb]> select * from students where name like '__';
+----+--------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------+------+--------+--------+--------+-----------+
| | 小明 | | 180.00 | 男 | | |
| | 黄蓉 | | 160.00 | 女 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 金星 | | 180.00 | 中性 | | |
| | 静香 | | 170.00 | 女 | | |
| | 郭靖 | | 167.00 | 男 | | |
| | 周杰 | | 178.00 | 男 | | |
+----+--------+------+--------+--------+--------+-----------+ #查找名字至少三个字以上的数据
MariaDB [testdb]> select * from students where name like '___%';
+----+--------------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------------+------+--------+--------+--------+-----------+
| | 小月月 | | 180.00 | 男 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 刘亦菲 | | 162.00 | 女 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | | |
+----+--------------+------+--------+--------+--------+-----------+
9> 范围查询
in (1,3,8)表示在一个非连续的范围内
between…and
not between…and 表示否定
#查询年龄为18、34、58的人
MariaDB [testdb]> select * from students where age in(,,);
+----+--------------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------------+------+--------+--------+--------+-----------+
| | 小明 | | 180.00 | 男 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 静香 | | 170.00 | 女 | | |
+----+--------------+-------+--------+-------+--------+-----------+ #查询年龄不在18到34岁的人
MariaDB [testdb]> select * from students where age not between and ;
+----+--------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------+------+--------+--------+--------+-----------+
| | 刘德华 | | 175.00 | 男 | | |
| | 黄蓉 | | 160.00 | 女 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 金星 | | 180.00 | 中性 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | | |
10> 空判断
判断is null
#查询身高为空的数据信息
MariaDB [testdb]> select * from students where high is null;
+----+--------------+------+------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------------+------+------+--------+--------+-----------+
| | 周杰伦儿 | | NULL | 男 | | |
+----+--------------+------+------+--------+--------+-----------+
11>排序
order by 字段;
asc从小到大排列,即升序,默认为此排序;
desc从大到小排序,即降序;
#按照年纪从大到小排序
MariaDB [testdb]> select * from students order by age desc;
+----+--------------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------------+------+--------+--------+--------+-----------+
| | 黄蓉 | | 160.00 | 女 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 金星 | | 180.00 | 中性 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 周杰 | | 178.00 | 男 | | |
| | 刘亦菲 | | 162.00 | 女 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 郭靖 | | 167.00 | 男 | | |
| | 小月月 | | 180.00 | 男 | | |
| | 静香 | | 170.00 | 女 | | |
| | 小明 | | 180.00 | 男 | | |
+----+-------------+------+------- -+-------+--------+-----------+ #查询年纪在18到34 岁之间的男性,按照年纪从大到小排序 MariaDB [testdb]> select * from students where gender= and age between and order by age desc; #可读性差
MariaDB [testdb]> select * from students where (age between and ) and gender= order by age desc;
+----+--------------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------------+------+--------+--------+--------+-----------+
| | 周杰伦儿 | | NULL | 男 | | |
| | 周杰 | | 178.00 | 男 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 郭靖 | | 167.00 | 男 | | |
| | 小月月 | | 180.00 | 男 | | |
| | 小明 | | 180.00 | 男 | | |
+----+--------------+------+--------+--------+--------+-----------+ #order by 多字段
#按年龄从打大小后再按身高从大到小排序
MariaDB [testdb]> select * from students order by age desc,high desc;
+----+----------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+----------+------+--------+--------+--------+-----------+
| | 黄蓉 | | 160.00 | 女 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 金星 | | 180.00 | 中性 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 周杰 | | 178.00 | 男 | | |
| | 刘亦菲 | | 162.00 | 女 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 郭靖 | | 167.00 | 男 | | |
| | 小月月 | | 180.00 | 男 | | |
| | 小明 | | 180.00 | 男 | | |
| | 静香 | | 170.00 | 女 | | |
+----+----------+------+--------+--------+--------+-----------+
12> 聚合函数
总数(量) count
最大值 max
最小值 min
平均数avg
#统计总共有多少条数据
MariaDB [testdb]> select count(*) from students; #*号统计的数据最准确,count的括号里可以跟字段用来统计某个字段共有多少条有效数据数据,
+----------+
| count(*) |
+----------+
| |
+----------+ #查询总共有多少女性数据
MariaDB [testdb]> select count(*) from students where gender=;
+----------+
| count(*) |
+----------+
| |
+----------+
row in set (0.000 sec) #查看年龄最大的数据
MariaDB [testdb]> select max(age) from students;
+----------+
| max(age) |
+----------+
| |
+----------+ #查看年纪最大的人名
MariaDB [testdb]> select name,max(age) from students; #这样统计出来是错的
+--------+----------+
| name | max(age) |
+--------+----------+
| 小明 | |
+--------+----------+
#可以从大到小分组之后分页选出第一条数据,即可。 #查看女性的最高身高
MariaDB [testdb]> select max(high) from students where gender=;
+-----------+
| max(high) |
+-----------+
| 70.00 | #求年纪和并设置别名
MariaDB [testdb]> select sum(age) as '年纪总和' from students;
+--------------+
| 年纪总和 |
+--------------+
| |
+--------------+ #求年纪的平均和
MariaDB [testdb]> select avg(age) as '平均年龄' from students;
MariaDB [testdb]> select sum(age)/count(*) as '平均年纪' from students;
+--------------+
| 平均年纪 |
+--------------+
| 41.0556 |
+--------------+ row in set (0.001 sec) #保留年纪两位小数,用round函数
MariaDB [testdb]> select round(sum(age)/count(*),) as '平均年纪' from students;
+--------------+
| 平均年纪 |
+--------------+
| 41.06 |
+--------------+
聚合函数通常是和分组一起使用的。
13> 分组
group by
having函数
#按性别(gender)分组
MariaDB [testdb]> select gender from students group by gender; #第一个gender为组名
+--------+
| gender |
+--------+
| 男 |
| 女 |
| 中性 |
| 保密 |
+-------+ #显示每组人的个数
MariaDB [testdb]> select gender,count(*) from students group by gender;
+---------+----------+
| gender | count(*) |
+---------+----------+
| 男 | |
| 女 | |
| 中性 | |
| 保密 | |
+--------+------------+ #查看男性组中成员姓名
MariaDB [testdb]> select gender,group_concat(name) from students where gender= group by gender; #group_gender 按组显示 #查看每组成员的name、age、high,用空格分割(自定义分隔符)
MariaDB [testdb]> select gender,group_concat(name,' ',age,' ',high) from students group by gender; #分隔符加单引号,可以自定义分隔符,如/、|等
| 男 | 小明 180.00,谢霆锋 175.00,钱小豪 178.00,周杰 178.00,郭靖 167.00,和珅 166.00,程坤 181.00,陈冠希 175.00,小月月 180.00,彭于晏 185.00,刘德华 175.00 |
| 女 | 黄蓉 160.00,静香 170.00,刘亦菲 162.00,王祖贤 170.00 |
| 中性 | 金星 180.00 |
| 保密 | 凤姐 150.00 #看到group by分组,用条件表达式首先应想到用函数having,而不是where。
#查询平均年纪大于40 的组
MariaDB [testdb]> select gender,avg(age) from students group by gender having avg(age)>;
+--------+----------+
| gender | avg(age) |
+--------+----------+
| 女 | 51.7500 |
| 中性 | 45.0000 |
| 保密 | 44.0000 |
+--------+----------+ #查看人数多于4个的组
MariaDB [testdb]> select gender,group_concat(name) from students group by gender having count(*)>;
男 | 小明,谢霆锋,钱小豪,周杰,郭靖,和珅,程坤,周杰伦儿,陈冠希,小月月,彭于晏,刘德华
14> 分页 l
imit num1 num2 :显示第num1后的num2行,num2相当于步长
当数据信息较大时,可以通过分页显示部分信息,减缓内存压力
#根据年龄从大到小排序,通过分页只显示一条信息(即显示年龄最大的用户数据)
MariaDB [testdb]> select * from students order by age desc limit ; #显示一行
+----+--------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+--------+------+--------+--------+--------+-----------+
| | 黄蓉 | | 160.00 | 女 | | |
+----+--------+------+--------+--------+--------+-----------+
MariaDB [testdb]> select * from students order by age desc limit ;
MariaDB [testdb]> select * from students order by age desc limit ,; #显示两条数据
+----+-----------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
| | 黄蓉 | | 160.00 | 女 | | |
| | 刘德华 | | 175.00 | 男 | | |
+----+-----------+------+--------+--------+---------+-----------+
MariaDB [testdb]> select * from students order by age desc limit ,; #显示第1行后面的3行,从2开始的3行,即234行
+----+-----------+------+--------+--------+--------+-----------+
| id | name | age | high | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
| | 刘德华 | | 175.00 | 男 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
+----+-----------+------+--------+--------+--------+-----------+
2. 连接查询
连接查询即多个表查询,包括内关联、外关联查询和自关联查询。例如创建的classes和students两个表通过classes.id和students.cls_id联系起来属于内关联查询,而外关联查询包括左关联和右关联,左右之分是按查询基础来区分的,如左关联以左边的表为基础,右关联以右边的表为基础。内外关联只是在查询时通过设定的标识来进行联系,但他们并没有什么联系,让他们真正有联系的是外键的作用,而自关联不同,比如地区的规划,省市区街道等,若每个规划阶段有一个表,各个表通过外键构成子父关系,而且各个表的各个字段都相同,因此可以通过自己关联自己建在一个表里面来实现自关联而不通过外键实现关联。自关联可以通过以下的表来了解:
id |
name |
f |
|
省份 |
1 |
北京市 |
null |
2 |
天津市 |
null |
|
3 |
河北省 |
null |
|
4 |
山西省 |
null |
|
地级市 |
5 |
海淀区 |
1 |
6 |
滨海区 |
2 |
|
7 |
沧州市 |
3 |
|
8 |
大同市 |
4 |
|
9 |
朝阳区 |
1 |
|
10 |
武清区 |
2 |
|
11 |
石家庄 |
3 |
|
12 |
太原市 |
4 |
|
县级市 |
13 |
西二旗 |
5 |
14 |
大港 |
6 |
|
15 |
任丘市 |
7 |
|
16 |
清徐 |
8 |
|
17 |
中关村 |
5 |
|
18 |
汉沽 |
6 |
|
19 |
河间市 |
7 |
|
20 |
阳曲 |
8 |
单独一个表通过id和f进行关联,如海淀区f=1对应北京市id=1,中关村f=5对应海淀区id=5,通过自关联构成了一条完整的子父连接,北京市--海淀区--中关村、 天津市--滨海区--大港等。
2.1 内关联查询
1)给class表里写入数据用作实验
MariaDB [testdb]> ;create table classes( #创建classes表
-> id int unsigned auto_increment primary key not null,
-> name varchar() not null
-> );
MariaDB [testdb]> insert into classes values (, '云唯_01期'),(, '云唯_02期');
Query OK, rows affected (0.003 sec)
Records: Duplicates: Warnings:
MariaDB [testdb]> select * from classes;
+----+------------------+
| id | name |
+----+------------------+
| | 云唯_01期 |
| | 云唯_02期 |
+----+------------------+
2) 连接查询(内关联查询)
#两个表连接起来取交集查询
MariaDB [testdb]> select * from classes inner join students on classes.id=students.cls_id; #内连接;首选条件语句为on
+----+--------------+----+--------------+------+--------+--------+--------+-----------+
| id | name | id | name | age | high | gender | cls_id | is_delete |
+----+--------------+----+--------------+------+--------+--------+--------+-----------+
| | 云唯_01期 | | 小明 | | 180.00 | 男 | | |
| | 云唯_02期 | | 小月月 | | 180.00 | 男 | | |
| | 云唯_01期 | | 彭于晏 | | 185.00 | 男 | | |
| | 云唯_02期 | | 刘德华 | | 175.00 | 男 | | |
| | 云唯_01期 | | 黄蓉 | | 160.00 | 女 | | |
| | 云唯_02期 | | 凤姐 | | 150.00 | 保密 | | |
| | 云唯_01期 | | 王祖贤 | | 170.00 | 女 | | |
| | 云唯_01期 | | 周杰伦儿 | | NULL | 男 | | |
| | 云唯_02期 | | 程坤 | | 181.00 | 男 | | |
| | 云唯_02期 | | 和珅 | | 166.00 | 男 | | |
| | 云唯_01期 | | 周杰 | | 178.00 | 男 | | |
| | 云唯_01期 | | 钱小豪 | | 178.00 | 男 | | |
| | 云唯_01期 | | 谢霆锋 | | 175.00 | 男 | | |
| | 云唯_01期 | | 陈冠希 | | 175.00 | 男 | | |
+----+--------------+----+--------------+------+--------+--------+--------+-----------+ #仅显示班级和姓名字段
MariaDB [testdb]> select classes.name,students.name from classes inner join students on classes.id=students.cls_id;
MariaDB [testdb]> select c.name,s.name from classes as c inner join students as s on c.id=s.cls_id; # 别名
MariaDB [testdb]> select c.name,s.name from classes as c inner join students as s on c.id=s.cls_id order by c.name; #以班级名排序
+-------------+--------------+
| name | name |
+-------------+--------------+
| 云唯_01期 | 小明 |
| 云唯_01期 | 彭于晏 |
| 云唯_01期 | 黄蓉 |
| 云唯_01期 | 王祖贤 |
| 云唯_01期 | 周杰 |
| 云唯_01期 | 谢霆锋 |
| 云唯_01期 | 周杰伦儿 |
| 云唯_01期 | 钱小豪 |
| 云唯_01期 | 陈冠希 |
| 云唯_02期 | 程坤 |
| 云唯_02期 | 小月月 |
| 云唯_02期 | 刘德华 |
| 云唯_02期 | 凤姐 |
| 云唯_02期 | 和珅 |
+-------------+--------------+
可以看到,显示的仅是cls_id 为1、2的数据,即和classes.id一一对应的数据,并没有查询到cls_id为345的数据。这便是内关联查询的效果。
2.2 外关联查询
1)左右关联
#继续以classes表和students表为例
#左关联:
MariaDB [testdb]> select c.name,s.name from classes as c left join students as s on c.id=s.cls_id order by c.name; #以左边的c.name为基准查询,只能查询到cls-id位为1、2的数据
+--------------+--------------+
| name | name |
+--------------+--------------+
| 云唯_01期 | 小明 |
| 云唯_01期 | 彭于晏 |
| 云唯_01期 | 黄蓉 |
| 云唯_01期 | 王祖贤 |
| 云唯_01期 | 周杰 |
| 云唯_01期 | 谢霆锋 |
| 云唯_01期 | 周杰伦儿 |
| 云唯_01期 | 钱小豪 |
| 云唯_01期 | 陈冠希 |
| 云唯_02期 | 程坤 |
| 云唯_02期 | 小月月 |
| 云唯_02期 | 刘德华 |
| 云唯_02期 | 凤姐 |
| 云唯_02期 | 和珅 |
+--------------+--------------+ #右关联:
MariaDB [testdb]> select c.name,s.name from classes as c right join students as s on c.id=s.cls_id order by c.name; #以s.name为基准,cls_id取值为12345,而c.name仅支持12,所以钱44条数据为空(null)
+--------------+-------------+
| name | name |
+--------------+-------------+
| NULL | 金星 |
| NULL | 郭靖 |
| NULL | 刘亦菲 |
| NULL | 静香 |
| 云唯_01期 | 周杰伦儿 |
| 云唯_01期 | 钱小豪 |
| 云唯_01期 | 陈冠希 |
| 云唯_01期 | 小明 |
| 云唯_01期 | 彭于晏 |
| 云唯_01期 | 黄蓉 |
| 云唯_01期 | 王祖贤 |
| 云唯_01期 | 周杰 |
| 云唯_01期 | 谢霆锋 |
| 云唯_02期 | 小月月 |
| 云唯_02期 | 刘德华 |
| 云唯_02期 | 凤姐 |
| 云唯_02期 | 和珅 |
| 云唯_02期 | 程坤 |
+--- ---------+- ------------+
2.3 自 关联查询
1)创建areas表用作实验
MariaDB [testdb]> create table areas(
-> aid int primary key auto_increment,
-> name varchar(),
-> pid int
-> );
MariaDB [testdb]> show tables;
+--------------------+
| Tables_in_testdb |
+--------------------+
| areas |
| classes |
| students | --写入数据
--省份
insert into areas(aid,name,pid) values(,'北京市',null);
insert into areas(aid,name,pid) values(,'天津市',null);
insert into areas(aid,name,pid) values(,'河北省',null);
insert into areas(aid,name,pid) values(,'山西省',null); --地级市
insert into areas(aid,name,pid) values(,'海淀区',);
insert into areas(aid,name,pid) values(,'滨海区',);
insert into areas(aid,name,pid) values(,'沧州市',);
insert into areas(aid,name,pid) values(,'大同市',);
insert into areas(aid,name,pid) values(,'朝阳区',);
insert into areas(aid,name,pid) values(,'武清区',);
insert into areas(aid,name,pid) values(,'石家庄',);
insert into areas(aid,name,pid) values(,'太原市',); --县级市
insert into areas(aid,name,pid) values(,'西二旗',);
insert into areas(aid,name,pid) values(,'大港',);
insert into areas(aid,name,pid) values(,'任丘市',);
insert into areas(aid,name,pid) values(,'清徐',);
insert into areas(aid,name,pid) values(,'中关村',);
insert into areas(aid,name,pid) values(,'汉沽',);
insert into areas(aid,name,pid) values(,'河间市',);
insert into areas(aid,name,pid) values(,'阳曲',);
MariaDB [testdb]> select * from areas;
+-----+-----------+------+
| aid | name | pid |
+-----+-----------+------+
| | 北京市 | NULL |
| | 天津市 | NULL |
| | 河北省 | NULL |
| | 山西省 | NULL |
| | 海淀区 | |
| | 滨海区 | |
| | 沧州市 | |
| | 大同市 | |
| | 朝阳区 | |
| | 武清区 | |
| | 石家庄 | |
| | 太原市 | |
| | 西二旗 | |
| | 大港 | |
| | 任丘市 | |
| | 清徐 | |
| | 中关村 | |
| | 汉沽 | |
| | 河间市 | |
| | 阳曲 | |
+-----+----------+------+
2)自关联查询
--查询北京市的所有区:
MariaDB [testdb]> select * from areas as p inner join areas as q on p.aid=q.pid where p.name='北京市'; #起别名,自关联
+-----+-----------+------+-----+-----------+------+
| aid | name | pid | aid | name | pid |
+-----+-----------+------+-----+-----------+------+
| | 北京市 | NULL | | 海淀区 | |
| | 北京市 | NULL | | 朝阳区 | |
+-----+-----------+------+-----+-----------+------+
rows in set (0.000 sec) --查询山西省的所有区:
MariaDB [testdb]> select * from areas as p inner join areas as q on p.aid=q.pid where p.name='山西省';
+-----+-----------+------+-----+-----------+------+
| aid | name | pid | aid | name | pid |
+-----+-----------+------+-----+-----------+------+
| | 山西省 | NULL | |大同市 | |
| | 山西省 | NULL | |太原市 | |
+-----+-----------+------+-----+-----------+------+
3)子查询(嵌套查询)
#查询北京市所有的区
MariaDB [testdb]> select * from areas where pid=(select aid from areas where name='北京市');
+-----+-----------+-------+
| aid | name | pid |
+-----+-----------+-------+
| | 海淀区 | |
| | 朝阳区 | |
+-----+-----------+-------+
rows in set (0.001 sec)
MariaDB数据库(三)的更多相关文章
- Linux编译安装Mariadb数据库
一.安装cmake cd /usr/local/src tar zxvf cmake-2.8.12.1.tar.gz cd cmake-2.8.12.1 ./configure 注意报错需要安装gcc ...
- MySQL/MariaDB数据库忘掉密码解决办法--技术流ken
前言 有些时候我们常常会忘掉一些服务的密码,比如系统密码,我们可以进入救援模式进行修改密码,可参考我之前的博客<Centos7破解密码的两种方法--技术流ken>.但有些时候我们也会忘掉数 ...
- centos7.5下yum 安装mariadb数据库
前言 mariadb 和mysql就像亲兄弟的关系,各种语法.驱动啥的,在mysql上能上的,在mariadb上基本都可以直接使用.更多的细节在此不多说. 1.删除旧版本 centos7下默认安装有m ...
- fedora中使用 mariadb数据库建库和建表-- mariadb数据库服务无法启动?
/proc(进程, 过程等含义) 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux® 内核空间(内核)和用户空间(用户)之间进行通信.在 /proc 文件系统中,我们可以将对虚拟文 ...
- MariaDB数据库主从复制实现步骤
一.MariaDB简介 MariaDB数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上. MariaDB数据库支持单向 ...
- MariaDB数据库(一)
1.数据库简介 1.1 什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方 ...
- MySQL/MariaDB数据库的性能测试
MySQL/MariaDB数据库的性能测试 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据库服务衡量指标 qps: query per second(每秒支持多少查询 ...
- MySQL/MariaDB数据库的Galera高可用性集群实战
MySQL/MariaDB数据库的Galera高可用性集群实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Galera Cluster概述 1>.什么是Gale ...
- MySQL/MariaDB数据库的MHA实现高可用实战
MySQL/MariaDB数据库的MHA实现高可用实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL高可用常见的解决方案 1>.Multi-Master ...
- MySQL/MariaDB数据库的PROXY实现读写分离
MySQL/MariaDB数据库的PROXY实现读写分离 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ProxySQL概述 1>.各家互联网公司读写分离的解决方案 m ...
随机推荐
- bzoj1139:[POI2009]Wie
传送门 状压dp,最短路 spfa似乎特别慢 代码: #include<cstdio> #include<iostream> #include<algorithm> ...
- jmeter beanshell处理请求响应结果时Unicode编码转为中文
在Test Plan下创建一个后置BeanShell PostProcessor,粘贴如下代码即可: String s=new String(prev.getResponseData()," ...
- 用apache commons-pool2建立thrift连接池
Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.具体的介绍可以看Apache的官方网站:http://thrift.apache.org/ . ...
- [coci2015-2016 coii] Palinilap【字符串 哈希】
传送门:http://www.hsin.hr/coci/archive/2015_2016/ 进去之后点底下的那个.顺带说一句,题目既不是一个英文单词,也不是克罗地亚单词,估计只是从回文串的英文单词p ...
- python学习之TCP/UDP
TCP/UDP都是网络编程(socket)的两种基于C/S结构的程序. UDP的9999端口与TCP的9999端口可以各自绑定. UDP:非可靠连接速度快,服务器:创建socket 绑定ip和端口后直 ...
- Java编程简介
作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=3 JAVA由Sun Microsystems In ...
- 初学者应该怎么学习前端?web前端的发展路线大剖析!
写在最前: 优秀的Web前端开发工程师要在知识体系上既要有广度和深度!应该具备快速学习能力. 前端开发工程师不仅要掌握基本的Web前端开发技术,网站性能优化.SEO和服务器端的基础知识,而且要学会运用 ...
- Hibernate框架关系映射一对多双向关联
直入主题,首先大配置常规配置, 这里住要说关联关系,大配置不多少,而且jar包默认添加好,笔者用的是idea2016. 然后我们知道关联关系主要是在小配置添加节点来配置属性.个人认为关联映射,就是对应 ...
- 将生成的Excel表发送到邮箱
本文接上一篇,将得到的Excel表发送到邮箱.. 在上一篇中,本人使用的是直接从数据库中获取数据,然后包装成Excel表.现在将该Excel表发送到目的邮箱,如果需要跟上篇一样,定时每天某时刻发送,就 ...
- idea 设置加载多个资源文件,显示本地图片
idea 经常只会设置一个资源路径,这个路径就是项目的路径.但是当要加载的文件处于其他位置时,则需要增加虚拟路径的配置. 如图:第一个是项目路径 第二个是图片路径