我们的生活态度就应该是 “不抱怨” !


其实我想写这篇文章很久了,因为自己做的iOS开发 ,对数据这一块有这极高的要求.所以一些必须的存储数据的使用,我们都有必要熟悉用法.在以前我的简书中我也是写过数据持久化,但是我觉得那一篇是不够完整的,所有我把"增删改查"这个话题单独拿出来说一下. 今天主要说4个方面的增删改查,分别是数组,字典,SQLite数据库,CoreData数据.

数组


首先说一下数组的增删改查.数组结构是我们做开发中经常使用的一种结构.然后看一下数组的"增删改查"是如何进行的吧.当然了,我们要事项说明一点,就是数组分为可变数组,和不可变数组.不可变数组是没有增删改查的,所有我们只会对可变数组的增删改查进行研究.当然了.字典也是一样的.

//使用便利构造器创建一个可变数组NSMutableArray *mtuArray = [NSMutableArray array];//增//给数组增加一些元素[mtuArray addObject:@"栋哥"];//给数组中添加一个数组[mtuArray addObjectsFromArray:@[@"强哥",@"其弟"]];//改//根据下标修改某个值mtuArray[1] = @"萌神";//查if ([mtuArray containsObject:@"栋哥"]) {NSLog(@"存在栋哥!");}else{NSLog(@"栋哥不知道去哪了?");}//删//删除数组某一个元素[mtuArray removeObject:@"栋哥"];//根据下标删除数组的某一个元素[mtuArray removeObjectAtIndex:1];//删除所有的元素[mtuArray removeAllObjects];//删除最后一个元素[mtuArray removeLastObject];

字典


字典是根据键值对存储数据的,当然了字典和数组的"增删改查"比较类似,不可变字典是没有"增删改查"的功能的.只有可变字典存在"增删改查";那我们看一下字典中的增删改查是如何进行的

//根据便利构造器创建一个可变字典NSMutableDictionary *dic = [NSMutableDictionary dictionary];//增//添加单个键值对[dic setObject:@"栋哥" forKey:@"菜比"];//添加一个不可变字典[dic setDictionary:@{@"大神":@"其弟"}];//删//删除某一个键值对[dic removeObjectForKey:@"大神"];//删除字典中的所有元素[dic removeAllObjects];//改//改变某个键的值dic[@"菜比"] = @"面面";//查//注意:字典遍历一遍是在遍历所有的键,我们需要比对键的值来查找某个元素for (NSString *key in [dic allKeys]) {if ([dic[key] isEqualToString:@"栋哥"]) {NSLog(@"栋哥存在了!");}else{NSLog(@"栋哥不存在!");}}

SQLite数据库


SQLite数据库是iOS内嵌的一个数据库,合适大型数据的读写,主要用于本地一些信息的存储,SQLite数据库采用表结构来存储数据的.我们想在Xcode中使用SQLite数据库,我们就要先导入我们的库.

导完了之后,我们首先要有一个Model的模板,这里我就以Student 为类名来创建一个简单的模板.

我们在Student.h文件中是这样写的.

#import <Foundation/Foundation.h>@interface Student : NSObject@property(nonatomic,strong)NSString *name;@property(nonatomic,strong)NSString *gender;@property(nonatomic,assign)int Stu_ID;@property(nonatomic,assign)int age;-(instancetype)initWithName:(NSString *)namegender:(NSString *)genderstuID:(int)stuIDage:(int)age;
@end

Student.m是这样写的,都是很简单的

-(instancetype)initWithName:(NSString *)namegender:(NSString *)genderstuID:(int)stuIDage:(int)age{if (self = [super init]) {_age = age;_name = name;_gender = gender;_Stu_ID = stuID;}return self;}-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}- (NSString *)description
{return [NSString stringWithFormat:@"%@", _name];
}@end

模板做好了,下面我们就对SQLite 数据做一些调用了,在调动之前,先把一些常用的SQLite语句,也是SQLite数据库的增删改查功能

