Navicat可视化软件,多表查询练习、python操作MySQL、SQL注入问题

“Navicat”是一套可创建多个连接的数据库管理工具,用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB和 MongoDB等不同类型的数据库。可以创建、管理和维护数据库。

可以充当很多数据库软件的客户端,提供了图形化界面能够让我们更加快速的操作数据库。

1、下载

Navicat有很多版本,由于好用方便很多人都使用所以它是收费的。正版可以免费体验14天。针对这种图形化软件,版本越新越好。
1)下载网址:(最新版16)
http://www.navicat.com.cn/download/navicat-premium
2)下载:
双击运行下载的软件包,然后点击下一步,然后点击同意许可,选择一个合适的目录(文件层级少,最好D(除了C盘)根目录下容易查找),盘符的大小要足够,然后直接下一步,记住创建桌面图标,以便我们双击桌面图标便可以直接打开软件。

2、初步连接

打开Navicat点击连接>>>选择mysql>>>连接名可以写可不写,主机自己用就写localhost,用户名就是mysql登录写的用户名,密码就是登录密码>>>先点左下角的测试连接,如果Navicat到数据库的线变成绿色,说明连接成功,点击右下角的确定(完成)

3、基本使用

  • 建数据库
建数据库:右键点击我们连接好的localhost_3306>>>选择新建数据库>>>写上数据库名,字符集(字符编码)写utf8或者utf8mb4(功能更多,支持表情),排序规则不用选择>>>点击确定

  • 建表
建表:双击点击我们新建好的数据库>>>选择表右键新建表>>>输入建表的字段,字段类型>>>点击保存
# 新建表的时候可以点击上方栏的'SQL'预览,可查看自己创建表的SQL语句,可以自己修改SQL语句
  • 设置主键
设置主键:勾选'不是null',然后在'键'输入空格或者点击一下,正下方勾选'自动递增'>>>若再添加字段可以按住'tab'键或者点击上方的'添加字段'(Navicat非常智能,按住'tab'键会自动补全数据类型)
  • 设置外键
设置外键:右键点击表选择'设计表',连接表上方的选择栏选择外键,输入外键名,字段点击表右方的'...'选择字段,'被引用模式'就是本身所在的数据库,'被引用的表(父)'选择右方下拉栏选择表(就是主表有主键的表),'被引用的字段'选择右方的'...'选择字段(设置为主键的字段),删除时和更新时选择'CASCADE'表示级联更新级联删除

'''设置一对一的外键的需要自己在‘SQL预览’里手动写上unique关键字添加在外键的字段后面'''
  • 查看表
查看表:双击点击表名
  • 查看表结构
查看表结构:右键点击表>>>点击选择'设计表'
  • 查看表与表之间的联系
查看表与表之间的联系:右键点击选择表所在的数据库名>>>点击选择'逆向数据库到模型'>>>表之间有线连接表示两张表右联系
  • 转储SQL文件
转储SQL文件:右键点击要存储的的数据库>>>点击选择'存储SQL文件'
# 可将存储的SQL文件发送他人,转储的格式分为两种,一种为'数据和结构'可将自己插入的数据一并存储,另一种为'仅结构'只有自己创建的数据库和表的SQL语句,没有自己插入的数据
  • 运行SQL文件
运行SQL文件:新建数据库>>>右键点击数据库选择'运行SQL文件'>>>选择要运行的SQL文件
  • 查询SQL语句
查询:点击连接的右方的'新建查询'>>>手动写入SQL语句(可在下拉栏选择查询的数据库)

'''
注意:
    选中要运行的语句点击运行按钮可查询单条的SQL语句
    若直接点击运行,则执行整个查询框里面的所有SQL语句

SQL中的注释:(快捷键:Ctrl+?)
    -- 单行注释
    # 单行注释
    /*注释内容*/ 多行注释
'''

多表查询练习题

数据准备

CREATE TABLE `class` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(32) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班');

CREATE TABLE `course` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(32) NOT NULL,
  `teacher_id` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `fk_course_teacher` (`teacher_id`),
  CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2');

