文章

目前顯示的是 五月, 2014的文章

SQL SELECT語法整理

圖片
假設有以下資料表 class, classmain, teacher, student, dept, tea, stud ~ (1) SELECT * FROM CLASS; (2) SELECT sid, cid FROM CLASS; (3) SELECT sid AS s, cid AS c FROM CLASS; (4) 模擬SELECT INTO語法 (MYSQL不支援SELECT INTO) INSERT INTO myclass (class_no,class_name) SELECT cid, classname FROM classmain; (5) SELECT * FROM classmain WHERE cid>'C004'; (6) SELECT * FROM class WHERE score>60 AND cid='C005'; (7) SELECT * FROM class WHERE cid='C005' AND NOT score>60; (8) SELECT * FROM class WHERE score IS NULL ; (9) SELECT * FROM class WHERE score IS NOT NULL; (10) SELECT * FROM classmain WHERE classname LIKE 'data%'; (11) SELECT * FROM classmain WHERE classname LIKE 'data%' OR classname LIKE '%mgm'; (12) SELECT * FROM classmain WHERE cid IN ('C001','C003','C005'); (13) SELECT * FROM classmain WHERE cid NOT IN ('C001','C003','C005'); (14) SELECT * FROM

資料表單的運算

圖片
在關聯式代數中,有以下幾種不同的運算: -- 限制 (Restrict) ~ 選取符合某些條件的值組(記錄),另成一個新的關聯表。 例如: SELECT * FROM tableA WHERE [conditions] -- 投影 (Project) ~ 選取想要的欄位(屬性),另成一個新的關聯表。 例如: SELECT [some fields] FROM tableA -- 卡氏積 (Cartesian Product) ,又稱Cross Product(交叉乘積)、Cross Join(交叉合併) ~ 將兩個關聯表相乘,形成一個新的關聯表。但是光是關聯表相乘,並不是我們真正需要的,所以通常相乘後,都還需要加上另外的條件。 例如: SELECT * FROM tableA, tableB 或是: SELECT * FROM tableA CROSS JOIN tableB 上面兩個表示法,得到的結果是相同的。 例如兩個表單 student (五筆資料) 與 class (十筆資料) ,資料表內容如下: 我們以SELECT * FROM student, class; 及SELECT * FROM student CROSS JOIN class; 執行結果如下 (五十筆資料) : 當然上面兩個表示法,其結果並沒有意義,所以我們可以再加上條件。 例如: SELECT sid, sname, cid FROM student, class  WHERE sid='S0001'; 找出某特定學生修習哪些課程,列出其學號、姓名、課號。 -- 合併 (Join) 假設上圖中,左圓是老師資料表(teacher),右圓是課程資料表(classmain)。 如果我們使用INNER JOIN,就是取得標示(1)的部分,語法如下: [INNER JOIN] SELECT * FROM tableA a INNER JOIN tableB b ON a.key=b.key; SELECT * FROM tableA a INNER JOIN tableB b USING (key); SELECT * FROM tableA a, tableB

實作練習

圖片
(1)建立資料庫 create database myhome character set utf8 collate utf8_general_ci; 建立mycategory CREATE TABLE mycategory ( cid char(3) NOT NULL, cname varchar(30), cflag char(1), PRIMARY KEY (cid) ); 建立mymoney CREATE TABLE mymoney ( mid char(10) NOT NULL, cid char(3) NOT NULL, mdate char(8), mamount int(7), mperson char(1), PRIMARY KEY (mid) ); (2)歲末時想知道今年每個月的汽油費用開銷多少,應該如何寫出SQL?  select sum(mamount) from mymoney where cid='003' group by substr(mdate,1,6); ※如果要知道「每年 汽油費用開銷多少 」,應該如何寫SQL呢? (3)歲末時要知道今年每個月的收支狀況,應該如何寫出SQL?  支出狀況 (cflag='0') select sum(mamount),substr(mdate,1,6) as mm from mymoney a, mycategory b where a.cid=b.cid and cflag='0' group by mm having mm between '201401' and '201412'  收入狀況   (cflag='1')   select sum(mamount),substr(mdate,1,6) as mm from mymoney a, mycategory b where a.cid=b.cid and cflag='1' group by mm having mm between '201401' and '201412' ※ 如果要知道「2014年每月吃

MYSQL DDL (Data Definition Language)

圖片
(1) CREATE DATABASE 範例 CREATE DATABASE dbname; 範例 CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci; (2) CREATE TABLE 範例 CREATE TABLE mytable (field1 CHAR(10), field2 INT(10)) ; 範例 CREATE TABLE customer ( cus_id int NOT NULL, cus_name varchar(255) NOT NULL, cus_address varchar(255), cus_no char(3), PRIMARY KEY (cus_id) ); 範例 CREATE TABLE A LIKE B; ~ 此種方式在將表復制到A時候會將表B完整的字段結構和索引復制到表A中來。 範例 CREATE TABLE A AS SELECT x,x,x,xx FROM B LIMIT 0; ~ 此種方式只會將表B的字段結構復制到表A中來,但不會復制表B中的索引到表A中來。這種方式比較靈活可以在復制原表表結構的同時指定要復制哪些字段,並且自身復制表也可以根據需要增加字段結構。 如下所示,以LIKE方式去建立TABLE,會有Index 。 但是如果以AS SELECT 方式去建立TABLE,則以SHOW Index顯示為empty。 範例 CREATE TABLE customer (  C_Id INT NOT NULL,  Name VARCHAR(50) NOT NULL,  Address VARCHAR(255),  Phone VARCHAR(20),  UNIQUE (C_Id) ); 範例 CREATE TABLE customer (  C_Id INT NOT NULL UNIQUE,  Name VARCHAR(50) NOT NULL,  Address VARCHAR(255),  Phone VARCHAR(20) ); 範例 CREATE TABLE product ( category INT NOT NULL