Frontier Software

jq

type

$(jq '.performer | type' <<<"$schema")

type can be null, boolean, number, string, array or object.

has(key)

https://github.com/shngli/Database-apps/tree/master/SQL

create table College(cName text, state text, enrollment int);
create table Student(sID int, sName text, GPA real, sizeHS int);
create table Apply(sID int, cName text, major text, decision text);

insert into Student values (123, 'Amy', 3.9, 1000);
insert into Student values (234, 'Bob', 3.6, 1500);
insert into Student values (345, 'Craig', 3.5, 500);
insert into Student values (456, 'Doris', 3.9, 1000);
insert into Student values (567, 'Edward', 2.9, 2000);
insert into Student values (678, 'Fay', 3.8, 200);
insert into Student values (789, 'Gary', 3.4, 800);
insert into Student values (987, 'Helen', 3.7, 800);
insert into Student values (876, 'Irene', 3.9, 400);
insert into Student values (765, 'Jay', 2.9, 1500);
insert into Student values (654, 'Amy', 3.9, 1000);
insert into Student values (543, 'Craig', 3.4, 2000);

insert into College values ('Stanford', 'CA', 15000);
insert into College values ('Berkeley', 'CA', 36000);
insert into College values ('MIT', 'MA', 10000);
insert into College values ('Cornell', 'NY', 21000);

insert into Apply values (123, 'Stanford', 'CS', 'Y');
insert into Apply values (123, 'Stanford', 'EE', 'N');
insert into Apply values (123, 'Berkeley', 'CS', 'Y');
insert into Apply values (123, 'Cornell', 'EE', 'Y');
insert into Apply values (234, 'Berkeley', 'biology', 'N');
insert into Apply values (345, 'MIT', 'bioengineering', 'Y');
insert into Apply values (345, 'Cornell', 'bioengineering', 'N');
insert into Apply values (345, 'Cornell', 'CS', 'Y');
insert into Apply values (345, 'Cornell', 'EE', 'N');
insert into Apply values (678, 'Stanford', 'history', 'Y');
insert into Apply values (987, 'Stanford', 'CS', 'Y');
insert into Apply values (987, 'Berkeley', 'CS', 'Y');
insert into Apply values (876, 'Stanford', 'CS', 'N');
insert into Apply values (876, 'MIT', 'biology', 'Y');
insert into Apply values (876, 'MIT', 'marine biology', 'N');
insert into Apply values (765, 'Stanford', 'history', 'Y');
insert into Apply values (765, 'Cornell', 'history', 'N');
insert into Apply values (765, 'Cornell', 'psychology', 'Y');
insert into Apply values (543, 'MIT', 'CS', 'N');

Converted into Json using https://beautifytools.com/sql-to-json-converter.php and stored in students.json