CREATE TABLE `score` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `num` int(11) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_score_student` (`student_id`),
  KEY `fk_score_course` (`course_id`),
  CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
  CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;

INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');

CREATE TABLE `student` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `gender` char(1) NOT NULL,
  `class_id` int(11) NOT NULL,
  `sname` varchar(32) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_class` (`class_id`),
  CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

INSERT INTO `student` VALUES ('1', '男', '1', '理解'), ('2', '女', '1', '钢蛋'), ('3', '男', '1', '张三'), ('4', '男', '1', '张一'), ('5', '女', '1', '张二'), ('6', '男', '1', '张四'), ('7', '女', '2', '铁锤'), ('8', '男', '2', '李三'), ('9', '男', '2', '李一'), ('10', '女', '2', '李二'), ('11', '男', '2', '李四'), ('12', '女', '3', '如花'), ('13', '男', '3', '刘三'), ('14', '男', '3', '刘一'), ('15', '女', '3', '刘二'), ('16', '男', '3', '刘四');

CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(32) NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `teacher` VALUES ('1', '张磊老师'), ('2', '李平老师'), ('3', '刘海燕老师'), ('4', '朱云海老师'), ('5', '李杰老师');

SET FOREIGN_KEY_CHECKS = 1;

1.查询所有课程的名称以及对应的任课老师姓名

# 1.先确定几张表,课程表、老师表
# 2.简单查看每张表中的数据
-- select * from course;
-- select * from teacher;
# 3.思考逻辑,多表查询
SELECT
	course.cname,
	teacher.tname 
FROM
	course
	INNER JOIN teacher ON course.teacher_id = teacher.tid;

2.查询平均成绩大于八十分的同学和平均成绩

# 1.先查询每个学生的平均成绩
-- select student_id,avg(num) from score group by student_id;
# 2.查询平均成绩大于80分的学生
-- select student_id,avg(num) as avg_num from score group by student_id having avg(num)>80;
# 3.上述表中查询平均成绩,学生表里查询学生姓名,两张表
-- select * from student inner join (select student_id,avg(num) as avg_num from score group by student_id having avg(num)>80) as t1 on student.sid=t1.student_id;
# 4.上述表中获取女生姓名以及平均成绩
SELECT
	student.sname,
	t1.avg_num 
FROM
	student
	INNER JOIN ( SELECT student_id, avg( num ) AS avg_num FROM score GROUP BY student_id HAVING avg( num )> 80 ) AS t1 ON student.sid = t1.student_id;

3.查询没有报李平老师课程的学生姓名

# 1.查询李平老师的老师编号
-- select tid from teacher where tname='李平老师';
# 2.根据老师编号查询李平老师教授了哪些课程
-- select cid from course where teacher_id in (select tid from teacher where tname='李平老师');
# 3.根据李平老师教授的课程编号查询有哪些学生上了这些课(学生编号)
-- select distinct student_id from score where course_id in (select cid from course where teacher_id in (select tid from teacher where tname='李平老师'));
# 4.根据学生编号查询报名了学生的姓名
-- select sname from student where sid in (select distinct student_id from score where course_id in (select cid from course where teacher_id in (select tid from teacher where tname='李平老师')));
# 上述结果取反
SELECT
	sname 
FROM
	student 
WHERE
	sid NOT IN (
	SELECT DISTINCT
		student_id 
	FROM
		score 
	WHERE
		course_id IN (
		SELECT
			cid 
		FROM
			course 
		WHERE
		teacher_id IN ( SELECT tid FROM teacher WHERE tname = '李平老师' )));

4.查询没有同时选修物理课程和体育课程的学生姓名

# 1.查询物理和体育的课程编号
-- select cid from course where cname in ('物理','生物');
# 2.查询选了物理和生物的学生编号
-- select student_id from score where course_id in (select cid from course where cname in ('物理','生物'));
# 3.统计每个学生报了几门课,学生编号
-- select student_id from score where course_id in (select cid from course where cname in ('物理','生物')) group by student_id having count(course_id)=1;
# 4.根据学生编号查询学生姓名
SELECT
	sname 
FROM
	student 
