MySQL DDL:
/* 家庭成員資料表 範例資料 */
CREATE TABLE `Family` (
`FamilyId` varchar(100) NOT NULL PRIMARY KEY,
`FamilyName` varchar(10) DEFAULT NULL,
`FamilySex` varchar(10) DEFAULT NULL,
`BirthDate` datetime DEFAULT NULL,
`PhoneNumber` varchar(20) DEFAULT NULL
)CHARSET=utf8;
INSERT INTO `Family` (`FamilyId`, `FamilyName`, `FamilySex`, `BirthDate`, `PhoneNumber`) VALUES
('34bf1b6f-191d-40e9-9a8c-3c282e6a700d', '泰肝', '女生', '2007-10-11 00:00:00', ''),
('3ad93ba4-c799-4a32-ac2e-8abc74dd6375', '泰熱', '男生', '2001-12-10 00:00:00', '0934567890'),
('91b18f1f-4ef8-4066-97c4-28daea585db5', '泰胖', '女生', '2003-05-13 00:00:00', ''),
('91dcde4b-10b3-421e-ab8e-bb6bc23b4350', '泰瘦', '女生', '1985-07-10 00:00:00', '0944623456'),
('bce0e4ae-ac70-4131-aa6f-d1e25b87fad9', '泰冷', '男生', '1995-01-23 00:00:00', '0977654258'),
('de8cb5db-2061-4d35-a662-ba5f528fadba', '泰賢', '男生', '1977-02-03 00:00:00', '0944589456');
如果電腦有SQL Server的環境,可使用下面的SQL 建立並產生資料
CREATE TABLE [dbo].[Family](
[FamilyId] [nvarchar](100) NOT NULL,
[FamilyName] [nvarchar](10) NULL,
[FamilySex] [nvarchar](10) NULL,
[BirthDate] [datetime] NULL,
[PhoneNumber] [nvarchar](20) NULL,
CONSTRAINT [PK_Family] PRIMARY KEY CLUSTERED
(
[FamilyId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
INSERT INTO [dbo].[Family] ([FamilyId], [FamilyName], [FamilySex], [BirthDate], [PhoneNumber]) VALUES (N'34bf1b6f-191d-40e9-9a8c-3c282e6a700d', N'泰肝', N'女生', CAST(0x000099C400000000 AS DateTime), NULL)
INSERT [dbo].[Family] ([FamilyId], [FamilyName], [FamilySex], [BirthDate], [PhoneNumber]) VALUES (N'3ad93ba4-c799-4a32-ac2e-8abc74dd6375', N'泰熱', N'男生', CAST(0x0000917100000000 AS DateTime), N'0934567890')
INSERT [dbo].[Family] ([FamilyId], [FamilyName], [FamilySex], [BirthDate], [PhoneNumber]) VALUES (N'91b18f1f-4ef8-4066-97c4-28daea585db5', N'泰胖', N'女生', CAST(0x0000937800000000 AS DateTime), NULL)
INSERT [dbo].[Family] ([FamilyId], [FamilyName], [FamilySex], [BirthDate], [PhoneNumber]) VALUES (N'91dcde4b-10b3-421e-ab8e-bb6bc23b4350', N'泰瘦', N'女生', CAST(0x00007A0400000000 AS DateTime), N'0944623456')
INSERT [dbo].[Family] ([FamilyId], [FamilyName], [FamilySex], [BirthDate], [PhoneNumber]) VALUES (N'bce0e4ae-ac70-4131-aa6f-d1e25b87fad9', N'泰冷', N'男生', CAST(0x000087A000000000 AS DateTime), N'0977654258')
INSERT [dbo].[Family] ([FamilyId], [FamilyName], [FamilySex], [BirthDate], [PhoneNumber]) VALUES (N'de8cb5db-2061-4d35-a662-ba5f528fadba', N'泰賢', N'男生', CAST(0x00006DFD00000000 AS DateTime), N'0944589456')
SELECT *
FROM Family
MySQL:
CREATE TABLE `family` (
`FamilyId` varchar(100) NOT NULL,
`FamilyName` varchar(10) DEFAULT NULL,
`FamilySex` varchar(10) DEFAULT NULL,
`BirthDate` datetime DEFAULT NULL,
`PhoneNumber` varchar(20) DEFAULT NULL,
PRIMARY KEY (`FamilyId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
SQL Server:
CREATE TABLE [dbo].[Family](
[FamilyId] [nvarchar](100) NOT NULL,
[FamilyName] [nvarchar](10) NULL,
[FamilySex] [nvarchar](10) NULL,
[BirthDate] [datetime] NULL,
[PhoneNumber] [nvarchar](20) NULL,
由於代號、姓名、性別、電話不是非純數字的資料,所以資料型態選擇用字串類型varchar,字串的資料類型主要分為「可變動長度」、「固定長度」,延伸閱讀可參考下方兩個網址
http://lesliechang-blog.logdown.com/posts/690954-690954-char-varchar-nchar-nvarchar
https://dotblogs.com.tw/henryli/archive/2014/05/27/145277.aspx
每張資料表需要一個「主鍵」,清楚識別每一筆資料是不同的資料。
MySQL 在Create Table結束前設定,或設定在欄位後方
CREATE TABLE `family` (
`FamilyId` varchar(100) NOT NULL,
`FamilyName` varchar(10) DEFAULT NULL,
`FamilySex` varchar(10) DEFAULT NULL,
`BirthDate` datetime DEFAULT NULL,
`PhoneNumber` varchar(20) DEFAULT NULL,
PRIMARY KEY (`FamilyId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
SQL Server 的 CREATE TABLE 後方的SQL,則是將Family 的FamilyId 透過Constraint的語法,設定為主鍵
CONSTRAINT [PK_Family] PRIMARY KEY CLUSTERED
(
[FamilyId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
或者,直接在欄位後面設定主鍵,得到簡化後的CREATE TABLE:
CREATE TABLE [dbo].[Family](
[FamilyId] [nvarchar](100) NOT NULL PRIMARY KEY,
[FamilyName] [nvarchar](10) NULL,
[FamilySex] [nvarchar](10) NULL,
[BirthDate] [datetime] NULL,
[PhoneNumber] [nvarchar](20) NULL
)
MySQL:
INSERT INTO `Family` (`FamilyId`, `FamilyName`, `FamilySex`, `BirthDate`, `PhoneNumber`) VALUES
('34bf1b6f-191d-40e9-9a8c-3c282e6a700d', '泰肝', '女生', '2007-10-11 00:00:00', ''),
('3ad93ba4-c799-4a32-ac2e-8abc74dd6375', '泰熱', '男生', '2001-12-10 00:00:00', '0934567890'),
('91b18f1f-4ef8-4066-97c4-28daea585db5', '泰胖', '女生', '2003-05-13 00:00:00', ''),
('91dcde4b-10b3-421e-ab8e-bb6bc23b4350', '泰瘦', '女生', '1985-07-10 00:00:00', '0944623456'),
('bce0e4ae-ac70-4131-aa6f-d1e25b87fad9', '泰冷', '男生', '1995-01-23 00:00:00', '0977654258'),
('de8cb5db-2061-4d35-a662-ba5f528fadba', '泰賢', '男生', '1977-02-03 00:00:00', '0944589456');
SQL Server:
INSERT INTO [dbo].[Family]
([FamilyId], [FamilyName], [FamilySex],
[BirthDate], [PhoneNumber])
VALUES (N'34bf1b6f-191d-40e9-9a8c-3c282e6a700d', N'泰肝', N'女生',
CAST(0x000099C400000000 AS DateTime), NULL),
(N'3ad93ba4-c799-4a32-ac2e-8abc74dd6375', N'泰熱', N'男生',
CAST(0x0000917100000000 AS DateTime), N'0934567890'),
(N'91b18f1f-4ef8-4066-97c4-28daea585db5', N'泰胖', N'女生',
CAST(0x0000937800000000 AS DateTime), NULL),
(N'91dcde4b-10b3-421e-ab8e-bb6bc23b4350', N'泰瘦', N'女生',
CAST(0x00007A0400000000 AS DateTime), N'0944623456'),
(N'bce0e4ae-ac70-4131-aa6f-d1e25b87fad9', N'泰冷', N'男生',
CAST(0x000087A000000000 AS DateTime), N'0977654258'),
(N'de8cb5db-2061-4d35-a662-ba5f528fadba', N'泰賢', N'男生',
CAST(0x00006DFD00000000 AS DateTime), N'0944589456')
第二堂課大家只要知道,CREATE TABLE 用來建立資料表,INSERT INTO 用來新增資料到資料表即可
其餘的觀念介紹,等熟悉SELECT 語法之後我們再回來討論。
CREATE TABLE 在各大資料庫的語法:
https://www.javatpoint.com/sql-create-tableInsert INTO 在各大資料庫的語法
https://www.javatpoint.com/sql-insert
SELECT 需要的欄位
FROM 資料的來源
WHERE 過濾所需資料的篩選條件
ORDER BY 用什麼欄位決定資料的呈現順序 ASC 升冪/ DESC 降冪
SELECT *
FROM Family;
FamilyId | FamilyName | FamilySex | BirthDate | PhoneNumber |
---|---|---|---|---|
34bf1b6f-191d-40e9-9a8c-3c282e6a700d | 泰肝 | 女生 | 2007-10-11 00:00:00 | |
3ad93ba4-c799-4a32-ac2e-8abc74dd6375 | 泰熱 | 男生 | 2001-12-10 00:00:00 | 0934567890 |
91b18f1f-4ef8-4066-97c4-28daea585db5 | 泰胖 | 女生 | 2003-05-13 00:00:00 | |
91dcde4b-10b3-421e-ab8e-bb6bc23b4350 | 泰瘦 | 女生 | 1985-07-10 00:00:00 | 0944623456 |
bce0e4ae-ac70-4131-aa6f-d1e25b87fad9 | 泰冷 | 男生 | 1995-01-23 00:00:00 | 0977654258 |
de8cb5db-2061-4d35-a662-ba5f528fadba | 泰賢 | 男生 | 1977-02-03 00:00:00 | 0944589456 |
思考順序1:資料來源
我要哪張表的資料?家庭成員表Family
FROM Family
思考順序2:需要的欄位
我要哪些欄位?Family資料表的所有的欄位
SELECT Family.*
因為只有查詢一張表,所以欄位的部分可以不用指定表格的名稱
SELECT *
SELECT FamilyName,
FamilySex,
BirthDate,
PhoneNumber
FROM Family;
FamilyName | FamilySex | BirthDate | PhoneNumber |
---|---|---|---|
泰肝 | 女生 | 2007-10-11 00:00:00 | |
泰熱 | 男生 | 2001-12-10 00:00:00 | 0934567890 |
泰胖 | 女生 | 2003-05-13 00:00:00 | |
泰瘦 | 女生 | 1985-07-10 00:00:00 | 0944623456 |
泰冷 | 男生 | 1995-01-23 00:00:00 | 0977654258 |
泰賢 | 男生 | 1977-02-03 00:00:00 | 0944589456 |
思考順序1:資料來源
我要哪張表的資料?家庭成員表Family
FROM Family
思考順序2:需要的欄位
我要哪些欄位?家庭成員表Family的成員姓名、成員性別、生日、電話
SELECT Family.FamilyName,
Family.FamilySex,
Family.BirthDate,
Family.PhoneNumber
因為只有查詢一張表,所以欄位的部分可以不用指定表格的名稱 (與問題一相同)
SELECT FamilyName
FROM Family
WHERE FamilySex = '男生';
FamilyName |
---|
泰熱 |
泰冷 |
泰賢 |
思考順序1:資料來源
我要哪張表的資料?家庭成員表Family
FROM Family
思考順序2:過濾需要的資料
我要那些資料?性別為男生的成員
WHERE FamilySex = N'男生'
由於網頁編碼的關係,所以在SQL Fiddle 查詢中文時,字串前面要加上N,指定字串「男生」為Unicode編碼格式
思考順序3:需要的欄位
我要哪些欄位?姓名
SELECT FamilyName
SELECT FamilyName,
BirthDate
FROM Family
WHERE FamilySex = '男生'
ORDER BY BirthDate DESC;
FamilyName | BirthDate |
---|---|
泰熱 | 2001-12-10 00:00:00 |
泰冷 | 1995-01-23 00:00:00 |
泰賢 | 1977-02-03 00:00:00 |
思考順序1:資料來源
我要哪張表的資料?家庭成員表Family
FROM Family
思考順序2:過濾需要的資料
我要那些資料?性別為男生的成員
WHERE FamilySex = N'男生'
由於網頁編碼的關係,所以在SQL Fiddle 查詢中文時,字串前面要加上N,指定字串「男生」為Unicode編碼格式
思考順序3:需要的欄位
我要哪些欄位?姓名、生日
SELECT FamilyName,
BirthDate
思考順序4:用什麼欄位決定資料的呈現順序
依照生日,由年長→年幼排序(DESC 降冪)
ORDER BY BirthDate DESC
如果是升冪,則使用ASC
ORDER BY BirthDate ASC
或者直接省略不寫ASC
ORDER BY BirthDate
SELECT 原本的欄位名稱 AS 替欄位取的別名
FROM 原本的表格名稱 AS 替表格取得別名
範例:sql
SELECT FamilyName AS 姓名,
FamilySex AS 性別
FROM Family AS 家庭成員
MySQL 超新手入門(3)SELECT 基礎查詢
http://www.codedata.com.tw/database/mysql-tutorial-basic-query/
[SQL] SQL指令重點整理(三):SQL限制(SQL Constraint)之介紹
https://peimei0808.pixnet.net/blog/post/155927679-%5Bsql%5D-sql%E6%8C%87%E4%BB%A4%E9%87%8D%E9%BB%9E%E6%95%B4%E7%90%86(%E4%B8%89)%EF%BC%9Asql%E9%99%90%E5%88%B6(sql-constraint)
練習題目:員工資料表
https://www.tutorialrepublic.com/codelab.php?topic=sql&file=select-all
操作說明:
從薪水(salary)低的人開始往薪水高的員工排列,列出所有部門編號(dept_id)=5 的 員工姓名(emp_name)、雇用日期(hire_date)、薪水(salary)
1. FROM 資料來源
2. ON
3. JOIN
4. WHERE 過濾需要的資料
5. GROUP BY
6. WITH CUBE 或 WITH ROLLUP
7. HAVING
8. WINDOW functions
9. SELECT 需要的欄位
10. DISTINCT
11. ORDER BY 用什麼欄位決定資料的呈現順序
12. TOP (LIMIT / OFFSET)