MySQL - in与exists 小表驱动大表

小表驱动大表:
写sql前确定几件事:
以员工(emp)和部门(dept)为例
1、谁在外(左),谁在里(右)(根据中文描述来判断)
找出指定部门里的员工:员工在外(左),部门在里(右)
找出有员工参加的部门:部门在外(左),员工在里(右)

2、谁大谁小(根据数据量)
当小表在里时,使用in
当大表在里时,使用exists

正解:

select * from tb_emp A where A.deptno in (select B.deptno from tb_dept B)
//select * from A where A.id in (select id from B);
select * from tb_dept A where exists (select 1 from tb_emp B where A.id=B.deptno) 
//select ... from table where exists (subquery)   将主查询到的数据,放进子查询中做条件验证,根据结果(true/false)来决定主查询的数据是否得以保留
//subquery:  select 1或*或'X'或任何常量 from B where A.id=B.id);


下面结论都是针对in或exists的。
in后面跟的是小表,exists后面跟的是大表。
简记:in小,exists大。
对于exists
select .....from table where exists(subquery);
可以理解为:将主查询的数据放入子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据是否得以保留。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是详细的步骤: 1. 打开 Visual Studio,新建一个 WinForm 项目。 2. 添加 Excel 操作库和 MySQL 数据库驱动程序到项目引用中。可以使用 NuGet 包管理器来安装这些库。 3. 在 WinForm 界面上添加一个“选择文件”按钮和一个“导入”按钮,以及一个文本框用于显示导入进度。 4. 在“选择文件”按钮的 click 事件中,使用 OpenFileDialog 对话框来选择要导入的 Excel 文件。 ``` private void btnSelectFile_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Excel 文件|*.xlsx;*.xls"; if (openFileDialog.ShowDialog() == DialogResult.OK) { txtFilePath.Text = openFileDialog.FileName; } } ``` 5. 在“导入”按钮的 click 事件中,首先读取 Excel 文件中的数据。您可以使用 ExcelDataReader 库来实现这一点。读取完数据后,将其存储到一个 DataTable 中。 ``` private void btnImport_Click(object sender, EventArgs e) { string filePath = txtFilePath.Text; if (string.IsNullOrEmpty(filePath)) { MessageBox.Show("请选择要导入的 Excel 文件!"); return; } try { using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read)) { using (var reader = ExcelReaderFactory.CreateReader(stream)) { DataTable dataTable = new DataTable(); dataTable.Load(reader); dataGridView.DataSource = dataTable; ImportToDatabase(dataTable); } } } catch (Exception ex) { MessageBox.Show("导入失败:" + ex.Message); } } ``` 6. 使用 MySQL 数据库驱动程序连接 MySQL 数据库,并创建一个表来存储 Excel 数据。您可以使用以下代码来创建表: ``` private void CreateDatabaseTable() { string connectionString = "server=localhost;user=root;password=123456;database=mydatabase;"; using (MySqlConnection connection = new MySqlConnection(connectionString)) { connection.Open(); MySqlCommand command = connection.CreateCommand(); command.CommandText = "CREATE TABLE IF NOT EXISTS `excel_data` (`id` INT NOT NULL AUTO_INCREMENT, `column1` VARCHAR(255), `column2` VARCHAR(255), `column3` VARCHAR(255), PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;"; command.ExecuteNonQuery(); } } ``` 7. 遍历 DataTable 中的每一行,将数据插入到 MySQL 数据库中。您可以使用以下代码来实现这一点: ``` private void ImportToDatabase(DataTable dataTable) { string connectionString = "server=localhost;user=root;password=123456;database=mydatabase;"; using (MySqlConnection connection = new MySqlConnection(connectionString)) { connection.Open(); MySqlCommand command = connection.CreateCommand(); command.CommandText = "INSERT INTO excel_data (column1, column2, column3) VALUES (@column1, @column2, @column3)"; command.Parameters.Add("@column1", MySqlDbType.VarChar); command.Parameters.Add("@column2", MySqlDbType.VarChar); command.Parameters.Add("@column3", MySqlDbType.VarChar); foreach (DataRow row in dataTable.Rows) { command.Parameters["@column1"].Value = row["column1"].ToString(); command.Parameters["@column2"].Value = row["column2"].ToString(); command.Parameters["@column3"].Value = row["column3"].ToString(); command.ExecuteNonQuery(); } } } ``` 8. 在插入数据时,使用事务来确保数据的完整性和一致性。您可以使用以下代码来实现这一点: ``` private void ImportToDatabase(DataTable dataTable) { string connectionString = "server=localhost;user=root;password=123456;database=mydatabase;"; using (MySqlConnection connection = new MySqlConnection(connectionString)) { connection.Open(); MySqlCommand command = connection.CreateCommand(); command.CommandText = "INSERT INTO excel_data (column1, column2, column3) VALUES (@column1, @column2, @column3)"; command.Parameters.Add("@column1", MySqlDbType.VarChar); command.Parameters.Add("@column2", MySqlDbType.VarChar); command.Parameters.Add("@column3", MySqlDbType.VarChar); MySqlTransaction transaction = null; try { transaction = connection.BeginTransaction(); command.Transaction = transaction; foreach (DataRow row in dataTable.Rows) { command.Parameters["@column1"].Value = row["column1"].ToString(); command.Parameters["@column2"].Value = row["column2"].ToString(); command.Parameters["@column3"].Value = row["column3"].ToString(); command.ExecuteNonQuery(); } transaction.Commit(); MessageBox.Show("导入成功!"); } catch (Exception ex) { transaction.Rollback(); MessageBox.Show("导入失败:" + ex.Message); } } } ``` 9. 在导入数据时,显示导入进度。您可以使用以下代码来实现这一点: ``` private void ImportToDatabase(DataTable dataTable) { string connectionString = "server=localhost;user=root;password=123456;database=mydatabase;"; using (MySqlConnection connection = new MySqlConnection(connectionString)) { connection.Open(); MySqlCommand command = connection.CreateCommand(); command.CommandText = "INSERT INTO excel_data (column1, column2, column3) VALUES (@column1, @column2, @column3)"; command.Parameters.Add("@column1", MySqlDbType.VarChar); command.Parameters.Add("@column2", MySqlDbType.VarChar); command.Parameters.Add("@column3", MySqlDbType.VarChar); MySqlTransaction transaction = null; int rowCount = dataTable.Rows.Count; try { transaction = connection.BeginTransaction(); command.Transaction = transaction; for (int i = 0; i < rowCount; i++) { DataRow row = dataTable.Rows[i]; command.Parameters["@column1"].Value = row["column1"].ToString(); command.Parameters["@column2"].Value = row["column2"].ToString(); command.Parameters["@column3"].Value = row["column3"].ToString(); command.ExecuteNonQuery(); float progress = ((float)i / (float)rowCount) * 100; lblProgress.Text = string.Format("导入进度:{0:F2}%", progress); Application.DoEvents(); } transaction.Commit(); MessageBox.Show("导入成功!"); } catch (Exception ex) { transaction.Rollback(); MessageBox.Show("导入失败:" + ex.Message); } } } ``` 10. 最后,测试您的应用程序并检查是否成功导入了 Excel 数据到 MySQL 数据库中。 希望这些步骤可以帮助您实现目录导入工具的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值