delete语句不协助外号,navicate怎么用sql语句插入一条语句

1.打开数据库:找到表,双击要插入的表张开:

一.张开数据库:找到表,双击要插入的表展开:

SQLite的使用–SQLite语句,sqlite–sqlite语句

一.SQLite的牵线   一.为啥要存款和储蓄数据?        1.1手提式有线电话机数码大概都以从互连网加载的,不存储,每一回滚动分界面都要从新发送网络请求加载数据,浪费流量
     一.二 当用户没网的时候,就不能够健康呈现分界面了      壹.3将数据存款和储蓄到本地,不用每一趟加载,没网的时候也可从本土存款和储蓄的多寡拿来呈现  
贰.积累数据的不二秘技         Plist(NSArray\NSDictionary)           特点:
只可以存款和储蓄系统自带的数据类型, 举例NSDictory, NSArray等等.
自定义的靶子不可能积累      Preference(偏好设置\NSUserDefaults)     
     特点: 本质正是二个plist文件; 也是只可以存款和储蓄系统自带的数据类型,
自定义的靶子无法积累      NSCoding(NSKeyedArchiver\NSkeyedUnarchiver)
特点: 能够积存自身定义的数据类型, 然则都以壹遍性的全体据操作
     SQLite3           特点: 存储一些大量的数目, 排序, 总计等操作
     Core Data           特点: 对SQLite三的一层面向对象的卷入,
本质照旧要转移成为对应的SQL语句去执行     在全部的存款和储蓄情势中,SQLite速度最快,作用最高.   ③.什么样是SQLite?

  • SQLite是一款轻型的嵌入式关全面据库
  • 它占用能源丰富的低,在嵌入式设备中,大概只须要几百K的内部存款和储蓄器就够了
  • 当下普及应用于运动装备中蕴藏数据(Android/iOS)
  • 拍卖多少的快慢相当慢,功能越来越高

四.怎么是数据库?

  • 数据库(Database)是根据数据结构来集团、存款和储蓄和保管数据的库房(类似于excel表格)
  • 数据库能够分为二大种类(驾驭)
    • 关系型数据库(主流)
    • 对象型数据库 

五.关系型数据库介绍
 997755.com澳门葡京 1  
二.Navicat软件的破解   一.怎么样是Navicat?    
 Navicat是数据库管理软件,援助半数以上主流数据库(包罗SQLite)(收取金钱,要破解)  
   能够因此图形化分界面的章程来治本数据库  
贰.有破解版,能够去网络搜索下载,自个儿设置,那里不做牵线  
叁.Navicat软件的行使   1.创建SQLite数据库
 997755.com澳门葡京 2

 

997755.com澳门葡京 3
  2.创制表      二.一 双击张开数据库,在tables中式点心击右键,选中NewTable    
 二.二 创设表中对应的字段,点击”+”增添字段        二.三 保存,要安装表格名称.
名称正式:  t_名称 如: t_student
 997755.com澳门葡京 4  
三.装置主键,添增添少      三.一 什么是主键          
主键就一定于身份证同样,用来区分每一条数据
 997755.com澳门葡京 5      
 3.二 设置主键注意点
 997755.com澳门葡京 6      
 三.叁 增加,删除,修改数据           三.3一 直接点击”+” 加多数据           
     注意:主键的值不要涂改           3.3贰 删除,选中1行,点击”-“ 直接删除
                 注意:删除壹组数据后,主键值就不会再被回收利用.
二个主键值只对应一条数据,无论数额是不是存在           叁.3叁 修改数据      
         双击想要修改的数量,直接修改    4.SQLite的使用手续  
壹.创造数据库(二个用于存款和储蓄数据的文书)      平日后缀名叫: .db 或 .sqlite  
二.开立表用于积攒数据   

  • delete语句不协助外号,navicate怎么用sql语句插入一条语句。开创表时须要钦命该表有何样字段
  • 譬如说学生表有:学号/姓名/年龄/身高档

