1818
1919 < body >
2020 < nav class ="navbar navbar-expand-md navbar-dark fixed-top bg-dark ">
21+
2122 < a class ="navbar-brand " href ="# "> SQL for Python Programmers</ a >
22- < div class ="navbar-collapse collapse ">
23+
24+ < button class ="navbar-toggler " type ="button " data-toggle ="collapse " data-target ="#navbarContent " aria-controls ="navbarContent " aria-expanded ="false " aria-label ="Toggle navigation ">
25+ < span class ="navbar-toggler-icon "> </ span >
26+ </ button >
27+
28+ < div class ="collapse navbar-collapse " id ="navbarContent ">
2329 < div class ="navbar-nav ">
2430 < a class ="nav-item nav-link " href ="/sql_python_tutorial/ "> < i class ="fa fa-home fa-fw " aria-hidden ="true " title ="home "> </ i > Home</ a >
2531 < a class ="nav-item nav-link mr-auto " href ="/sql_python_tutorial/chapters/ "> < i class ="fa fa-book fa-fw " aria-hidden ="true " title ="contents "> </ i > Contents</ a >
2632 < a class ="nav-item nav-link " href ="/sql_python_tutorial/pages/intro "> < i class ="fa fa-info-circle fa-fw " aria-hidden ="true " title ="introduction "> </ i > Introduction</ a >
2733 < a class ="nav-item nav-link " href ="/sql_python_tutorial/pages/howto "> < i class ="fa fa-gears fa-fw " aria-hidden ="true " title ="how to "> </ i > How To</ span > </ a >
2834 <!-- <a class="nav-item nav-link" href="/sql_python_tutorial/pages/primer"><i class="fa fa-database fa-fw" aria-hidden="true" title="primer"></i> Primer</a> -->
2935 </ div >
30- < div class ="navbar-collapse collapse ">
31- < div class ="navbar-nav ml-auto ">
32- < a class ="btn btn-link btn-lg " href ="https://twitter.com/opcampbell " title ="twitter "> < i class ="fa fa-twitter " aria-hidden ="true "> </ i > </ a >
33- < a class ="btn btn-link btn-lg " href ="https://www.linkedin.com/in/owencampbell " title ="linkedin "> < i class ="fa fa-linkedin " aria-hidden ="true "> </ i > </ a >
34- < a class ="btn btn-link btn-lg " href ="http://github.com/meatballs " title ="github "> < i class ="fa fa-github " aria-hidden ="true "> </ i > </ a >
35- </ div >
36+ < div class ="navbar-nav ml-auto ">
37+ < a class ="btn btn-link btn-lg " href ="https://twitter.com/opcampbell " title ="twitter "> < i class ="fa fa-twitter " aria-hidden ="true "> </ i > </ a >
38+ < a class ="btn btn-link btn-lg " href ="https://www.linkedin.com/in/owencampbell " title ="linkedin "> < i class ="fa fa-linkedin " aria-hidden ="true "> </ i > </ a >
39+ < a class ="btn btn-link btn-lg " href ="http://github.com/meatballs " title ="github "> < i class ="fa fa-github " aria-hidden ="true "> </ i > </ a >
3640 </ div >
3741 </ div >
3842</ nav >
3943
4044 < main role ="main " class ="container ">
4145
42- < div class ="row mt-5 mb-3 ">
43-
44- < div class ="col-sm-6 ">
45- < a class ="btn btn-outline-primary btn-sm " href ="../08/ "> < i class ="fa fa-backward fa-fw " aria-hidden ="true "> </ i > Previous</ a >
46- </ div >
47-
48-
49- < div class ="col-sm-6 ">
50- < span class ="float-right "> < a class ="btn btn-outline-primary btn-sm " href ="../10/ "> Next < i class ="fa fa-forward fa-fw " aria-hidden ="true "> </ i > </ a > </ span >
51- </ div >
52-
46+ < div class ="row mt-3 mb-3 ">
47+ < div class ="col-sm ">
48+
49+ < a class ="btn btn-outline-primary btn-sm " href ="../08/ "> < i class ="fa fa-backward fa-fw " aria-hidden ="true "> </ i > Previous</ a >
50+
51+
52+ < span class ="float-right "> < a class ="btn btn-outline-primary btn-sm " href ="../01/ "> Next < i class ="fa fa-forward fa-fw " aria-hidden ="true "> </ i > </ a > </ span >
53+
54+ </ div >
5355</ div >
5456
5557 < div class ="row ">
5860</ div >
5961< div class ="inner_cell ">
6062< div class ="text_cell_render border-box-sizing rendered_html ">
61- < h1 id ="Now-for-Some-Joined-Up-Thinking "> Now for Some Joined-Up Thinking< a class ="anchor-link " href ="#Now-for-Some-Joined-Up-Thinking "> ¶</ a > </ h1 >
63+ < h1 id ="Extract-The-Data "> Extract The Data< a class ="anchor-link " href ="#Extract-The-Data "> ¶</ a > </ h1 > < p > We've learned how to create a database, insert data and then update or delete it.</ p >
64+ < p > We've also seen how to view the content of a table using pandas.</ p >
65+ < p > But we've only seen how to display the entire contents of a single table. What if we only want a subset of the records? What if we want to extract a set based on records in more than one table?</ p >
66+ < p > It's time to learn about the SELECT statement.</ p >
67+ < p > First, let's connect to our database, empty both tables and create records for three flights.</ p >
68+ < p > We'll need to enable foreign keys again as this setting applies to the connection:</ p >
69+
6270</ div >
6371</ div >
6472</ div >
73+ < div class ="cell border-box-sizing code_cell rendered ">
74+ < div class ="input ">
75+ < div class ="prompt input_prompt "> In [29]:</ div >
76+ < div class ="inner_cell ">
77+ < div class ="input_area ">
78+ < div class =" highlight hl-ipython3 "> < pre > < span > </ span > < span class ="kn "> import</ span > < span class ="nn "> sqlalchemy</ span > < span class ="k "> as</ span > < span class ="nn "> sa</ span >
79+ < span class ="kn "> import</ span > < span class ="nn "> pandas</ span > < span class ="k "> as</ span > < span class ="nn "> pd</ span >
80+ < span class ="kn "> from</ span > < span class ="nn "> collections</ span > < span class ="k "> import</ span > < span class ="n "> namedtuple</ span >
81+ < span class ="n "> engine</ span > < span class ="o "> =</ span > < span class ="n "> sa</ span > < span class ="o "> .</ span > < span class ="n "> create_engine</ span > < span class ="p "> (</ span > < span class ="s1 "> 'sqlite:///flight.db'</ span > < span class ="p "> )</ span >
82+ < span class ="n "> connection</ span > < span class ="o "> =</ span > < span class ="n "> engine</ span > < span class ="o "> .</ span > < span class ="n "> connect</ span > < span class ="p "> ()</ span >
83+ < span class ="n "> connection</ span > < span class ="o "> .</ span > < span class ="n "> execute</ span > < span class ="p "> (</ span > < span class ="s2 "> "PRAGMA foreign_keys=on"</ span > < span class ="p "> )</ span >
84+ < span class ="n "> connection</ span > < span class ="o "> .</ span > < span class ="n "> execute</ span > < span class ="p "> (</ span > < span class ="s2 "> "DELETE FROM flights"</ span > < span class ="p "> )</ span >
85+
86+ < span class ="n "> Flight</ span > < span class ="o "> =</ span > < span class ="n "> namedtuple</ span > < span class ="p "> (</ span > < span class ="s1 "> 'Flight'</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'name country_code'</ span > < span class ="p "> )</ span >
87+
88+ < span class ="n "> flights</ span > < span class ="o "> =</ span > < span class ="p "> [</ span >
89+ < span class ="n "> Flight</ span > < span class ="p "> (</ span > < span class ="n "> name</ span > < span class ="o "> =</ span > < span class ="s1 "> 'hab1'</ span > < span class ="p "> ,</ span > < span class ="n "> country_code</ span > < span class ="o "> =</ span > < span class ="s1 "> 'GB'</ span > < span class ="p "> ),</ span >
90+ < span class ="n "> Flight</ span > < span class ="p "> (</ span > < span class ="n "> name</ span > < span class ="o "> =</ span > < span class ="s1 "> 'hab2'</ span > < span class ="p "> ,</ span > < span class ="n "> country_code</ span > < span class ="o "> =</ span > < span class ="s1 "> 'GB'</ span > < span class ="p "> ),</ span >
91+ < span class ="n "> Flight</ span > < span class ="p "> (</ span > < span class ="n "> name</ span > < span class ="o "> =</ span > < span class ="s1 "> 'hab3'</ span > < span class ="p "> ,</ span > < span class ="n "> country_code</ span > < span class ="o "> =</ span > < span class ="s1 "> 'US'</ span > < span class ="p "> ),</ span >
92+ < span class ="p "> ]</ span >
93+
94+ < span class ="n "> sql</ span > < span class ="o "> =</ span > < span class ="s2 "> """</ span >
95+ < span class ="s2 "> INSERT INTO flights(name, country_code)</ span >
96+ < span class ="s2 "> VALUES(?, ?)</ span >
97+ < span class ="s2 "> """</ span >
98+
99+ < span class ="k "> for</ span > < span class ="n "> flight</ span > < span class ="ow "> in</ span > < span class ="n "> flights</ span > < span class ="p "> :</ span >
100+ < span class ="n "> connection</ span > < span class ="o "> .</ span > < span class ="n "> execute</ span > < span class ="p "> (</ span > < span class ="n "> sql</ span > < span class ="p "> ,</ span > < span class ="p "> (</ span > < span class ="n "> flight</ span > < span class ="o "> .</ span > < span class ="n "> name</ span > < span class ="p "> ,</ span > < span class ="n "> flight</ span > < span class ="o "> .</ span > < span class ="n "> country_code</ span > < span class ="p "> ))</ span >
101+ < span class ="n "> pd</ span > < span class ="o "> .</ span > < span class ="n "> read_sql</ span > < span class ="p "> (</ span > < span class ="s1 "> 'flights'</ span > < span class ="p "> ,</ span > < span class ="n "> connection</ span > < span class ="p "> )</ span >
102+ </ pre > </ div >
103+
104+ </ div >
105+ </ div >
106+ </ div >
107+
108+ < div class ="output_wrapper ">
109+ < div class ="output ">
110+
111+
112+ < div class ="output_area ">
113+
114+ < div class ="prompt output_prompt "> Out[29]:</ div >
115+
116+
117+
118+ < div class ="output_html rendered_html output_subarea output_execute_result ">
119+ < div >
120+ < style scoped >
121+ .dataframe tbody tr th : only-of-type {
122+ vertical-align : middle;
123+ }
124+
125+ .dataframe tbody tr th {
126+ vertical-align : top;
127+ }
128+
129+ .dataframe thead th {
130+ text-align : right;
131+ }
132+ </ style >
133+ < table border ="1 " class ="dataframe ">
134+ < thead >
135+ < tr style ="text-align: right; ">
136+ < th > </ th >
137+ < th > name</ th >
138+ < th > country_code</ th >
139+ < th > latitude</ th >
140+ < th > longitude</ th >
141+ </ tr >
142+ </ thead >
143+ < tbody >
144+ < tr >
145+ < th > 0</ th >
146+ < td > hab1</ td >
147+ < td > GB</ td >
148+ < td > 0.0</ td >
149+ < td > 0.0</ td >
150+ </ tr >
151+ < tr >
152+ < th > 1</ th >
153+ < td > hab2</ td >
154+ < td > GB</ td >
155+ < td > 0.0</ td >
156+ < td > 0.0</ td >
157+ </ tr >
158+ < tr >
159+ < th > 2</ th >
160+ < td > hab3</ td >
161+ < td > US</ td >
162+ < td > 0.0</ td >
163+ < td > 0.0</ td >
164+ </ tr >
165+ </ tbody >
166+ </ table >
167+ </ div >
168+ </ div >
169+
170+ </ div >
171+
172+ </ div >
173+ </ div >
174+
175+ </ div >
176+ < div class ="cell border-box-sizing text_cell rendered "> < div class ="prompt input_prompt ">
177+ </ div >
178+ < div class ="inner_cell ">
179+ < div class ="text_cell_render border-box-sizing rendered_html ">
180+ < p > And then generate 20 randomised readings for each flight:</ p >
181+
182+ </ div >
183+ </ div >
184+ </ div >
185+ < div class ="cell border-box-sizing code_cell rendered ">
186+ < div class ="input ">
187+ < div class ="prompt input_prompt "> In [30]:</ div >
188+ < div class ="inner_cell ">
189+ < div class ="input_area ">
190+ < div class =" highlight hl-ipython3 "> < pre > < span > </ span > < span class ="kn "> from</ span > < span class ="nn "> random</ span > < span class ="k "> import</ span > < span class ="n "> uniform</ span > < span class ="p "> ,</ span > < span class ="n "> randint</ span >
191+
192+ < span class ="n "> Reading</ span > < span class ="o "> =</ span > < span class ="n "> namedtuple</ span > < span class ="p "> (</ span > < span class ="s1 "> 'Reading'</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'flight, ts, temp, pressure, humidity'</ span > < span class ="p "> )</ span >
193+
194+ < span class ="n "> readings</ span > < span class ="o "> =</ span > < span class ="p "> [</ span >
195+ < span class ="n "> Reading</ span > < span class ="p "> (</ span >
196+ < span class ="n "> flight</ span > < span class ="o "> =</ span > < span class ="n "> flight</ span > < span class ="o "> .</ span > < span class ="n "> name</ span > < span class ="p "> ,</ span >
197+ < span class ="n "> ts</ span > < span class ="o "> =</ span > < span class ="n "> f</ span > < span class ="s1 "> '2015-01-01 09:{str(i+1).zfill(2)}:00'</ span > < span class ="p "> ,</ span >
198+ < span class ="n "> temp</ span > < span class ="o "> =</ span > < span class ="nb "> round</ span > < span class ="p "> (</ span > < span class ="n "> uniform</ span > < span class ="p "> (</ span > < span class ="mi "> 23</ span > < span class ="p "> ,</ span > < span class ="mi "> 27</ span > < span class ="p "> ),</ span > < span class ="mi "> 1</ span > < span class ="p "> ),</ span >
199+ < span class ="n "> pressure</ span > < span class ="o "> =</ span > < span class ="n "> randint</ span > < span class ="p "> (</ span > < span class ="mi "> 1020</ span > < span class ="p "> ,</ span > < span class ="mi "> 1025</ span > < span class ="p "> ),</ span >
200+ < span class ="n "> humidity</ span > < span class ="o "> =</ span > < span class ="n "> randint</ span > < span class ="p "> (</ span > < span class ="mi "> 30</ span > < span class ="p "> ,</ span > < span class ="mi "> 50</ span > < span class ="p "> ))</ span >
201+ < span class ="k "> for</ span > < span class ="n "> flight</ span > < span class ="ow "> in</ span > < span class ="n "> flights</ span >
202+ < span class ="k "> for</ span > < span class ="n "> i</ span > < span class ="ow "> in</ span > < span class ="nb "> range</ span > < span class ="p "> (</ span > < span class ="mi "> 20</ span > < span class ="p "> )</ span >
203+ < span class ="p "> ]</ span >
204+
205+ < span class ="n "> sql</ span > < span class ="o "> =</ span > < span class ="s2 "> """</ span >
206+ < span class ="s2 "> INSERT INTO readings</ span >
207+ < span class ="s2 "> (flight, ts, temp, pressure, humidity)</ span >
208+ < span class ="s2 "> VALUES</ span >
209+ < span class ="s2 "> (?, ?, ?, ?, ?)</ span >
210+ < span class ="s2 "> """</ span >
211+
212+ < span class ="k "> for</ span > < span class ="n "> reading</ span > < span class ="ow "> in</ span > < span class ="n "> readings</ span > < span class ="p "> :</ span >
213+ < span class ="n "> values</ span > < span class ="o "> =</ span > < span class ="p "> (</ span > < span class ="n "> reading</ span > < span class ="o "> .</ span > < span class ="n "> flight</ span > < span class ="p "> ,</ span > < span class ="n "> reading</ span > < span class ="o "> .</ span > < span class ="n "> ts</ span > < span class ="p "> ,</ span > < span class ="n "> reading</ span > < span class ="o "> .</ span > < span class ="n "> temp</ span > < span class ="p "> ,</ span > < span class ="n "> reading</ span > < span class ="o "> .</ span > < span class ="n "> pressure</ span > < span class ="p "> ,</ span > < span class ="n "> reading</ span > < span class ="o "> .</ span > < span class ="n "> humidity</ span > < span class ="p "> )</ span >
214+ < span class ="n "> connection</ span > < span class ="o "> .</ span > < span class ="n "> execute</ span > < span class ="p "> (</ span > < span class ="n "> sql</ span > < span class ="p "> ,</ span > < span class ="n "> values</ span > < span class ="p "> )</ span >
215+ </ pre > </ div >
216+
217+ </ div >
218+ </ div >
219+ </ div >
220+
221+ </ div >
65222
66223
67224</ div >
68225 </ div >
69226
70- < div class ="row mt-5 mb-3 ">
71-
72- < div class ="col-sm-6 ">
73- < a class ="btn btn-outline-primary btn-sm " href ="../08/ "> < i class ="fa fa-backward fa-fw " aria-hidden ="true "> </ i > Previous</ a >
74- </ div >
75-
76-
77- < div class ="col-sm-6 ">
78- < span class ="float-right "> < a class ="btn btn-outline-primary btn-sm " href ="../10/ "> Next < i class ="fa fa-forward fa-fw " aria-hidden ="true "> </ i > </ a > </ span >
79- </ div >
80-
227+ < div class ="row mt-3 mb-3 ">
228+ < div class ="col-sm ">
229+
230+ < a class ="btn btn-outline-primary btn-sm " href ="../08/ "> < i class ="fa fa-backward fa-fw " aria-hidden ="true "> </ i > Previous</ a >
231+
232+
233+ < span class ="float-right "> < a class ="btn btn-outline-primary btn-sm " href ="../01/ "> Next < i class ="fa fa-forward fa-fw " aria-hidden ="true "> </ i > </ a > </ span >
234+
235+ </ div >
81236</ div >
82237
83238 </ main >
@@ -107,6 +262,8 @@ <h1 id="Now-for-Some-Joined-Up-Thinking">Now for Some Joined-Up Thinking<a class
107262 } ;
108263 </ script >
109264 < script src ="https://sidecar.gitter.im/dist/sidecar.v1.js " async defer > </ script >
110-
265+ < script src ="https://code.jquery.com/jquery-3.2.1.slim.min.js " integrity ="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN " crossorigin ="anonymous "> </ script >
266+ < script src ="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js " integrity ="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q " crossorigin ="anonymous "> </ script >
267+ < script src ="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js " integrity ="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl " crossorigin ="anonymous "> </ script >
111268 </ body >
112269</ html >
0 commit comments