注意 :SQLite语句比较容易出错,所以我建议大家尽量全都复制黏贴,不要用手敲SQLite 语句!!
//创建表CREATE TABLE "Class43" ("Stu_ID" INTEGER PRIMARY KEY NOT NULL UNIQUE, "name" TEXT NOT NULL, "gender" TEXT NOT NULL DEFAULT M, "age" INTEGER NOT NULL);//添加//方式1(字段和值一一对应(局部添加))
INSERT INTO Class43(Stu_ID,name,gender,age) VALUES (2,'栋哥','男',18)//方式2 (整体赋值)(插入数据的时候需要和表里面的顺序一样)
INSERT INTO Class43 VALUES (3,'栋哥','男',17)//修改//方式1整体修改(没有指定指定关键字,则修改全部)
UPDATE Class43 SET age = 18//方式2 局部修改
UPDATE Class43 SET age = 18  WHERE  name ='骚栋'// 查询//方式1查询全部
SELECT * FROM Class43 //方式2 局部查询
SELECT * FROM Class43  WHERE name = '栋哥'//删除//方式1 局部变量
DELETE FROM Class43 WHERE Stu_ID = 3//方式2 全局变量
DELETE FROM Class43 //删除表
DROP TABLE Class43//查找
select * from users order by id limit 1 offset 0offset代表从第几条记录“之后“开始查询,limit表明查询多少条结果

这里我们创建一个伪单例来存储我们的SQLite数据库.

在DataBase.h文件我们做导入sqlite3库 , 创建单例的方法声明和增删改查的方法声明.

#import <Foundation/Foundation.h>#import <sqlite3.h>@class Student;@interface DataBase : NSObject//创建单例
+(instancetype)shareDataBase;//打开数据库
-(void)openDB;//关闭数据库
-(void)closeDB;//添加
-(void)insertStudent:(Student *)student;//删除
-(void)deleteStudent:(int)studentID;//修改
-(void)upDateStudentWithGender:(NSString *)gender andStuID:(int)stu_id;//查询全部
-(NSArray <Student *> *)selectAllStudent;//查询单个学生
-(Student *)selectStudent:(int)Stu_ID;@end

在DataBase.h文件我们对创建单例的方法声明和增删改查的方法进行实现.

引入Model文件, 实现单例初始化方法.

#import "DataBase.h"#import "Student.h"@implementation DataBasestatic DataBase *dataBase = nil;+(instancetype)shareDataBase{//加锁(多线程)@synchronized(self) {if (nil == dataBase) {dataBase = [[DataBase alloc]init];//打开数据库[dataBase openDB];}}return dataBase;}

现在先把SQL数据库定义在静态区.

static sqlite3 *db =nil;

我们不管做增删改查什么操作,都要先打开数据库,然后再做对应的操作.