三.对表实行增加和删除改查操作

  • 譬如说加多一条学生数量:型号:1/姓名:why/年龄:18/身高:一.8八     

5.SQL简单介绍   1.怎么在先后中央银行使SQLite?    
 真实使用SQLite时用代码来操作的   贰.怎么用代码操作SQLite?    
 使用SQL语句来操作   三.SQL介绍  不做过多介绍,直接看下定义就行了
 997755.com澳门葡京 7  
陆.在代码中央银行使DDL(数据定义语句)   壹.初步入libsqlite3.tba框架(c语言)  
2.创办桥接文件,配置桥接文件(不会的话,看前边笔记)   三.开立数据库

       // 创建数据库
        // 文件路径 :
        // 1.获取数据库的存放路径(沙盒中)
        let filePath = "/Users/xiaomage/Desktop/123.sqlite"
        let cString = filePath.cStringUsingEncoding(NSUTF8StringEncoding)!

        // 2.定义数据库对象(后面还要用,定义一个属性替代)
        // var db : COpaquePointer = nil

        // 3.打开/创建 数据库对象
        if sqlite3_open(cString, &db) == SQLITE_OK {
            print("创建/打开数据库成功")
        } else {
            print("失败")
        }
    }

  4.创办表      4.一 成立SQL语句      四.二 试行语句(要对语句进行判定)  if
 语句 == SQLITE_OK       4.三 创造表格式        
  CREATE TABLE IF NOT EXISTS '表名' (        '字段名' 类型(INTEGER, REAL, TEXT, BLOB)                NOT NULL    不允许为空                PRIMARY KEY    主键                AUTOINCREMENT 自增长,        '字段名2' 类型,        ...
    )      四.四 语句表达    

  • CREATE TABLE:创立一张表
  • IF NOT EXISTS:不存在则开创
  • ‘t_student’:表的名号
  • NOT NULL:不容许为空
  • PRIMARY KEY:主键
  • AUTOINCREMENT:自动扩大
  • ‘id’ INTEGER:有一个ID字段,类型是INTEGER

997755.com澳门葡京 8
 五.删除表      5.1删除表的格式 DROP TABLE IF EXISTS '表名';      
 5.2 语句表明      DROP TABLE:删除表      IF EXISTS:存在则删除
     ‘表名’:要去除的表的名目

 1        // 1.获取要执行的SQL语句
 2         let createTableSQL = "DROP TABLE IF EXISTS t_student;"
 3        
 4         // 2.执行语句
 5         if sqlite3_exec(db, createTableSQL.cStringUsingEncoding(NSUTF8StringEncoding)!, nil, nil, nil) == SQLITE_OK {
 6             print("删除表成功")
 7         } else {
 8             print("删除表失败")
 9         }
10     }

  陆.封装SQL语句      六.壹 创立/张开数据库的代码全部均等,能够打包起来    
 陆.二 成立语句,推行语句步骤都如出1辙,只有语句的始末不壹致,能够把语句当做参数,封装起来      陆.叁封装工具类,最佳把实例对象设计为单例

class SQLiteManager {

    // 设计单例对象
    static let shareInstance : SQLiteManager = SQLiteManager()

    // 数据库对象
    var db : COpaquePointer = nil
}


// MARK:- 打开数据库的操作
extension SQLiteManager {
    func openDB(filePath : String) -> Bool {
        // 1.将Swift字符串转成C语言的字符串
        let cString = filePath.cStringUsingEncoding(NSUTF8StringEncoding)!

        // 3.打开/创建数据库对象
        return sqlite3_open(cString, &db) == SQLITE_OK
    }
}


// MARK:- 执行SQL语句
extension SQLiteManager {
    func execSQL(sqlString : String) -> Bool {
        // 1.将Swift字符串转成C语言的字符串
        let cSQLString = sqlString.cStringUsingEncoding(NSUTF8StringEncoding)!

        // 2.执行语句
        return sqlite3_exec(db, cSQLString, nil, nil, nil) == SQLITE_OK
    }
}

  七.在代码中应用DML(数据操作语句)   ①.插入数据      一.1 插入数据格式
