(三)MySql多表查询及相关函数介绍

[复制链接]
发表于 2025-11-5 23:22:30 | 显示全部楼层 |阅读模式

  • 数据表select查询语句
  • 多表查询
  • MySQL数据库函数
  • 认识数据库里面的知识

数据表 SELECT 查询语句

格式:


        SELECT                [字段列表] | *


        FROM                 表名


        WHERE                 条件


        GROUP BY         分组字段 [ HAVING 子条件 ]


        ORDER BY         排序 ASC | DESC


        LIMIT                 分页参数


顺序必须是这个顺序

字段部分
1) 查询所有字段
    SELECT * FROM users;
2) 查询部分字段
    SELECT uname,sex,age FROM users;
3) 查询10年后的年龄
    SELECT uname,sex, age+10 FROM users;
4) 给字段起别名
    SELECT uname,sex,age+10 as xxoo FROM users;
5) 列合并, 合并年龄与性别
    SELECT uname,concat(age,'====',sex) xxoo FROM users;
6) 去除重复的字段班级里面的值
    SELECT distinct classid FROM users;
7) 在查询结果中,凭空添加一列
    SELECT *,'北京校区' school FROM users;


条件部分

1) 查询 php189的学生
    SELECT * FROM users WHERE classid='lamp189';
2) 查询 php189班的女生
    SELECT * FROM users WHERE classid='lamp189' AND sex='w';
3) 年龄大于20的学生
    SELECT * FROM users WHERE age > 20;
4) 年龄在 30-40的人
    SELECT * FROM users WHERE age>=30 AND age<=40;
    SELECT * FROM users WHERE age BETWEEN 30 AND 40;
5) age 不在 20-30的人
    SELECT * FROM users WHERE age < 20 OR age > 30;
    SELECT * FROM users WHERE age NOT BETWEEN 20 AND 30;
6) php189班和php185班的女生
    SELECT * FROM users WHERE (classid='lamp189' OR classid='lamp185') AND sex='w';
7) 185班的男生和189班的女生
    SELECT * FROM users WHERE (classid='lamp185' AND sex='m') OR (classid='lamp189' AND sex='w');

8) 找uid为 3, 5, 8, 9, 12的人
    SELECT * FROM users WHERE uid IN (3,5,8,9,12);
9) 找 uid 不是 12, 15, 17的人
    SELECT * FROM users WHERE uid NOT IN (12,15,17);
10) 查询classid值不为NULL的人
    SELECT * FROM users WHERE classid IS NOT NULL;
11) 找名字为2个字的人
    _ 匹配任意一个字符
    SELECT * FROM users WHERE uname LIKE  '__';
12) 找名字中以'李'开头的人
    % 匹配任意个任意字符
    SELECT * FROM users WHERE uname LIKE '李%';
13) 找名字中以'春'结尾的
    SELECT * FROM users WHERE uname LIKE '%春';
14) 找包含'国'的人
    SELECT * FROM users WHERE uname LIKE '%国%';

分组部分

分组伴随着统计, 常用聚合函数:
count(*)         统计个数 注意: count(classid) 不会统计 classid值为NULL的记录
        sum( )         求和 比如符合条件的人的年龄总和
        avg( )         平均值
        max( )         最大值   
        min( )         最小值
1) php189班总共多少人
    SELECT count(*) FROM users where classid = 'php189';
2) 最大年龄, 最小年龄, 平均年龄
   SELECT max(age) FROM users;  
   SELECT min(age) FROM users;  
   SELECT avg(age) FROM users;
3) 查找年龄最大的那个人
   SELECT * FROM users WHERE age=( SELECT max(age) FROM users );
4) 在平均年龄之上的人
   SELECT * FROM users WHERE age>( SELECT avg(age) FROM users );
5) 统计每个班级的人数
   SELECT classid,count(*) renshu FROM users GROUP BY classid;
6) 统计每个班级的男生、女生各多少人
   SELECT classid,sex,count(*) renshu FROM users GROUP BY classid,sex;
7) 统计每个班的男生女生各多少人, 要求在20-30岁之间
   SELECT classid,sex,count(*) renshu FROM users WHERE age>=20 AND age<=30 GROUP BY classid,sex;
