一、数据库介绍
1.1、定义:
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
1.2、数据库存储数据的特点
(1)持久化存储;
(2)读写速度极高;
(3)保证数据的有效性;
(4)对程序(PHP/C/Java/Python等)支持非常好,容易扩展;
(5)MySQL属于关系型数据库,类似于Excel表,列–>字段,行–>记录,能唯一标识某个记录的字段称为主键。
二、安装和配置
2.1、MySQL下载和安装
下载:
链接: link.
安装:
链接: link.
2.2、集成安装
(1)phpstudy
(2)xampp
2.3、图形化管理工具
(1)phpMyAdmin
(2)Naviacat
(3)SQLyog
三、语法基础
3.1、SQL
SQL是结构化查询语言,是一种用来操作RDBMS(关系型数据库管理系统)的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过SQL操作oracle,sql server,mysql等关系型数据库。
SQL语句主要分为DQL、DML、DDL等:
DQL:数据查询语言,用于对数据进行查询,如select;
DML:数据操作语言,对数据进行增加、修改、删出,如insert、update、delete;
DDL:数据定义语言,进行数据库、表的管理等,如create、drop。
重点是数据的curd(增删改查),必须熟练编写DQL、DML,能够编写DDL完成数据库、表操作。
数据的完整性:
在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束。
常见数据库的数据类型:
(1)整数:int
(2)小数:decimal
(3)字符串:varchar,char
(4)日期时间:date,time,datetime
(5)枚举类型:enum
特别说明的类型:
(1)decimal表示浮点数,如decimal(5,2)表示共存5位数,小数占2位;
(2)char表示固定长度的字符串,如char(3),如果填充‘ab’时会补一个空格为‘ab ’;
(3)varchar表示可变长度的的字符串,如varchar(3),填充‘ab’时就会存储‘ab’;
(4)字符串text表示存储大文本,当字符大于4000时推荐使用;
(5)对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径。
四、数据库的操作
4.1、mysql常用操作:mysql里面的所有命令都是以分号(;)结尾的
(1)链接数据库
mysql -u用户名 -p
pwd
mysql -u用户名 -p密码(不建议大家使用)
(2)退出数据库
exit/quit
(3)sql语句最后需要有分号;结尾
(4)显示数据库版本:select version();
(5)显示时间:select now();
(6)查看所有数据库:
show databases;
SHOW DATABASES;
4.2、DDL(数据定义语句):
(1)创建数据库:
create database 数据库名 charset=utf8;(注意不是utf-8)
(2)查看创建数据库的语句:
show create database 数据库名;
(3)查看当前使用的数据库:
select database();
(4)使用数据库:
use 数据库的名字
(5)删除数据库:
drop database 数据库名;
五、数据表的操作
5.1、mysql数据表常用操作
(1)查看当前数据库中所有表:
show tables;
(2)创建表:
create table 数据表名字(字段、类型、约束【字段、类型、约束】);
例如:
create table demo(id int,name varchar(20));
create table demo2(
id int primary key not null auto_increment,
name varchar(30)
);
约束有:
– auto_increment表示自动增长
– not null 表示不能为空
– primary key 表示主键
– default 默认值
(3)查看表结构:
desc 数据表的名字;
例如:
desc demo;
-- 创建students表(id、name、age、high、gender、cls_id)
create table students(
id int not null primary key auto_increment,
name varchar(30),
age tinyint unsigned default 18,
high decimal(5,2),
gender enum('男','女','保密') default '保密', -- 存数据的时候 只能存 男或者女
cls_id int
);
-- 创建classes表(id、name)
create table classes(
id int primary key not null auto_increment,
name varchar(30)
);
(4)查看表的创建语句:
show create table 表名字;
show create table students;
(5)往表里插入数据:
insert into 数据表名 values(字段、类型、约束【字段、类型、约束】);
select * from 数据表名;
(6)修改表
添加字段
alter table 数据表名 add 列名 类型;
例如:
alter table students add birthday date;
修改字段-不重命名
alter table 数据表名 modify 列名 类型及约束;
例如:
alter table students modify birthday date default '1990-1-1';
修改字段-重命名
alter table 数据表名 change 原名 新名 类型及约束;
例如:
alter table students change birthday birth date default '1997-01-01';
删除字段-删除字段
alter table 数据表名 drop 字段;
例如:
alter table students drop high;
删除表
drop table 数据表;
例如:drop table students;
练习:
(1)创建students表(id,name,age,high,gender,cls_id)
create table students(
id int unsigned not null primary key auto_increment,
name varchar(30) not null,
age tinyint unsigned default 0,
high decimal(5,2),
gender enum('男','女','中性','保密') default '保密',
cls_id int unsigned
);
insert into students values(0,'老王',18,175,88,'男',1);--0表示自动填充
(2)创建classes表(id,name)
create table classes(
id int unsigned not null primary key auto_increment,
name varchar(30)
);
insert into classesvalues(0,'python大神');--0表示自动填充
select * from classes;--查看数据表
六、 DML(数据管理语句)
新增
(1)全列插入:
insert [into] 数据表名 values(…);
主键字段,可以用0、null、default来占位
例如:向classes表中插入一个班级
insert into classes values(0,‘pyhton进阶班’);
(2)部分插入:
insert into students(指定列) values(…);
例如:insert into students(name,gender) values(‘小乔’,2);–部分插入时,可以不用占位。
(3)多行插入,用逗号隔开:
insert into students(指定列) values(…),(…);
修改
(1)update 数据表明 set 列1=值1…[where条件];
例如:update students set age=18;–表示所有记录age不为18的改为18
update students set age=18 where id=11;--表示主键为11的记录age不为18的改为18
删除
(1)物理删除:(删除的是表中的数据)
delete from 数据表名 where 条件;
注意:必须有条件。
例如:delete from students where name=‘tony’;
(2)逻辑删除【为了后期恢复数据,逻辑删除是一种常用的删除方式】
定义:用一个字段来表示,这条信息是否已经不能再使用了。这样便于恢复数据。
给students表添加一个is_delete字段 int类型,0未删除,1删除。
alter table students add is_delete int default 0;
update students set is_delete=1 where id=6;
查询
select 去重选项 字段列表[as 字段名] from 数据表 where [group by 字句] [having字句][order by字句][limit字句];
(1)查询所有列:
select * from 数据表名;
(2)去除重复字段的查询:
select distinct 字段 from 数据表名;–把重复的字段只显示一个,去重;
select distinct 字段1,字段2 from 数据表名;–把重复的字段1和字段2只显示一个,字段1和字段2看成一个整体去重。
(3)查询指定列:
select 字段1,字段2… from 数据表名;
(4)可以使用as为列或表指定的别名:
select 字段1,字段2 as 字段2别名 from 数据表名;
-- 增删改查(curd)
-- 增加
-- 全列插入
-- insert [into] 表名 values(...)
-- 向classes表中插入 一个班级 id name
insert into classes values(1,'大神班');
-- 向students表插入 一个学生信息
+--------+-------------------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------------------+------+-----+------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(30) | YES | | NULL | |
| age | tinyint(3) unsigned | YES | | 0 | |
| gender | enum('男','女','中性','保密') | YES | | 保密 | |
| cls_id | int(10) unsigned | YES | | NULL | |
| birth | date | YES | | 1997-01-01 | |
+--------+-------------------------------+------+-----+------------+----------------+
-- 主键字段 0 null default 来占位
insert into students values(0,'居然',18,'男',1,'1990-1-1'); -- id是多少?
insert into students values(null,'juran',19,'男',1,'1990-1-1');
insert into students values(default,'juran',19,'男',1,'1990-1-1');
-- 枚举类型插入 下标是从1开始的
insert into students values(default,'juran',19,1,1,'1990-1-1');
-- 部分插入
-- insert into 表名(列1,...) values(值1,...) -- 非空字段
insert into students(`gender`) values(2);
insert into students(`name`,`gender`) values('juran',2);
-- 多行插入
insert into students values
(default,'juran',19,'男',1,'1990-1-1'),
(default,'666',20,'男',1,'1990-1-1')
;
-- 修改
-- update 表名 set 列1=值1,列2=值2... where 条件;
-- 修改 名字为juran 改成钢铁侠
update students set name='钢铁侠'; -- 不加where 全部修改
update students set name='python' where name='juran';
update students set name='无名' where id=6; -- 修改id 为3的
update students set name='居然',gender='保密' where id=7;
-- 删除
-- 物理删除
-- delete from 表名 where 条件
delete from students; --- 删除的是 数据!!!
delete from students where id = 12;
-- 逻辑删除
-- 居然 juran JuRan
-- is_delete 表示 是否删除 1 删除 0 未删除
-- 查找 select * from students where is_delete=0;
-- 修改
update students set is_delete = 1 where id=6;
-- 查询基本使用
-- select 去重选项 字段列表[as 字段名] from 数据表
-- where [group by 子句] [having子句] [order by 子句] [limit子句];
-- 查询所有列
select * from students;
-- 去除重复字段的查询 distinct 整个查询的行是否重复
select distinct name from students;
-- 查询指定列
-- select 列1,列2,... from 表名;
select name,age,gender from students;
-- 可以使用as为列或表指定别名,是为查询出来的结构显示的字段改为别名
select name as n,age,gender from students_abc_demoas_asdasda where n='juran';
select name as n,gender from students where name='juran';
select name as 姓名,gender from students where name='居然';
八、数据库的查询
8.1、条件查询-where字句(条件)
比较运算符:
大于(>):
例如:select * from students where age>18;
小于(<):
例如:select * from students where age<18;
大于等于(>=):
例如:select * from students where age>=18;
小于等于(<=):
例如:select * from students where age<=18;
等于(=):
例如:select * from students where age=18;
不等于(!=或者<>):
例如:select * from students where age!=18;
-- select .... from 表名 where .....
-- >
-- 查询 大于18岁 的信息
select * from students where age > 18;
-- <
-- 查询小于18岁的信息
select * from students where age < 18;
-- >=
-- <=
-- 查询小于或者等于18岁的信息
select * from students where age <= 18;
-- =
-- 查询年龄为18岁的所有学生的名字
select * from students where age = 18;
-- != 或者 <> 不等于
-- 查询姓名不是居然的
select * from students where name != '居然';
逻辑运算符
and:
例如:select * from students where age>18 and age<28;
or:
例如:select * from students where age<18 or age>28;
not:
例如:select * from students where not (age>18 and gender=2);–gender是枚举类型,SQL的索引是从1开始的,不是从0开始
-- and
-- 18到28之间的所有学生信息
select * from students where age >18 and age < 28;
-- select * from students where 18 < age < 28; 错误的写法
-- select * from students where age >18 and < 28;
-- 18岁以上的女性
select * from students where age > 18 and gender='女';
-- or
-- 查询编号小于4或没被删除的学生
select * from students where id < 4 or is_delete = 0;
-- not 取反
-- 查询年龄不是18岁的 女性 这个范围内的信息
select * from students where not (age = 18 and gender = '女'); -- 可读性 更高
select * from students where age != 18 and gender = '女';
-- 年龄不是小于或者等于18 并且是女性
select * from students where (not age <= 18) and gender = 2;
-- select * from students where age > 18 and gender = 2;
-- MySQL数据库中优先级:not>and>or
模糊查询
like:
%替换一个或多个字符;
_替换一个字符;
例如:
(1)查询姓名中以“居”开始的名字
select * from students where name like ‘居%’;
(2)查询有两个字的名字
select * from students where name like ‘__’;
(3)查询至少有两个字的名字
select * from students where name like ‘__%’;
-- like
-- % 替换任意多个
-- _ 替换1个
-- 查询姓名中 以 "小" 开始的名字
select * from students where name like '小%'; -- '小于' '小张' '小xx'
-- 查询姓名中 有 "小" 所有的名字
select * from students where name like '%小%'; -- '小于' '小张' '小xx' 'x小x'
-- 查询有2个字的名字
select * from students where name like '__'; -- xx xx
-- 查询至少有2个字的名字
select * from students where name like '__%';
-- rlike 正则
-- 查询以 周开始的姓名
select name from students where name rlike "^周.*";
-- 查询以 周开始、伦结尾的姓名
select name from students where name rlike "^周.*伦$";
范围查询
(1)in表示在一个非连续的范围内;
例如:查询ID编号是1或3或8的学生:
select * from students where id=1 or id=3 or id=3;
<==>
select * from students where id in (1,3,8);–(1,3,8)相当于python中的元组。
(2)not in 不在非连续的范围之内;
例如:查询ID编号不是1或3或8的学生:
select * from students where id not in (1,3,8);–(1,3,8)相当于python中的元组。
(3)between…and…表示在一个连续的范围内。
例如:查询ID编号是3到8的学生:
select * from students where id between 3 and 8;
(4)not between…and…表示不在一个连续的范围内。
例如:查询ID编号不是3到8的学生:
select * from students where id not between 3 and 8;
<==>
select * from students where not id between 3 and 8;–not位置可前移,但不建议使用。
-- in (1, 3, 8)表示在一个非连续的范围内
-- 查询 年龄为18、34的姓名
select name from students where age in (18,34);
-- 查询 姓名为居然,老王的
select * from students where name in ('居然','python');
-- not in 不非连续的范围之内
-- 年龄不是 18、34岁之间的信息
select name from students where age not in (18,34);
-- between ... and ...表示在一个连续的范围内
-- 查询 查询id是3到8的学生
select * from students where id between 3 and 8;
-- select * from students where id between 3 and 8;
-- 查询学生id是3到8的男生
select * from students where id between 3 and 8 and gender=1;
select * from students where (id between 3 and 8) and gender=1; -- 可读性
-- not between ... and ...表示不在一个连续的范围内
-- 查询 年龄不在在18到34之间的的信息
select * from students where age not between 18 and 34;
-- select * from students where not age between 18 and 34;
8.2、空判断
判断空:is null(注意:null!=“”【null不等于空的字符串】)
例如:查询年龄为空的信息
select * from students where age is null;
判断非空:is not null
例如:查询年龄为非空的信息
select * from students where age is not null;
-- 判空is null 不能用 =
-- 查询身高为空的信息
select * from students where name is null;
-- 判非空is not null
select * from students where name is not null;
8.3、聚合函数
(1)求总数(count())
例如:
查询学生总数:
select count(*) as 总人数 from students;
查询男性学生总数:
select count(*) as 总人数 from students where gender=1;
(2)最大值(max())
例如:
查询最大的年龄:
select max(age) from students;
查询男生的最大年龄:
select max(age) from students where gender=1;
(3)最小值(min())
例如:
查询最小的年龄:
select min(age) from students;
查询男生的最小年龄:
select min(age) from students where gender=1;
(4)求和(sum())
例如:
查询男生的年龄和:
select sum(age) from students where gender=1;
(5)平均值(avg()),默认保留四位小数
例如:
查询未删除女性的ID平均值:
select avg(id) from students where gender=2 and is_delete=0;
(6)四舍五入(round(数据,小数位数))
例如:
查询未删除女性的ID平均值,保留2位小数:
select round(avg(id),2) from students where gender=2 and is_delete=0;
-- 总数
-- count
-- 查询学生总数
select count(*) from students;
-- 查询男性有多少人,女性有多少人
select count(*) as 男性人数 from students where gender = 1;
select count(*) as 女性人数 from students where gender = 2;
-- 最大值
-- max
-- 查询最大的年龄
select max(age) from students;
-- 查询女性的最大编号
select max(id) from students where gender = 2;
-- 查询最大年龄的女性id
-- select max(age) from students where gender=2;
-- 最小值
-- min
-- 查询未删除的学生最小编号
select min(id) from students where is_delete=0;
-- 求和
-- sum
-- 查询男生的年龄和
select sum(age) from students where gender = 1;
-- 求和字段 是varchar 0 如果字段内容是数字的话会进行相加
-- 平均值
-- avg
-- 查询未删除女生的年龄的平均值
select avg(age) from students where gender=2 and is_delete = 0; -- 默认保留4位小数
-- 计算平均年龄 sum(age)/count(*)
-- 四舍五入 round(123.23 , 1) 保留1位小数
-- 计算所有人的平均年龄,保留2位小数
select round(avg(age),2) from students;
select round(sum(age)/count(*),2) from students;
8.4、分组
group by XX,按XX分组,通常和聚合函数一起用。
例如:
按照性别分组,查询所有的性别:
select gender as 性别,count() from students where gender=1;
select gender as 性别,count() from students where gender=2;
<==>
select gender as 性别,count(*) from students group by gender;
group_concat(字段):查看组内的信息
例如:
查询同种性别中的姓名:
select gender as 性别,group_concat(name) from students group by gender;
-- group by
-- select ... from students group by gender;
select name from students group by gender; -- 聚合函数
-- 真正能区分这个组的字段
-- 按照性别分组,查询所有的性别
select gender from students group by gender;
-- 计算男生和女生中的人数
select count(*) from students group by gender;
select gender as 性别,count(*) from students group by gender;
select gender as 性别,count(*) from students where gender = 1;
select count(*) from students where gender = 2;
-- 男女同学最大年龄
select gender as 性别,max(age) from students group by gender;
-- group_concat(...) 查看组内的信息
-- 查询同种性别中的姓名
select gender as 性别,group_concat(name) from students group by gender;
-- 查询组内年龄,姓名 'a' + b + 'c' b 变量
select gender as 性别,group_concat('姓名:',name,'-','年龄:',age) from students group by gender;
8.5、分组之后的筛选
group by XX having
注意:where用于原始的数据集进行筛选,having用于分组之后的筛选。
例如:
查询男生女生总数大于2:
select gender as 性别,count() from students group by gender having count()>2;
查询男生女生总数大于2的姓名:
select gender as 性别,count() ,group_concat(name) from students group by gender having count()>2;
查询平均年龄超过18岁的性别,以及姓名having avg(age) >18
-- having
-- 查询男生女生总数大于2
select gender,count(*) from students group by gender having count(*)>2;
-- 查询男生女生总数大于2的姓名
select gender,count(*),group_concat(name) from students group by gender having count(*)>2;
-- 查询平均年龄超过18岁的性别,以及姓名 having avg(age) > 18
select gender,group_concat(name),avg(age) from students group by gender having avg(age) > 18;
8.6、排序
order by 字段
asc 从小到大排序,即升序,默认是asc
desc从大到小排序,即降序
例如:
查询年龄在18到26之间的男同学,按照年龄从小到大排序:
select * from students where age between 18 to 26 and gender=1 order by age asc;
order by 多个字段
查询年龄在18到28岁之间的女性,身高从高到矮排序,如果身高相同的情况下按照年龄从小到大排序:
select * from students where age between 18 to 28 and gender =2 order by height desc,age asc;
-- order by 字段
-- asc从小到大排列,即升序 默认
-- desc从大到小排序,即降序
-- 查询年龄在18到26岁之间的男同学,按照年龄从小到到排序
select * from students where (age between 18 and 26) and gender=1;
select * from students where (age between 18 and 26) and gender=1 order by age;
select * from students where (age between 18 and 26) and gender=1 order by age asc;
-- 查询年龄在18到26岁之间的女同学,身高从高到矮排序
select * from students where (age between 18 and 26) and gender=2 order by id desc;
-- order by 多个字段
-- 查询年龄在18到28岁之间的男性,年龄从高到矮排序, 如果身高相同的情况下按照年龄从小到大排序
-- 排序的字段 相同了
-- 先按照 年龄排序 如果年龄相同 在按照身高进行排序
select * from students where (age between 18 and 28) and gender=1 order by age desc,hiht asc;
-- 按照年龄从小到大、身高从高到矮的排序
8.7、分页
limit start,count
限制查询出来的数据个数,需要注意的是limit语句必须要放在SQL语句的最后,因为limit语句是对数据集的一种操作。
例如:
查询前5条数据
select * from students limit 5;
select * from students limit 0,5;–记录的索引是从0开始的。
-- limit start, count 起始的位置(从0开始), 个数
-- 限制查询出来的数据个数
select * from students limit 2;
-- 查询前5个数据
select * from students limit 5;
-- 查询id 6-10(包含)的数据
select * from students limit 5,5;
-- 制作分页
-- 每页显示2个,第1个页面
select * from students limit 0,2;
-- 每页显示2个,第2个页面
select * from students limit 2,2;
-- 每页显示2个,第3个页面
select * from students limit 4,2;
-- 每页显示2个,第4个页面
select * from students limit 6,2;
-- limit 第三页的话 limit (第N页-1)*每页显示的个数,每页显示的个数
-- select * from students limit 2*(6-1),2; 错误的
-- select gender from students limit 0,2 group by gender ; 只能写到最后
-- 限制显示的条数
8.8、连接查询
资料链接: link.
(1)内连接 inner join … on
select …from 表A inner join 表B;
例如:
查询有能够对应班级的学生以及班级信息:
select * from students inner join classes on students.cls_id =classes.id;
安装要求显示姓名、班级:
select students.name,classes.name from students inner join classes on students.cls_id =classes.id;
给数据表起名字:
select s.name,c.name from students as s inner join classes as c on s.cls_id =c.id;
查询,有能够对应班级的学生以及班级信息,显示学生的所有信息,只显示班级名称:
select s.*,c.name from students as s inner join classes as c on s.cls_id =c.id;–将s.name更改
在以上查询中,将班级姓名显示在第一列;
select c.name,s.* from students as s inner join classes as c on s.cls_id =c.id;–调整c.name的位置
查询,有能够对应班级的学生以及班级信息,按照班级进行排序:
select s.name,c.name from students as s inner join classes as c on s.cls_id =c.id order by c.name;
当同一个班级的时候,按照学生的id进行从小到大排序:
select s.id,c.name,s.name from students as s inner join classes as c on s.cls_id =c.id order by c.name,s.id;
-- inner join ... on
-- select ... from 表A inner join 表B;
select * from students inner join classes;
-- 查询 有能够对应班级的学生以及班级信息
select * from students inner join classes on students.cls_id = classes.id;
-- 按照要求显示姓名、班级
select students.*,classes.name from students inner join classes on students.cls_id = classes.id;
-- 给数据表起名字
select s.*,c.name from students as s inner join classes as c on s.cls_id = c.id;
-- 查询 有能够对应班级的学生以及班级信息,显示学生的所有信息,只显示班级名称
select s.*,c.name from students as s inner join classes as c on s.cls_id = c.id;
-- 在以上的查询中,将班级姓名显示在第1列
select c.name, s.* from students as s inner join classes as c on s.cls_id = c.id;
-- 查询 有能够对应班级的学生以及班级信息, 按照班级进行排序
select c.name, s.* from students as s inner join classes as c on s.cls_id = c.id order by c.name;
-- 当同一个班级的时候,按照学生的id进行从小到大排序
select c.name, s.* from students as s inner join classes as c on s.cls_id = c.id order by c.name,s.id asc;
(2)左连接 left join … on,以左表为主
例如:
查询每位学生对应的班级信息:
select * from students as s left join classes as c on s.cls_id=c.id;
查询没有对应班级信息的学生:
select * from students as s left join classes as c on s.cls_id=c.id having c.id is null;
(3)右连接 right join … on【跟左连接相似】
-- 查询每位学生对应的班级信息
select * from students left join classes on students.cls_id = classes.id;
select * from classes left join students on students.cls_id = classes.id;
-- 查询没有对应班级信息的学生
-- select ... from xxx as s left join xxx as c on..... having .....
-- select * from students as s left join classes as c on s.cls_id = c.id where c.id is null;
select * from students as s left join classes as c on s.cls_id = c.id having c.id is null;
-- right join on
-- 将数据表名字互换位置,用left join完成
8.9、子查询
例如:
查询最高的男生信息:
select * from students where height=(select max(height) from students gender=‘男’);–注意条件要在里面加
查询出高于平均身高的信息:
select * from students where height>(select avg(height) from students);
查询学生班级号能够对应的学生信息:
select * from students inner join classes onstudents.cls_id=classes.id;
<==>
select * from students where cls_id in (select id from classes);
-- 查询最高的男生信息
select * from students where higt = 170;
select max(higt) from students where gender = '男';
select * from students where higt = (select max(higt) from students where gender = '男');
-- select * from students where higt = 170.4;
select * from students where higt = (select max(higt) from students) and gender='男';
-- select * from students where higt = 175.4;
select * from students where higt = (select max(higt) from students where gender='男') and gender='男';
-- 查询出高于平均身高的信息
select * from students where higt > (select avg(higt) from students);
-- 列级子查询
-- 查询学生的班级号能够对应的学生信息
select * from students where cls_id in (select id from classes);
8.10、自关联
省级联动:链接: link.
例如:
两张表时
select * from provinces where province=‘黑龙江省’;
select * from cities where provinceid =230000;
<==>
select p.province
,c.city from provinces as p inner join cities as c on p.provinceid
=c.provinceid
一张表时:一张表可以当成两张表来用,就是自关联。