WHERE
	sid IN (
	SELECT
		student_id 
	FROM
		score 
	WHERE
		course_id IN (
		SELECT
			cid 
		FROM
			course 
		WHERE
		cname IN ( '物理', '生物' )) 
	GROUP BY
		student_id 
	HAVING
	count( course_id )= 1);

5.查询挂科超过两门(包括两门)的学生姓名和班级

# 1.查询成绩小于60分的学生编号
-- select student_id from score where num<60;
# 2.查询每个学生的小于60分的学生编号
-- select student_id from score where num<60 group by student_id Having count(course_id)>=2;
# 3.在学生表里查学生姓名,在班级表里查班级
SELECT
	student.sname,
	class.caption 
FROM
	student
	INNER JOIN class ON student.class_id = class.cid 
WHERE
	student.sid IN ( SELECT student_id FROM score WHERE num < 60 GROUP BY student_id HAVING count( course_id )>= 2 );

python操作MySQL

1、第三方模块

pip install pymysql

2、基本操作

import pymysql

# 连接服务
conn = pymysql.connect(
    host='127.0.0.1',  # 以后就是公司的IP
    port=3306,  # mysql的端口号
    user='root',
    password='313',
    database='db2',  # 想要操作的数据库
    charset='utf8mb4'
)
# 产生一个右表对象(等待输入命令)
# cursor = conn.cursor()  # 等到的数据值以元组的方式展示
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 将查询出来的数据以字典的形式展示
# 编写SQL语句
sql1 = 'select * from student'  # 可以不用写;
# 发送给服务端
cursor.execute(sql1)
# 获取命令的执行结果
res = cursor.fetchall()
print(res)

二次确认

在连接服务的配置内写入:autocommit=True

import pymysql

# 连接服务
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='313',
    database='db2',
    charset='utf8mb4',
    # 方式二:配置固定参数
    autocommit=True  # 执行增、改、删操作自动执行
)
# 产生一个右表对象(等待输入命令)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 编写SQL语句
sql1 = 'insert into student(gender,class_id,sname) values("男",1,"小橘")'  # 可以不用写;
# sql2 = 'update student set sanme="小红" where sid=1'
# sql3 = 'delete from student'
# 发送给服务端
ret = cursor.execute(sql1)
print(ret)  # 该方法的返回值 意思是执行SQL语句表中受影响的行数 没什么实际作用

'''
# 方式一:二次确认,手动编写
conn.commit()
'''

# 获取命令的执行结果
res = cursor.fetchall()

获取结果

cursor.fetchall():获取结果集中所有数据

获取游标所在处开始及以下所有的数据,并以元组的形式返回,元组的每一个元素都也是一个由一 行数据组成的元组,如果游标所在处没有数据,将返回空元组。执行完这个方法后,游标将移动到数 据库表的最后。

import pymysql

# 连接服务
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='313',
    database='db2',
    charset='utf8mb4',
    autocommit=True  # 执行增、改、删操作自动执行
)
# 产生一个右表对象(等待输入命令)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 编写SQL语句
sql1 = 'select * from student'  # 可以不用写;
# sql2 = 'update student set sanme="小红" where sid=1'
# sql3 = 'delete from student'
# 发送给服务端
ret = cursor.execute(sql1)
# print(ret)  # 该方法的返回值 意思是执行SQL语句表中受影响的行数 没什么实际作用
# 二次确认
# conn.commit()
# 获取命令的执行结果
res = cursor.fetchall()  # 获取所有的数据,结果是列表套字典
res1 = cursor.fetchall()  # 指针当前在最后的位置,所以读取不了内容(内容为空)
print(res)
print(res1)
# [{'sid': 1, 'gender': '男', 'class_id': 1, 'sname': '理解'}]
# []

cursor.fetchone():获取结果集中一条数据

从execute()函数的查询结果中取数据,以元组的形式返回游标所在处的一条数据,如果游标 所在处没有数据,将返回空元组,该数据执行一次,游标向下移动一个位置。fetchone()函数必须 跟exceute()函数结合使用,并且在exceute()函数之后使用。

import pymysql

