十二、Python数据库优化-MySQL基础

一、数据库介绍

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

一张表时:一张表可以当成两张表来用,就是自关联。

九、数据库总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值