8) 统计每个班级多少人, 只显示人数大于 12 的班级
   SELECT classid,count(*) FROM users GROUP BY classid HAVING count(*) >12;
9) 查询各个班级中年龄大于20,性别为男的人数姓名和班级 (数据表: stu)
   为了防止班级里面有重名的现象发生(例如 两个男生都是20岁 以上的)  所以会有count(*)
   SELECT classid,name,count(name) FROM stu WHERE sex = "男" AND age > 20 GROUP BY classid; (使用宽松模式可以)
   严格模式会报以下的错误
截图202511051518453281.png

SELECT group_concat(name),classid,count(name) FROM stu WHERE sex = "男" AND age > 20 GROUP BY classid;
10) 学校评选先进学生,要求平均成绩大于等于90分的学生,并且语文课必须在95分以上,请列出有资格的学生  (数据表: score)
   SELECT classid,group_concat(name) FROM sc WHERE (yw+sx+en)/3>=90 AND yw>=95 GROUP BY classid;
11) 用一条sql语句查询出每门课都大于80分的学生姓名 (数据表: courseinfo)
   SELECT name FROM courseinfo GROUP BY name HAVING min(score) > 80;
   SELECT distinct name FROM courseinfo WHERE name not in (select distinct name from courseinfo where score < 80);


排序部分

ORDER BY 字段名 ASC (升序, 默认)
                  DESC (降序)

1) 年龄从小到大排序
   SELECT * FROM users ORDER BY age;

2) 年龄从大到小排序
   SELECT * FROM users ORDER BY age DESC;

3) 性别先女后男, 年龄从小到大排序  (汉字按照unicode编码排序  女 \u5973   男 \u7537)
   SELECT * FROM users ORDER BY sex,age;

4) 先男后女, 年龄从大到小
   SELECT * FROM users ORDER BY sex DESC, age DESC;

5) 先按班级排序, 再按年龄从大到小
   SELECT * FROM users ORDER BY classid, age DESC;

限制查询部分

limit子句用于限制查询结果返回的数量,常用于分页查询

LIMIT M, N
        M 代表跳过的记录数
        N 代表要显示的记录数

SELECT * FROM users LIMIT 5;                 跳过0条, 显示5条记录
SELECT * FROM users LIMIT 2, 3;                 跳过2条, 显示3条记录

1) 找出年龄最大的3个人 ( 如果第3名和第4名年龄相同, 取uid最大的 )
   SELECT * FROM users ORDER BY age DESC, uid LIMIT 3;

2) php189班女生年龄最小的3个人
   SELECT * FROM users WHERE classid='lamp189' AND sex='w' ORDER BY age LIMIT 3;

3) 女生最多的班级
   SELECT classid, count(*) FROM users WHERE sex='w' GROUP BY classid ORDER BY count(*) DESC LIMIT 1;


多表查询

多表查询也叫关联查询,其就是指一次性查询多张表,并且将每张表得到的数据联系作为查询结果

1) 笛卡尔积查询

由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

SELECT * FROM 表1, 表2;

SELECT * FROM 表1, 表2 WHERE 表1.ID=表2.ID;


2) 内连接查询

内连接(INNER JOIN)主要通过设置连接条件的方式,来移除查询结果中某些数据行的交叉连接,内连接使用 INNER
JOIN 关键字连接两张表,并使用 ON 子句来设置连接条件,内连接中可以省略 INNER 关键字,只用关键字 JOIN

SELECT * FROM 表1 INNER JOIN 表2 ON 表1.ID=表2.ID;

SELECT * FROM 表1 INNER JOIN 表2 ON 表1.ID=表2.ID INNER JOIN 表3 ON 表1.ID=表3.ID


3) 左外连接查询 (以左表为主)

左外连接又称为左连接,使用 LEFT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件,左连接中可
以省略 OUTER 关键字,只使用关键字 LEFT JOIN

SELECT * FROM 左表 LEFT JOIN 右表 ON 左表.ID=右表ID;

4) 右外连接查询 (以右表为主)