# 连接服务
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='313',
    database='db2',
    charset='utf8mb4',
    autocommit=True  # 执行增、改、删操作自动执行
)
# 产生一个右表对象(等待输入命令)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 编写SQL语句
sql1 = 'select * from student'  # 可以不用写;
# sql2 = 'update student set sanme="小红" where sid=1'
# sql3 = 'delete from student'
# 发送给服务端
ret = cursor.execute(sql1)
# print(ret)  # 该方法的返回值 意思是执行SQL语句表中受影响的行数 没什么实际作用
# 二次确认
# conn.commit()
# 获取命令的执行结果
res = cursor.fetchone()
print(res)
res = cursor.fetchone()
print(res)
# {'sid': 1, 'gender': '男', 'class_id': 1, 'sname': '理解'}
# {'sid': 2, 'gender': '女', 'class_id': 1, 'sname': '钢蛋'}

cursor.fetchmany():获取结果集中指定条的数据

从exceute()函数结果中获取游标所在处的size条数据,并以元组的形式返回,元组的每一个元素 都也是一个由一行数据组成的元组,如果size大于有效的结果行数,将会返回cursor.arraysize条 数据,但如果游标所在处没有数据,将返回空元组。查询几条数据,游标将会向下移动几个位置。 fetmany()函数必须跟exceute()函数结合使用,并且在exceute()函数之后使用。

import pymysql

# 连接服务
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='313',
    database='db2',
    charset='utf8mb4',
    autocommit=True  # 执行增、改、删操作自动执行
)
# 产生一个右表对象(等待输入命令)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 编写SQL语句
sql1 = 'select * from student'  # 可以不用写;
# sql2 = 'update student set sanme="小红" where sid=1'
# sql3 = 'delete from student'
# 发送给服务端
ret = cursor.execute(sql1)
# print(ret)  # 该方法的返回值 意思是执行SQL语句表中受影响的行数 没什么实际作用
res = cursor.fetchmany(2)
print(res)
# [{'sid': 1, 'gender': '男', 'class_id': 1, 'sname': '理解'}, {'sid': 2, 'gender': '女', 'class_id': 1, 'sname': '钢蛋'}]
res1 = cursor.fetchall(100)
print(res1)  # 有多少展示多少条,不会报错

cursor.scroll(2, mode='relative'):基于当前位置往后移动

cursor.scroll(0, mode='absolute'):基于数据集开头的位置往后移

类似于文件的光标

import pymysql

# 连接服务
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='313',
    database='db2',
    charset='utf8mb4',
    autocommit=True  # 执行增、改、删操作自动执行
)
# 产生一个右表对象(等待输入命令)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 编写SQL语句
sql1 = 'select * from student'  # 可以不用写;
# sql2 = 'update student set sanme="小红" where sid=1'
# sql3 = 'delete from student'
# 发送给服务端
ret = cursor.execute(sql1)
# print(ret)  # 该方法的返回值 意思是执行SQL语句表中受影响的行数 没什么实际作用

'''cursor.scroll(2,mode='relative')'''
# res = cursor.fetchone()  # 获取所有的数据,结果是列表套字典
# print(res)
# cursor.scroll(2,mode='relative')
# res = cursor.fetchone()
# print(res)
# {'sid': 1, 'gender': '男', 'class_id': 1, 'sname': '理解'}
# {'sid': 4, 'gender': '男', 'class_id': 1, 'sname': '张一'}

'''cursor.scroll(1,mode='absolute')'''
res1 = cursor.fetchone()
print(res1)
cursor.scroll(1,mode='absolute')
res1 = cursor.fetchone()
print(res1)
# {'sid': 1, 'gender': '男', 'class_id': 1, 'sname': '理解'}
# {'sid': 2, 'gender': '女', 'class_id': 1, 'sname': '钢蛋'}

SQL注入问题

SQL注入:
select * from student where sname='jason' -- haha' and pwd=''
select * from student where sname='xyz' or 1=1  -- heihei' and pwd=''

本质:利用一些特殊符号的组合产生了特殊的含义从而逃脱了正常的业务逻辑

解决:针对用户输入的数据不要自己处理,交给专门的方法自动过滤
sql1 = 'select * from student where sname=%s'  # 可以不用写;
cursor.executemany(sql1,('jason',))  # 自动识别%s 并自动过滤各种符合 最后合并数据