打开数据库方法解释 :如果数据库不为空,我们就不需要重新创建直接返回,当数据库为空的时候,我们想先找到沙盒对应的路径,然后创建数据库,最后在数据库中创建表格.
//打开数据库
-(void)openDB{//如果数据库已经打开,则不需要执行后面的操作if (db != nil) {return;}//创建保存数据库的路径NSString *docmsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];docmsPath = [docmsPath stringByAppendingString:@"/LOClass.sqlite"];NSLog(@"%@",docmsPath);//打开数据库(如果该数据库存在,则直接打开,否则,会自动创建一个再打开)int result =  sqlite3_open([docmsPath UTF8String], &db);if (result == SQLITE_OK) {NSLog(@"数据库成功打开");//建表//1.准备SQL语句NSString *sql = @"CREATE TABLE Class43 (Stu_ID INTEGER PRIMARY KEY NOT NULL UNIQUE, name TEXT NOT NULL, gender TEXT NOT NULL DEFAULT M, age INTEGER NOT NULL);";//2.执行语句sqlite3_exec(db, [sql UTF8String], nil, nil, nil);}else{NSLog(@"%d",result);}}
当我们操作完对应的操作后我们需要关闭数据库,代码如下

关闭数据库方法解释 : 关闭数据库的时候,我们需要调用sqlite3_close()方法,然后把我们的数据库置为nil,这样数据库就完全关闭了.

//关闭数据库
-(void)closeDB{int result = sqlite3_close(db);//关闭数据库的时候,将db置为空,是因为打开数据库的时候,我们需要使用nil做判断.db = nil;if (result == SQLITE_OK) {NSLog(@"数据库关闭成功!");}else{NSLog(@"数据库关闭失败:%d",result);}}
SQL数据库增加功能
增添方法的解释: 首先我们需要打开数据库,然后创建跟随指针,跟随指针的作用可以理解为绑定一个完整Model数据到要执行的SQLite语句上,然后再对这个Model进行操作.然后创建SQLite语句并运行,当我们的SQLi特语句执行成功的时候,这时候跟随指针就绑定Model ,然后单步执行.最后要释放到跟随指针.
/添加
-(void)insertStudent:(Student *)student{//1.打开数据库[self openDB];//2.创建跟随指针sqlite3_stmt *stmt = nil;//3.准备sql语句NSString *sql =@"INSERT INTO Class43(Stu_ID,name,gender,age) VALUES (?,?,?,?)";//4.验证sql语句的正确性int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);//5.判断 并且绑定if (result == SQLITE_OK) {NSLog(@"数据库添加成功");//一旦sql语句没有问题就开始绑定数据,替换问号//参数:(1)跟随指针 (2)问号的顺序呢(从1开始) (3)要绑定的值sqlite3_bind_int(stmt, 1, student.Stu_ID);sqlite3_bind_text(stmt, 2, [student.name UTF8String], -1, nil);sqlite3_bind_text(stmt, 3, [student.gender UTF8String], -1, nil);sqlite3_bind_int(stmt, 4, student.age);//6.单步执行sqlite3_step(stmt);}else{NSLog(@"数据库添加失败:%d",result);}//释放跟随指针占用的内存sqlite3_finalize(stmt);}
SQL数据库删除功能
删除方法的解释: 首先我们需要打开数据库,然后创建跟随指针,然后创建删除的SQL语句并执行,当执行成功之后,我们就会让跟随指针绑定我们的删除条件,然后单步执行. 执行完成之后,我们需要手动释放跟随指针.
//删除
-(void)deleteStudent:(int)studentID{[self openDB];//创建跟随指针sqlite3_stmt *stmt = nil;//准备sql语句NSString *sql = @"DELETE FROM Class43 WHERE Stu_ID = ?";//验证正确与否int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);//开始删除if (result == SQLITE_OK) {//开始绑定sqlite3_bind_int(stmt, 1, studentID);//单步执行sqlite3_step(stmt);NSLog(@"删除成功");}else{NSLog(@"删除失败");}//释放sqlite3_finalize(stmt);}
SQL数据库修改功能
修改方法的解释: 首先我们需要打开数据库,然后再创建跟随指针,创建跟随指针完成之后,我们需要创建我们的SQL语句并执行,如果执行成功,我们就让我们的跟随指针绑定我们的筛选条件,然后单步执行,最后释放我们的跟随指针.
//修改
-(void)upDateStudentWithGender:(NSString *)gender andStuID:(int)stu_id{[self openDB];sqlite3_stmt *stmt = nil;NSString *sql = @"UPDATE Class43 SET gender = ?  WHERE  Stu_ID = ?";int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);if (result == SQLITE_OK) {NSLog(@"修改成功");sqlite3_bind_int(stmt, 2, stu_id);sqlite3_bind_text(stmt, 1, [gender UTF8String], -1, nil);sqlite3_step(stmt);}else{NSLog(@"修改失败");}//释放sqlite3_finalize(stmt);
}
SQL数据库查询整个表格功能
查询全部方法的解释:首先打开我们的数据库,创建跟随指针,创建完成之后,我们就创建我们的SQL语句并执行.如果执行成功的话,我们就使用while循环反复执行我们的语句,根据sql语句将搜索到的符合条件的值取出来并绑定我们的跟随指针,然后把查询到的数据存到数组中,最后不管是否查询成功,都要释放我们的跟随指针.
-(NSArray<Student *> *)selectAllStudent{[self openDB];sqlite3_stmt *stmt = nil;NSString *sql = @"SELECT * FROM Class43";int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);if (result == SQLITE_OK) {NSLog(@"查询成功!");//创建可变数组用来存放查询到的学生NSMutableArray *array = [NSMutableArray array];while (sqlite3_step(stmt) == SQLITE_ROW) {//根据sql语句将搜索到的符合条件的值取出来(0 代表数据库表的第一列);int stu_id = sqlite3_column_int(stmt, 0);NSString *name =[NSString stringWithUTF8String: (const char *)sqlite3_column_text(stmt, 1)];NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];int age = sqlite3_column_int(stmt, 3);//将取出来的信息赋值给学生的modelStudent *student = [[Student alloc]initWithName:name gender:gender stuID:stu_id age:age];[array addObject:student];}sqlite3_finalize(stmt);return array;}else{NSLog(@"查询失败!");sqlite3_finalize(stmt);return nil;}}
SQL数据库查询单个表格功能
查询单个方法的解释:首先打开我们的数据库,创建跟随指针,创建完成之后,我们就创建我们的SQL语句并执行.如果执行成功的话,我们就使用while循环反复执行我们的语句,根据sql语句将搜索到的符合条件的值取出来并绑定我们的跟随指针,然后把查询到的数据存到对应Model中,最后不管是否查询成功,都要释放我们的跟随指针.
//查询单个学生
-(Student *)selectStudent:(int)Stu_ID{//打开数据库[self openDB];//创建跟随指针sqlite3_stmt *stmt = nil;//准备sql语句NSString *sql = @"SELECT * FROM Class43  WHERE Stu_ID = ?";//验证int  result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);if (result == SQLITE_OK) {NSLog(@"查询成功!");//绑定sqlite3_bind_int(stmt, 1, Stu_ID);Student *stu =[Student new];//执行while (sqlite3_step(stmt) == SQLITE_ROW) {stu.Stu_ID = sqlite3_column_int(stmt, 0);stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];stu.gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];stu.age = sqlite3_column_int(stmt, 3);}sqlite3_finalize(stmt);return stu;}else{NSLog(@"查询失败:%d",result);sqlite3_finalize(stmt);return nil;}}

CoreData数据库


相比于SQLite数据库, CoreData数据库就先相对的简单了许多,CoreData的实现原理你可以想象是github的文件管理一样.你本地是内存,github的服务器是沙盒,你在内存操作完之后就手动传到沙盒中进行本地化保存.其实 CoreData数据库是对SQLite数据库的封装.而且CoreData支持可视化建模.更是大大减少了我们的代码量,现在我们就看一下CoreData的实现步骤以及增删改查功能.

创建工程的时候,我们需要手动添加数据库

这时候,Xcode会自动帮助我们在AppDelegate里面生成几个额外的属性.属性的解释如下

//被管理对象上下文,相当于一个临时数据库,我们存储或者查询都是通过这个对象来进行的.
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;//被管理对象模型,可以简单的理解为可视化建模文件.我们在可视化建模中是Entity,自动生成Model,就是这个对象.方便让文件存储助理进行管理.
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;//文件存储助理,他是CoreData的核心.他负责连接所有的模块,包括真实的存储文件.
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;//将我们在内存中的操作进行持久化.
- (void)saveContext;
//获取真实文件的路径.
- (NSURL *)applicationDocumentsDirectory;

这里我对上面的Core做了一些简单的总结

/*1.CoreData 是苹果公司封装的数据持久化框架.在iOS3.0中开始开放.2.它允许用户按照实体-属性-值模型组织数据,并以二进制,XML,或者sqlite数据文件的格式进行持久化.CoreData的优势1.他是苹果公司原生态的产品.2.他可以节省代码量,大概是30%~70%.3.它支持可视化建模.4.CoreData 支持数据库版本升级.可以通过Editor下的菜单进行生成模型,将Entity生成Model.在其过程中有一个选项,勾选,生成的是标量,不勾选,生成的是通量.*/

相对于SQLite中的代码建模,CoreData更加简洁.

如图添加一个Model

点击 Create 生成一个Model

选择生成的路径和生成的Model ,最后我们需要做标量和通量的选择.

在说"增删改查"之前,我要说一个代码块 ,这个代码块的输入代码是 *** fetch - Core Data Fetch*** 代码块如下,这就是我们要从沙盒中搬到内存的数据,当然了,我们需要做一些谓词筛选等,下面的增删改查中会用到.查询到的结果就在fetchedObjects这个数组中存储着.

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>" inManagedObjectContext:<#context#>];[fetchRequest setEntity:entity];// Specify criteria for filtering which objects to fetchNSPredicate *predicate = [NSPredicate predicateWithFormat:@"<#format string#>", <#arguments#>];[fetchRequest setPredicate:predicate];// Specify how the fetched objects should be sortedNSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#key#>"ascending:YES];[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];NSError *error = nil;NSArray *fetchedObjects = [<#context#> executeFetchRequest:fetchRequest error:&error];if (fetchedObjects == nil) {<#Error handling code#>}

我是在ViewController做一些"增删改查"的操作,首先我们需要声明两个属性,一个是联系上下文的对象是一个用于保存数据的数组,首先,我们会在ViewDidLoad进行初始化一下.

#import "ViewController.h"#import "AppDelegate.h"#import "Student.h"@interface ViewController ()//创建一个上下文对象,用于处理所有与存储相关的请求.
@property(nonatomic,strong)NSManagedObjectContext *myContext;//创建一个数组,用于存储数组的数据源.
@property(nonatomic,strong)NSMutableArray *allData;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];//进行数据初始化self.allData = [ NSMutableArray array];AppDelegate *dele = [UIApplication sharedApplication].delegate;self.myContext = dele.managedObjectContext;}
CoreData数据库增添功能

数据库增添功能方法解释: 首先我们需要创建一个实体描述对象然后存到联系上下文对象中,给这个实体描述对象进行赋值. 再由NSManagedObjectContext对象进行本地化存储.

-(void)addObject{//1.创建Student对象//创建一个实体描述对象NSEntityDescription *description = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.myContext];Student *stu = [[Student alloc]initWithEntity:description insertIntoManagedObjectContext:self.myContext];//给属性赋值stu.name = @"张三";stu.age = arc4random()%73+1;[self.allData addObject:stu];//本地化保存AppDelegate *dele = [UIApplication sharedApplication].delegate;[dele saveContext];}
CoreData数据库删除功能

数据库删除功能方法解释: 删除只需要我们把本地的myContext对象中的实体化对象删除掉,然后再保存就行.

-(void)deleteObject{//获取当前代表的数据Student *stu = self.allData[1];//将临时数据库进行删除并进行本地持久化[self.myContext  deleteObject:stu];[self.myContext save:nil];}
CoreData数据库修改功能

数据库修改功能方法解释: 首先我们需要把沙盒中的数据表格更新到我们的内存对象myContext中去,然后修改实例化对象的值,然后保存到数组,中,最后在进行数据持久化操作.

 -(void)upDataObject{//先查询NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.myContext];[fetchRequest setEntity:entity];// Specify criteria for filtering which objects to fetch//  how the fetched objects should be sortedNSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age"ascending:YES];[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];NSError *error = nil;NSArray *fetchedObjects = [self.myContext executeFetchRequest:fetchRequest error:&error];if (fetchedObjects == nil) {}//修改对对应的数据Student *stu  = self.allData[1];stu.name = @"尼古拉斯-赵四";//更新数据源[self.allData removeAllObjects];[self.allData addObjectsFromArray:fetchedObjects];//将修改本地持久化[self.myContext save:nil];}
CoreData数据库查询功能

数据库查询功能方法解释: 这里只做整体的查询,当我们需要查询某个数据的时候,我们就要先从山河中下载到内存中,然后保存到我们的数组中.在对数组进行遍历操作,查询我们的对象.

-(void)selectAllData{NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.myContext];[fetchRequest setEntity:entity];// Specify criteria for filtering which objects to fetch// Specify how the fetched objects should be sorted//排序条件NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age"ascending:YES];[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];NSError *error = nil;NSArray *fetchedObjects = [self.myContext executeFetchRequest:fetchRequest error:&error];if (fetchedObjects == nil) {NSLog(@"两手空空,你让我拿什么飞天?");}//将查询到的数据添加到数据源[self.allData addObjectsFromArray:fetchedObjects];}

作为"增删改查"这四个操作,是我们程序员对数据最基本的操作,希望大家能够喜欢这篇,如果喜欢就点个赞呗

华山论剑之iOS中(数组,字典,SQLite,CoreData)的“增删改查“相关推荐

  1. iOS CoreData (一) 增删改查

    代码地址如下: http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系 ...

  2. [Android] SQLite数据库之增删改查基础操作

        在编程中经常会遇到数据库的操作,而Android系统内置了SQLite,它是一款轻型数据库,遵守事务ACID的关系型数据库管理系统,它占用的资源非常低,能够支持Windows/Linux/Un ...

  3. python 列表嵌套字典 添加修改删除_python 列表、字典、元组等增删改查

    1. 元组 a. 定义和下标访问 元组的格式: (值,....) 如 s = (1,2,3) 元组的类型: tuple 元组的下标使用同字符串 注意:如果元组中只有一个元素,那么在定义时,需要加一个逗 ...

  4. 字典的介绍及增删改查、常见操作

    目录 介绍 生活中的字典 开发中的字典 根据键访问值 字典的增删改查 1>修改元素 2>添加元素 3>删除元素 字典的常见操作 1>len() 2>keys 3>v ...

  5. Android中数据库的一些操作(增删改查)

    提起Android的开发,就不得不提数据库,几乎每个App中都会用到Sqlit数据库存储一些数据,小编闲暇时期,写了一个小demo关于数据库的增删改查,之前也介绍过数据库的一个开源框架ORMLite, ...

  6. Mybatis中使用Dao实现类实现增删改查【实际开发中使用代理dao】

    在Mybatis开发中,使用到的是代理Dao的方式实现增删改查,这样就不需要在写Dao的实现类 但是Mybatis也支持写Dao实现类!即DaoImpl 直接上DaoImpl,之前的代码可以参考前面几 ...

  7. mongodb windows的安装方法和添加到任务管理器中、检测是否成功、增删改查命令...

    转: mongodb安装方法: https://blog.csdn.net/heshushun/article/details/77776706        mongodb检测安装成功 .以及增删改 ...

  8. android中对sim卡联系人的增删改查以及监听sim卡联系数据的改变

    sim卡联系人的增删改查主要是通过ContentProvider来进行操作的,在android中对sim卡联系人操作的provider是定义在IccProvider.java这个类中的,这个类位于an ...

  9. 深入理解和使用Oracle中with as语句以及与增删改查的结合使用

    WITH AS短语,也叫做子查询部分(subquery factoring),可以做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让SQL语句的可读性更高些,也有 ...

最新文章

  1. 协议分析中的TCP/IP网络协议
  2. ajax同步和异步的差异
  3. 大话数据结构之算法 时间复杂度
  4. JavaScript 音频处理库 pico.js
  5. Android单击、长按获取当前触点坐标下(TextView)文字字符
  6. axios请求报Uncaught (in promise) Error: Request failed with status code 404
  7. 创建线程的方式_创建线程有几种不同的方式?
  8. JS数据结构与算法——插入排序
  9. 生命银行怎么样_减脂就像是从“脂肪银行”中提款,想要成功,你要做到这两点...
  10. 【机器学习课程笔记(吴恩达)】1.2 什么是机器学习?
  11. Racket 6.11提供了稳定的细化类型和依赖函数特性
  12. [读书笔记] -《C++ API设计》第6章 C++用法
  13. 面向项目(八)—— #if defined 与 #ifdef
  14. Ubuntu下Android Studio连接手机无法识别
  15. 可见面判别算法---深度排序算法
  16. Js逆向实战之网易云音乐(手把手视频讲解)
  17. kux格式如何无损转换为MP4格式
  18. 本地计算机无法启动ansys,Ansys帮助文件无法打开的解决方法 | 坐倚北风
  19. 51nod3155 跳房子
  20. 【排序算法】Java版十大经典排序算法实现以及测试结果

热门文章

  1. Ubuntu下使用NI-VISA控制USB接口仪器(示波器)
  2. KZ笔记5:连跳丧失速度的原因
  3. java整型_java中长整型定义
  4. python编程简易计算器_Python编程练习049:简单计算器实现
  5. Comet OJ 夏季欢乐赛 完全k叉树
  6. [转载] opencart支付宝 免费下载
  7. 自己动手丰衣足食之图片放大镜
  8. 用html做一个拍拍网界面视频,用canvas做一个DVD待机动画的实现代码
  9. LumaQQ学习记录
  10. Google创新方法「设计冲刺」