INSERT INTO 't_student' (name, age, height) VALUES ('why', 18, 1.88);
     一.贰 语句表明

  • INSERT INTO: 插入数据
  • ‘t_student’: 在哪3个表中插入数据
  • (数据的字段): 给什么字段插入数据
  • VALUES (‘why’, 1八, 一.8八): 插入的具体值

 // 1.插入数据(获取插入语句)
 let insertSQL = "INSERT INTO t_student (name, age, height) VALUES ('why', 18, 1.88);"
 // 2.执行语句
 SQLiteManager.shareInstance.execSQL(insertSQL)

  二.创新数据      一.一 更新数据格式
UPDATE 't_student' SET 字段 = '值' WHERE 条件判断;        壹.2 语句表明

  • UPDATE: 跟新数据
  • ‘t_student’: 在哪三个表中更新数据
  • SET 字段 = ‘值’: 更新怎么着的数目
  • WHERE 条件推断: 更新哪些数据

       // 1.获取更新语句
        let updateSQL = "UPDATE t_student SET name = 'yz';" 
        // 2.执行语句
        SQLiteManager.shareInstance.execSQL(updateSQL)

  三.删减数据      3.一 删除数据格式 DELETE FROM t_student;
DELETE FROM t_student WHERE age < 50;        3.贰 语句表达

  • DELETE FROM: 从表中删除数据
  • t_student : 表名
  • 可以跟条件也足以不跟:不跟代表删除全体的数目

         // 1.获取删除语句
        let deleteSQL = "DELETE FROM t_student;"  
        // 2.执行语句
        SQLiteManager.shareInstance.execSQL(deleteSQL)

  四.实际花费怎么着插入数据      四.壹 真实开销插入数据,不只怕一条一条去写  
   肆.二 一般的话,大家开辟都以面向模型的      四.3能够把要插入的多少包装成模型      四.四 在模型中提供格局,快捷插入数据    
 肆.5 遍历模型数组,利用模型中高速插入数据的点子插入数据        
伍.怎么把数据包装成模型?    
 遍历数据,把数量的每二个字段作为模型的品质保存起来

     // 模拟从网络服务器中请求到很多数据(实际中数据是网络来的,这里自己写模拟)
        for _ in 0..<100 {
            let name = "zs\(arc4random_uniform(100))"
            let age = Int(10 + arc4random_uniform(10))
            let height = 1 + Double(arc4random_uniform(10)) / 10.0

            let stu = Student(name: name, age: age, height: height)

            stus.append(stu)
        }

  模型中代码:

 1      class Student: NSObject {
 2          var name : String = ""
 3          var age : Int = 0
 4          var height : Double = 0.0
 5    
 6          init(name : String, age : Int, height : Double) {
 7              self.name = name
 8              self.age = age
 9              self.height = height
10          }
11      }
12  
13      extension Student {
14          func insertDB() {
15              // 1.插入数据(获取插入语句)
16              let insertSQL = "INSERT INTO t_student (name, age, height) VALUES ('\(name)', \(age), \(height));" 
17              // 2.执行语句
18              SQLiteManager.shareInstance.execSQL(insertSQL)
19          }
20      }

  调整器中快捷插入     

for stu in stus {
    stu.insertDB()
 }

  ⑥.插入数据的优化      6.1 倘若有大气数据插入,在主线程实施,会阻塞ui    
 陆.二 插入大量数量怎么优化?           陆.二1 在子线程实行多少插入          
6.2二 手动开启事务                
假诺一条条数额开始展览插队时,那么每插入一条数据就会敞开二遍事务.(开启事务耗费时间)
           