'''
cursor.executemany()
可执行多条mysql的语句,如插入数据
eg:
    sql1 = 'insert into student(gender,class_id,sname) values("男",1,"小橘")'  # 可以不用写;
    cursor.executemany(sql1,[('男',2,'jason'),('女',1,'lili')])
'''

知识点补充

1.as语法
给字段起别名,给表起表名


2.comment语法
给表、字段添加注释信息
create table t1(id int) comment '这个表叫t1';
show create table t1;

mysql> create table t2(
    -> id int comment '编号',
    -> name varchar(32) comment '用户名') comment '这个表叫t2';
Query OK, 0 rows affected (0.03 sec)

mysql> show create table t2;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                             |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t2    | CREATE TABLE `t2` (
  `id` int(11) DEFAULT NULL COMMENT '编号',
  `name` varchar(32) DEFAULT NULL COMMENT '用户名'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='这个表叫t2'          |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

'''
查看注释的方法(地方):
show create table 表名;
use information_schema;   >>> select * from tables where table_name='表名'\G;
'''


3.concat、concat_ws语法
concat:用于分组之前的多个字段数据的拼接
concat_ws:如果有多个字段,且字段之间的分隔符一致,使用该方法减少代码
select concat(gender,':',sname) from student;
select concat_ws('|',gender,class_id,sname) from student;
代码演示:
mysql> select concat(gender,':',sname) from student;
+--------------------------+
| concat(gender,':',sname) |
+--------------------------+
| 男:理解                  |
| 女:钢蛋                  |
| 男:张三                  |
| 男:张一                  |
| 女:张二                  |
| 男:张四                  |
| 女:铁锤                  |
| 男:李三                  |
| 男:李一                  |
| 女:李二                  |
| 男:李四                  |
| 女:如花                  |
| 男:刘三                  |
| 男:刘一                  |
| 女:刘二                  |
| 男:刘四                  |
+--------------------------+
16 rows in set (0.00 sec)

mysql> select concat_ws('|',gender,class_id,sname) from student;
+--------------------------------------+
| concat_ws('|',gender,class_id,sname) |
+--------------------------------------+
||1|理解                            |
||1|钢蛋                            |
||1|张三                            |
||1|张一                            |
||1|张二                            |
||1|张四                            |
||2|铁锤                            |
||2|李三                            |
||2|李一                            |
||2|李二                            |
||2|李四                            |
||3|如花                            |
||3|刘三                            |
||3|刘一                            |
||3|刘二                            |
||3|刘四                            |
+--------------------------------------+
16 rows in set (0.00 sec)


4.exists语法(exists后面的SQL语句有返回值则执行前面的SQL语句)
内层查询语句不返回查询的记录,如果返回一个真假值,如果内层的查询语句查询到满足条件的语句的记录就返回一个真值(TRUE),否则返回一个假值(False)。当返回的值为TRUE是,外层查询语句将进行查询,当返回结果为false时,外层语句不会进行查询。
代码演示:
mysql> select * from student where exists (select * from class where cid<5);
+-----+--------+----------+--------+
| sid | gender | class_id | sname  |
+-----+--------+----------+--------+
|   1 ||        1 | 理解   |
|   2 ||        1 | 钢蛋   |
|   3 ||        1 | 张三   |
|   4 ||        1 | 张一   |
|   5 ||        1 | 张二   |
|   6 ||        1 | 张四   |
|   7 ||        2 | 铁锤   |
|   8 ||        2 | 李三   |
|   9 ||        2 | 李一   |
|  10 ||        2 | 李二   |
|  11 ||        2 | 李四   |
|  12 ||        3 | 如花   |
|  13 ||        3 | 刘三   |
|  14 ||        3 | 刘一   |
|  15 ||        3 | 刘二   |
|  16 ||        3 | 刘四   |
+-----+--------+----------+--------+
16 rows in set (0.00 sec)

'''exists后面的SQL语句如果有结果那么执行前面的SQL语句,如果没有结果则不执行'''
posted @   努力努力再努力~W  阅读(680)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示