{
	"Student": [{
			"sID": 123,
			"sName": "Amy",
			"GPA": 3.9,
			"sizeHS": 1000
		},
		{
			"sID": 234,
			"sName": "Bob",
			"GPA": 3.6,
			"sizeHS": 1500
		},
		{
			"sID": 345,
			"sName": "Craig",
			"GPA": 3.5,
			"sizeHS": 500
		},
		{
			"sID": 456,
			"sName": "Doris",
			"GPA": 3.9,
			"sizeHS": 1000
		},
		{
			"sID": 567,
			"sName": "Edward",
			"GPA": 2.9,
			"sizeHS": 2000
		},
		{
			"sID": 678,
			"sName": "Fay",
			"GPA": 3.8,
			"sizeHS": 200
		},
		{
			"sID": 789,
			"sName": "Gary",
			"GPA": 3.4,
			"sizeHS": 800
		},
		{
			"sID": 987,
			"sName": "Helen",
			"GPA": 3.7,
			"sizeHS": 800
		},
		{
			"sID": 876,
			"sName": "Irene",
			"GPA": 3.9,
			"sizeHS": 400
		},
		{
			"sID": 765,
			"sName": "Jay",
			"GPA": 2.9,
			"sizeHS": 1500
		},
		{
			"sID": 654,
			"sName": "Amy",
			"GPA": 3.9,
			"sizeHS": 1000
		},
		{
			"sID": 543,
			"sName": "Craig",
			"GPA": 3.4,
			"sizeHS": 2000
		}
	],
	"College": [{
			"cName": "Stanford",
			"state": "CA",
			"enrollment": 15000
		},
		{
			"cName": "Berkeley",
			"state": "CA",
			"enrollment": 36000
		},
		{
			"cName": "MIT",
			"state": "MA",
			"enrollment": 10000
		},
		{
			"cName": "Cornell",
			"state": "NY",
			"enrollment": 21000
		}
	],
	"Apply": [{
			"sID": 123,
			"cName": "Stanford",
			"major": "CS",
			"decision": "Y"
		},
		{
			"sID": 123,
			"cName": "Stanford",
			"major": "EE",
			"decision": "N"
		},
		{
			"sID": 123,
			"cName": "Berkeley",
			"major": "CS",
			"decision": "Y"
		},
		{
			"sID": 123,
			"cName": "Cornell",
			"major": "EE",
			"decision": "Y"
		},
		{
			"sID": 234,
			"cName": "Berkeley",
			"major": "biology",
			"decision": "N"
		},
		{
			"sID": 345,
			"cName": "MIT",
			"major": "bioengineering",
			"decision": "Y"
		},
		{
			"sID": 345,
			"cName": "Cornell",
			"major": "bioengineering",
			"decision": "N"
		},
		{
			"sID": 345,
			"cName": "Cornell",
			"major": "CS",
			"decision": "Y"
		},
		{
			"sID": 345,
			"cName": "Cornell",
			"major": "EE",
			"decision": "N"
		},
		{
			"sID": 678,
			"cName": "Stanford",
			"major": "history",
			"decision": "Y"
		},
		{
			"sID": 987,
			"cName": "Stanford",
			"major": "CS",
			"decision": "Y"
		},
		{
			"sID": 987,
			"cName": "Berkeley",
			"major": "CS",
			"decision": "Y"
		},
		{
			"sID": 876,
			"cName": "Stanford",
			"major": "CS",
			"decision": "N"
		},
		{
			"sID": 876,
			"cName": "MIT",
			"major": "biology",
			"decision": "Y"
		},
		{
			"sID": 876,
			"cName": "MIT",
			"major": "marine biology",
			"decision": "N"
		},
		{
			"sID": 765,
			"cName": "Stanford",
			"major": "history",
			"decision": "Y"
		},
		{
			"sID": 765,
			"cName": "Cornell",
			"major": "history",
			"decision": "N"
		},
		{
			"sID": 765,
			"cName": "Cornell",
			"major": "psychology",
			"decision": "Y"
		},
		{
			"sID": 543,
			"cName": "MIT",
			"major": "CS",
			"decision": "N"
		}
	]
}

Basic Queries

IDs, names, and GPAs of students with GPA > 3.6

select sID, sName, GPA
from Student
where GPA > 3.6;

Translating to jq involves using select(boolean_expression)

jq '[ .Student[] | select(.GPA > 3.6) | {"sID": .sID, "sName": .sName, "GPA": .GPA} ]' students.json
[
  {
    "sID": 123,
    "sName": "Amy",
    "GPA": 3.9
  },
  {
    "sID": 456,
    "sName": "Doris",
    "GPA": 3.9
  },
  {
    "sID": 678,
    "sName": "Fay",
    "GPA": 3.8
  },
  {
    "sID": 987,
    "sName": "Helen",
    "GPA": 3.7
  },
  {
    "sID": 876,
    "sName": "Irene",
    "GPA": 3.9
  },
  {
    "sID": 654,
    "sName": "Amy",
    "GPA": 3.9
  }
]

Student names and majors for which they’ve applied

select sName, major
from Student, Apply
where Student.sID = Apply.sID;

Here we need jq’s SQL-Style Operators, JOIN($idx; stream; idx_expr; join_expr) combined with INDEX(stream; index_expression)

jq '[ JOIN(INDEX(.Student[]; .sID); .Apply[]; .sID | tostring; .) | 
  { "sName": .[1].sName, "major": .[0].major} ]' students.json