但是只要有醒目标展开事务,那么系统就不会在插入每条数据时,再展开事务

 1    dispatch_async(dispatch_get_global_queue(0, 0)) { 
 2           //获取插入数据开始时间
 3             let startTime = CACurrentMediaTime()
 4             // 开启事务
 5             let startSQL = "BEGIN TRANSACTION;"
 6             SQLiteManager.shareInstance.execSQL(startSQL)
 7            
 8             for stu in self.stus {
 9                 stu.insertDB()
10             }
11             //关闭事务
12             let commitSQL = "COMMIT TRANSACTION;"
13             SQLiteManager.shareInstance.execSQL(commitSQL)
14               //获取插入数据结束时间
15             let endTime = CACurrentMediaTime()
16               //获取插入数据耗时
17             print(endTime - startTime)
18         }      
19     }

  八.在代码中应用DQL(数据查询语句)   1.查询语句
 997755.com澳门葡京 9   
二.查询数据代码落成步骤      二.一 获取查询语句      二.2实践查询语句(获得的结果保存到数组中,最佳是字典数组)      2.3次历数组,字典转模型      二.四 从模型中读取数据   代码落成:

 1        // 1.获取查询语句
 2         let querySQL = "SELECT * FROM t_student LIMIT 30, 30;";
 3        
 4         // 2.执行语句  (执行语句封装到了一个方法里面)
 5         guard let dictArray = SQLiteManager.shareInstance.querySQL(querySQL) else {
 6             return
 7         }
 8        
 9         // 3.遍历数组
10         var tempArray = [Student]()
11         for dict in dictArray {
12             // 字典转模型
13             tempArray.append(Student(dict: dict))
14         }
15        
16         for stu in tempArray {
17             print(stu.name, stu.age)
18         }
19  
20  //执行语句代码实现
21    func querySQL(querySQL : String) -> [[String : NSObject]]? {
22         // 0.将Swift字符串转成C语言字符串
23         let cString = querySQL.cStringUsingEncoding(NSUTF8StringEncoding)!
24        
25         // 1.定义游标(指针)
26         var stmt : COpaquePointer = nil
27        
28         // 2.给游标赋值
29         // 1> 参数一: 数据库对象
30         // 2> 参数二: SQL语句
31         // 3> 参数三: 该SQL语句的长度 -1 --> 系统自动计算
32         // 4> 参数四: 游标的地址
33         guard sqlite3_prepare_v2(db, cString, -1, &stmt, nil) == SQLITE_OK else {
34             return nil
35         }
36        
37         // 3.取出所有的数据
38         // 3.1.定义字典数组
39         var dictArray = [[String : NSObject]]()
40        
41         // 3.2.判断是否有该条数据
42         while sqlite3_step(stmt) == SQLITE_ROW {
43             // 3.3.获取字段的个数
44             let count = sqlite3_column_count(stmt)
45             // 3.4.定义字典
46             var dict = [String : NSObject]()
47             // 3.5.遍历每一个字典
48             for i in 0..<count {
49                 // 3.6.取出该列的键
50                 let ckey = sqlite3_column_name(stmt, i)
51                 guard let key = String(UTF8String : ckey) else {
52                     continue
53                 }
54                 // 3.7.取出该列的值
55                 let cvalue = UnsafePointer<Int8>(sqlite3_column_text(stmt, i))   
56                 //将c语言字符串转成swift字符串 
57                 let value = String(UTF8String : cvalue)
58                
59                 // 3.8.将键值对放入到字典中
60                 dict[key] = value
61             }
62             // 3.9.将字典放入到数组中
63             dictArray.append(dict)
64         }
65         return dictArray
66     }
67     }

  9.FMDB框架的行使   一.FMDB框架的法力?    
 FMDB是用来简化操作数据库的框架   二.FDMB的着力采取      2.一 创设数据库

private lazy var db : FMDatabase = FMDatabase(path: "/Users/lgp/Desktop/321.sqlite")
        // 创建FMDatabase对象
        // 打开/创建数据
        if db.open() {
            print("打开成功")
        } else  {
            print("失败")
        } 

       二.2 创设/删除 表   插入/更新/删除 数据          