右外连接又称为右连接,使用 RIGHT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件,右连接中
可以省略 OUTER 关键字,只使用关键字 RIGHT JOIN

SELECT * FROM 左表 RIGHT JOIN 右表 ON 左表.ID= 右表.ID;


MySQL函数


1.系统信息相关函数
version()   数据库的版本
database()   数据库的名字
user()    返回当前用户名
current_user()   返回当前用户名
system_user()   返回当前用户名
@@datadir    数据库的路径
@@version_compile_os   操作系统
@@version    数据库的版本


2.数据库字符串函数
length()                返回字符串的长度
char_length()        返回字符串的字符数
substring()        截取字符串
substr()                截取字符串
mid()                截取字符串   从1开始取   mid('abcd' , 1, 2)  ==> ab
left()                返回字符串前几个字符
ucase()                转化成大写
lcase()                转化成小写
replace()        替换字符串    replace(str,serach,replace)
concat()                 没有符号的链接字符串    concat('a','b','c')
concat_ws()        含有符号的链接字符串    concat_ws('^','a','b','c')
group_concat()   将多条记录的单个字段合并成一条记录   group_concat(name)
md5()     对字符串进行md5散列
password()  对字符串进行加密


3.数据库数学函数
ord()             返回字符串的第一个字符的ASCII码
ascii()           返回字符串的第一个字符的ASCII码
bin()             返回二进制编码形式
oct()             返回八进制编码形式
hex()             返回十六进制编码形式
floor()           向下取整
ceil()             向上取整
round()          四舍五入
abs()          绝对值
pow(x,y)  返回值x的y次幂
sqrt(n)   返回非负数n的平方根
pi()              返回圆周率
rand()    0~1之间的随机浮点值

练习: 请查询当前用户名的第一个字符的ASCII码和当前数据库名的第二个开始的字符串,以*进行拼接


4.数据库读取文件函数
load_file('服务器上的完整路径名')    读入文件并且作为一个字符串返回文件内容
        select load_file('C:/xampp/htdocs/as.txt');      使用/这个
         select load_file('C:\\xampp/htdocs/xxoo.html');

如果MySQL的版本是 5.7.*

解决办法:
>> show variables like '%secure%';
默认的为NULL。

修改my.ini文件,在[mysqld]下加入
secure_file_priv =

保存重启mysql即可。

截图202511051521331803.png



into outfile 写入文本文件操作
        select '<?php phpinfo(); ?>'  into outfile  'C:/xampp/htdocs/as.txt';
        select * from stu into outfile  'C:/xampp/htdocs/stu.txt';

注意:
        文件名必须全路径(绝对路径)
        用户必须有读写文件的权限 root


5. 数据库其他函数
sleep()       睡眠时间以秒为单位

if(表达式,true, false)         条件判断函数
        select if(substr(database(),1,1) = 'p', sleep(3), 1);

benchmark()   将指定的表达式重复执行指定的次数
select benchmark(10000000, md5('aaa'));



information_schema介绍


information_schema 是MySQL自带的一个信息数据库,其保存着关于MySQL服务器所维护的所有其他数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。也就是说当你建立一个新的数据库,或者在已有的数据库中增删改表的话,都会记录在information_schema库中。
结构
information_schema
/____schemata
|        /____schema_name    表所属的库名               
/____tables
|        /____table_name             表名
|        /____table_schema  表所属的库名               
/____columns
        /____column_name    字段名
        /____table_name           字段所属表名
        /____table_schema    字段所属表所属库的名字
#查询创建了多少个数据库
select schema_name from information_schema.schemata;
#查询数据库中有多少个表
select table_name from information_schema.tables where table_schema = 'bihuo' ;
#查询表里有多少个字段        
select column_name from information_schema.columns where table_schema = 'bihuo' and table_name = 'bh_user';








必火网络安全培训,北京实地培训,月月有开班,零基础入门,四个月打造渗透高手。
详情请加微信:nvhack/153-2000-4362,手机微信同号。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|女黑客安全网 |网站地图 | 津ICP备17008032号-3

GMT+8, 2026-2-2 05:17 , Processed in 0.097777 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表