select distinct sName, major
from Student, Apply
where Student.sID = Apply.sID;
[
  {
    "sName": "Amy",
    "major": "CS"
  },
  {
    "sName": "Amy",
    "major": "EE"
  },
  {
    "sName": "Amy",
    "major": "CS"
  },
  {
    "sName": "Amy",
    "major": "EE"
  },
  {
    "sName": "Bob",
    "major": "biology"
  },
  {
    "sName": "Craig",
    "major": "bioengineering"
  },
  {
    "sName": "Craig",
    "major": "bioengineering"
  },
  {
    "sName": "Craig",
    "major": "CS"
  },
  {
    "sName": "Craig",
    "major": "EE"
  },
  {
    "sName": "Fay",
    "major": "history"
  },
  {
    "sName": "Helen",
    "major": "CS"
  },
  {
    "sName": "Helen",
    "major": "CS"
  },
  {
    "sName": "Irene",
    "major": "CS"
  },
  {
    "sName": "Irene",
    "major": "biology"
  },
  {
    "sName": "Irene",
    "major": "marine biology"
  },
  {
    "sName": "Jay",
    "major": "history"
  },
  {
    "sName": "Jay",
    "major": "history"
  },
  {
    "sName": "Jay",
    "major": "psychology"
  },
  {
    "sName": "Craig",
    "major": "CS"
  }
]

The number of “rows” (objects in JSON parlance) returned is 19 which we can get by:

jq '[ JOIN(INDEX(.Student[]; .sID); .Apply[]; .sID | tostring; .) | 
  { "sName": .[1].sName, "major": .[0].major} ] | length' students.json

Same query with Distinct

select distinct sName, major
from Student, Apply
where Student.sID = Apply.sID;

Here we need jq’s unique

jq '[ JOIN(INDEX(.Student[]; .sID); .Apply[]; .sID | tostring; .) | 
  { "sName": .[1].sName, "major": .[0].major} ] | unique' students.json
[
  {
    "sName": "Amy",
    "major": "CS"
  },
  {
    "sName": "Craig",
    "major": "CS"
  },
  {
    "sName": "Helen",
    "major": "CS"
  },
  {
    "sName": "Irene",
    "major": "CS"
  },
  {
    "sName": "Amy",
    "major": "EE"
  },
  {
    "sName": "Craig",
    "major": "EE"
  },
  {
    "sName": "Craig",
    "major": "bioengineering"
  },
  {
    "sName": "Bob",
    "major": "biology"
  },
  {
    "sName": "Irene",
    "major": "biology"
  },
  {
    "sName": "Fay",
    "major": "history"
  },
  {
    "sName": "Jay",
    "major": "history"
  },
  {
    "sName": "Irene",
    "major": "marine biology"
  },
  {
    "sName": "Jay",
    "major": "psychology"
  }
]

Stripping out duplicates reduces the number of rows returned from 19 to 13.

jq '[ JOIN(INDEX(.Student[]; .sID); .Apply[]; .sID | tostring; .) | 
  { "sName": .[1].sName, "major": .[0].major} ] | unique | length' students.json

Names and GPAs of students with sizeHS < 1000 applying to CS at Stanford, and the application decision

select sname, GPA, decision
from Student, Apply
where Student.sID = Apply.sID
  and sizeHS < 1000 and major = 'CS' and cname = 'Stanford';
jq '[ JOIN(INDEX(.Student[]; .sID); .Apply[]; .sID | tostring; .) | 
  select(.[1].sizeHS < 1000) | select(.[0].major == "CS") | select(.[0].cName == "Stanford") | 
  { "sName": .[1].sName, "GPA": .[1].GPA, "decision": .[0].decision} ]' students.json
[
  {
    "sName": "Helen",
    "GPA": 3.7,
    "decision": "Y"
  },
  {
    "sName": "Irene",
    "GPA": 3.9,
    "decision": "N"
  }
]

All large campuses with CS applicants

select distinct College.cName
from College, Apply
where College.cName = Apply.cName
  and enrollment > 20000 and major = 'CS';
jq '[ JOIN(INDEX(.College[]; .cName); .Apply[]; .cName; .) | 
  select(.[1].enrollment < 20000) | select(.[0].major == "CS") | 
  { "cName": .[0].cName } ] | unique ' students.json
[
  {
    "cName": "MIT"
  },
  {
    "cName": "Stanford"
  }
]

Application information (introduces sorting)

Sort by decreasing GPA

select Student.sID, sName, GPA, Apply.cName, enrollment
from Student, College, Apply
where Apply.sID = Student.sID and Apply.cName = College.cName
order by GPA desc;

Need to figure out how to join three tables in jq.

Then by increasing enrollment

select Student.sID, sName, GPA, Apply.cName, enrollment
from Student, College, Apply
where Apply.sID = Student.sID and Apply.cName = College.cName
order by GPA desc, enrollment;