本质都是同一的唯有语句的始末不均等     
     将语句内容换来对应的操作,就能实行该项操作(和SQLite语句一样)   

// 1.获取创建表的语句
let createSQL = "INSERT INTO t_person (name, age, height) VALUES ('why', 18, 1.88);"   
// 2.执行语句
db.executeUpdate(createSQL, withArgumentsInArray: nil)

       二.三 查询数据      var db : FMDatabase?  

 1     func querySQL(querySQL : String) -> [[String : NSObject]]? {
 2         // 0.判断db是否有值  db定义为属性
 3         guard let db = db else {
 4             return nil
 5         }
 6         // 1.执行查询语句   结果为集合
 7         let results = db.executeQuery(querySQL, withArgumentsInArray: nil)
 8        
 9         // 2.获取数据
10         // 2.0.定义数据
11         var dictArray = [[String : NSObject]]()
12        
13         // 2.1.判断结果集中是否有内容
14         while results.next() {
15            
16             let count = results.columnCount()
17            
18             var dict = [String : NSObject]()
19            
20             for i in 0..<count {
21                 let key = results.columnNameForIndex(i)
22                 let value = results.stringForColumnIndex(i)
23                
24                 dict[key] = value
25             }
26             dictArray.append(dict)
27         }
28         return dictArray
29     }

 

1.SQLite的牵线 壹.怎么要存款和储蓄数据? 一.1手提式有线电电话机数码差不离都以从互连网加载的,不存款和储蓄,每一遍滚动分界面都要…

   
有贰个表的数目十分的大,然后需求展按钮联删除,删除的时候开采如下SQL报错:

997755.com澳门葡京 10

997755.com澳门葡京 11

点击(此处)折叠或张开

贰.张开之后点击文件->查询表

贰.开采未来点击文件->查询表

  1. DELETE FROM test.test1 a WHERE EXISTS (SELECT 1 FROM test.test2 b WHERE a.recordID=b.smsInfoID AND b.receiveTime <=”2011-10-09 00:00:00″ ) limit 1000;

997755.com澳门葡京 12

997755.com澳门葡京 13

报错如下:

3.输入要查询的言语,点击运营。成功后会有提示。

三.输入要询问的讲话,点击运维。成功后会有提示。

点击(此处)折叠或张开

997755.com澳门葡京 14

997755.com澳门葡京 15

  1. Error Code: 1064
  2. You have an error in your SQL syntax; check the manual that
    corresponds to your MySQL server version for the right syntax to use
    near ‘a WHERE EXISTS (SELECT 1 FROM test.test2 b WHERE
    a.recordID=b.smsInf’ at line 1

起先感到是exists的主题素材,于是改形成in再测试,也报一样错:

点击(此处)折叠或展开

  1. DELETE FROM test.test1 a WHERE a.recordid IN (SELECT b.smsInfoID FROM test.test2 b WHERE
    b.receiveTime <= “2011-10-09 00:00:00”) LIMIT 1000;

将小名去掉就足以了,将方面两个报错的SQL改动成如下格局就可以了:

点击(此处)折叠或展开

  1. DELETE FROM test.test1 WHERE recordid IN (SELECT smsInfoID FROM test.test2 WHERE
    receiveTime <= “2011-10-09 00:00:00”) LIMIT 1000;

  2. DELETE FROM test.test1 WHERE EXISTS (SELECT 1 FROM test.test2 WHERE test1.recordID=test2.smsInfoID AND test2.receiveTime <= “2011-10-09 00:00:00”) LIMIT 1000;

通过win_study网上好友的引导,开掘能够因而外号删除,只是语法有点意外,上面协理外号的语法:

997755.com澳门葡京,点击(此处)折叠或展开

  1. DELETE test.a FROM test.test1 a WHERE a.recordid IN (SELECT
    b.smsInfoID FROM test.test2 b WHERE b.receiveTime <= “2011-10-09
    00:00:00”) LIMIT 1000;

感谢win_study网友!

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website