戴均民
目前任職於微程式股份有限公司,從高中因為社團接觸 ACM,然後大學開始自學 PHP。主要是後端工程師,前端略有涉略,美工超級不擅長。 請大家多多指教。
戴均民 @ 中興大學資訊社
country | gold | silver | bronze | total |
---|---|---|---|---|
Russia | 13 | 11 | 9 | 33 |
United States | 9 | 7 | 12 | 28 |
Norway | 11 | 5 | 10 | 26 |
Canada | 10 | 10 | 5 | 25 |
Netherlands | 8 | 7 | 9 | 24 |
Table 和 Cloumn 的名稱允許以下格式
U+0080 ~ U+FFFF
CREATE TABLE employee (
employee_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
last_name VARCHAR(30) NOT NULL,
first_name VARCHAR(30) NOT NULL,
email VARCHAR(100) NOT NULL,
hire_date DATE NOT NULL,
notes MEDIUMTEXT,
PRIMARY KEY (employee_id),
INDEX (last_name),
UNIQUE (email)
)
ENGINE=InnoDB;
CREATE TABLE address (
employee_id INTEGER UNSIGNED NOT NULL,
address VARCHAR(50) NOT NULL,
city VARCHAR(30) NOT NULL,
state CHAR(2) NOT NULL,
postcode CHAR(5) NOT NULL,
FOREIGN KEY (employee_id)
REFERENCES employee (employee_id)
)
ENGINE=InnoDB;
不能為 NULL
CREATE TABLE employee (
employee_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
last_name VARCHAR(30) NOT NULL,
first_name VARCHAR(30) NOT NULL,
email VARCHAR(100) NOT NULL,
hire_date DATE NOT NULL,
notes MEDIUMTEXT,
PRIMARY KEY (employee_id),
INDEX (last_name),
UNIQUE (email)
)
ENGINE=InnoDB;
CREATE TABLE address (
employee_id INTEGER UNSIGNED NOT NULL,
address VARCHAR(50) NOT NULL,
city VARCHAR(30) NOT NULL,
state CHAR(2) NOT NULL,
postcode CHAR(5) NOT NULL,
FOREIGN KEY (employee_id)
REFERENCES employee (employee_id)
)
ENGINE=InnoDB;
CREATE TABLE employee (
employee_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
last_name VARCHAR(30) NOT NULL,
first_name VARCHAR(30) NOT NULL,
email VARCHAR(100) NOT NULL,
hire_date DATE NOT NULL,
notes MEDIUMTEXT,
PRIMARY KEY (employee_id),
INDEX (last_name),
UNIQUE (email)
)
ENGINE=InnoDB;
CREATE TABLE address (
employee_id INTEGER UNSIGNED NOT NULL,
address VARCHAR(50) NOT NULL,
city VARCHAR(30) NOT NULL,
state CHAR(2) NOT NULL,
postcode CHAR(5) NOT NULL,
FOREIGN KEY (employee_id)
REFERENCES employee (employee_id)
)
ENGINE=InnoDB;
CREATE TABLE employee (
employee_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
last_name VARCHAR(30) NOT NULL,
first_name VARCHAR(30) NOT NULL,
email VARCHAR(100) NOT NULL,
hire_date DATE NOT NULL,
notes MEDIUMTEXT,
PRIMARY KEY (employee_id),
INDEX (last_name),
UNIQUE (email)
)
ENGINE=InnoDB;
CREATE TABLE address (
employee_id INTEGER UNSIGNED NOT NULL,
address VARCHAR(50) NOT NULL,
city VARCHAR(30) NOT NULL,
state CHAR(2) NOT NULL,
postcode CHAR(5) NOT NULL,
FOREIGN KEY (employee_id)
REFERENCES employee (employee_id)
)
ENGINE=InnoDB;
CREATE TABLE employee (
employee_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
last_name VARCHAR(30) NOT NULL,
first_name VARCHAR(30) NOT NULL,
email VARCHAR(100) NOT NULL,
hire_date DATE NOT NULL,
notes MEDIUMTEXT,
PRIMARY KEY (employee_id),
INDEX (last_name),
UNIQUE (email)
)
ENGINE=InnoDB;
CREATE TABLE address (
employee_id INTEGER UNSIGNED NOT NULL,
address VARCHAR(50) NOT NULL,
city VARCHAR(30) NOT NULL,
state CHAR(2) NOT NULL,
postcode CHAR(5) NOT NULL,
FOREIGN KEY (employee_id)
REFERENCES employee (employee_id)
)
ENGINE=InnoDB;
CREATE TABLE employee (
employee_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
last_name VARCHAR(30) NOT NULL,
first_name VARCHAR(30) NOT NULL,
email VARCHAR(100) NOT NULL,
hire_date DATE NOT NULL,
notes MEDIUMTEXT,
PRIMARY KEY (employee_id),
INDEX (last_name),
UNIQUE (email)
)
ENGINE=InnoDB;
CREATE TABLE address (
employee_id INTEGER UNSIGNED NOT NULL,
address VARCHAR(50) NOT NULL,
city VARCHAR(30) NOT NULL,
state CHAR(2) NOT NULL,
postcode CHAR(5) NOT NULL,
FOREIGN KEY (employee_id)
REFERENCES employee (employee_id)
)
ENGINE=InnoDB;
CREATE TABLE employee (
employee_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
last_name VARCHAR(30) NOT NULL,
first_name VARCHAR(30) NOT NULL,
email VARCHAR(100) NOT NULL,
hire_date DATE NOT NULL,
notes MEDIUMTEXT,
PRIMARY KEY (employee_id),
INDEX (last_name),
UNIQUE (email)
)
ENGINE=InnoDB;
CREATE TABLE address (
employee_id INTEGER UNSIGNED NOT NULL,
address VARCHAR(50) NOT NULL,
city VARCHAR(30) NOT NULL,
state CHAR(2) NOT NULL,
postcode CHAR(5) NOT NULL,
FOREIGN KEY (employee_id)
REFERENCES employee (employee_id)
)
ENGINE=InnoDB;
型態 | Byte(s) | 有號最小 | 有號最大 | 無號最小 | 無號最大 |
---|---|---|---|---|---|
TINYINT | 1 | -128 | 127 | 0 | 255 |
SMALLINT | 2 | -32768 | 32767 | 0 | 65535 |
MEDIUMINT | 3 | -8388608 | 8388607 | 0 | 6777215 |
INTEGER | 4 | -2147483648 | 2147483647 | 0 | 4294967295 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 | 0 | 18446744073709551615 |
型態 | Byte(s) | 說明 |
---|---|---|
FLOAT | 4 | 能存 -3.402823466e+38 與 3.402823466e+38 之間的近似值 |
DOUBLE | 8 | 能存 -1.7976931348623157e+308 與 1.7976931348623157e+308 之間的近似值 |
DECIMAL | 不定 | 能存完全精準的數值,儲存在這個型態中的數值,不論是查詢或是運算,都不會有任何誤差。最大長度 65,最大小數長度 30。 |
型態 | Byte(s) | 最大長度 |
---|---|---|
CHAR(m) | m × 字元集單一字元最大 byte(s) | 255 chars |
VARCHAR(m) | 最大值 m × 字元集單一字元最大 byte(s) + 2 | 65535 chars |
型態 | Byte(s) | 最大長度 |
---|---|---|
BINARY(m) | m | 255 bytes |
VARBINARY(m) | 最大值 m + 2 | 65535 bytes |
型態 | Byte(s) | 最大長度 |
---|---|---|
TEXT | 資料的 byte(s) 大小 + 2 | 65535 chars |
TINYTEXT | 資料的 byte(s) 大小 + 1 | 255 chars |
MEDIUMTEXT | 資料的 byte(s) 大小 + 3 | 16777215 chars |
LONGTEXT | 資料的 byte(s) 大小 + 4 | 4294967295 chars |
型態 | Byte(s) | 最大長度 |
---|---|---|
BLOB | 資料的 byte(s) 大小 + 2 | 65535 bytes |
TINYBLOB | 資料的 byte(s) 大小 + 1 | 255 bytes |
MEDIUMBLOB | 資料的 byte(s) 大小 + 3 | 16777215 bytes |
LONGBLOB | 資料的 byte(s) 大小 + 4 | 4294967295 bytes |
型態 | Byte(s) | 最大長度 |
---|---|---|
ENUM | 最大值 2 | 65535 values |
SET | 最大值 8 | 64 members |
型態 | Byte(s) | 最小值 | 最大值 |
---|---|---|---|
DATETIME | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 4 | 1970-01-01 00:00:01 UTC | 2038-01-19 03:14:07 UTC |
DATE | 3 | 1000-01-01 | 9999-12-31 |
TIME | 3 | -838:59:59 | 838:59:59 |
YEAR | 1 | 1901 | 2155 |
InnoDB | MyISAM | |
---|---|---|
儲存上限 | 64TB | 256TB |
ACID | ✓ | ✘ |
強制性 Foreign Key | ✓ | ✘ |
索引 | ✓ | ✓ |
同時新增 | ✓ | ✓ |
強制性 UNIQUE | ✓ | ✓ |
全文搜尋 | ✓ | ✓ |
資料鎖定 | Row | Table |
Transactions | ✓ | ✘ |
幾何地理資料類型 | ✓ | ✓ |
加密 | ✓ | ✓ |
資料庫同步 | ✓ | ✓ |
叢集 | ✘ | ✘ |
INSERT INTO employee
(first_name, last_name, email, hire_date)
VALUES
('Nischal', 'Bhatia', 'nbhatia@example.com', '2014-12-15');
SELECT * FROM employee;
INSERT INTO employee VALUES
(NULL, 'Bhatia', 'Nischal', 'nbhatia@example.com', '2014-12-15', NULL);
USE sakila;
SOURCE C:/temp/sakila-db/sakila-schema.sql;
SOURCE C:/temp/sakila-db/sakila-data.sql;
SELECT last_name, first_name
FROM actor;
SELECT last_name, first_name
FROM actor
ORDER BY last_name;
SELECT last_name, first_name
FROM actor
ORDER BY last_name ASC, first_name DESC;
SELECT last_name, first_name
FROM actor
ORDER BY last_name ASC, first_name DESC
LIMIT 5;
SELECT title, length, rating
FROM film
WHERE length < 60
ORDER BY title;
SELECT title, length, rating
FROM film
WHERE length >= 60 AND length <= 120
ORDER BY title;
SELECT title, length, rating
FROM film
WHERE length = 60 OR length = 120 OR length = 180
ORDER BY title;
SELECT title, length, rating
FROM film
WHERE title LIKE '%GAME%'
ORDER BY title;
運算子 | 說明 |
---|---|
A = B | 當兩者相等時成立 |
A < B | 當 A 小於 B 時成立 |
A <= B | 當 A 不大於 B 時成立 |
A > B | 當 A 大於 B 時成立 |
A >= B | 當 A 不小於 B 時成立 |
A != B 或 A <> B | 當兩者不等時成立 |
A IS NULL | 當 A 是 NULL 時成立 |
A LIKE 'PATTERN%' | 當 A 匹配這個 Pattern 時成立(萬用字元是 % 和 _) |
A REGEXP '/EXPRESSION/' | 當 A 匹配這個正規表示法時成立 |
A BETWEEN B AND C | 當 A >= B 且 A <= C 時成立 |
A IN (B,C,D) | 當 A 是 B, C, D 其中之一時成立 |
SELECT MAX(amount)
FROM payment;
SELECT COUNT(payment_id)
FROM payment;
SELECT customer_id, SUM(amount) AS amt
FROM payment
GROUP BY customer_id
ORDER BY amt DESC
LIMIT 10;
SELECT customer_id, first_name, last_name
FROM customer
WHERE first_name = 'Courtney' AND last_name = 'Day';
UPDATE customer
SET last_name = 'DAY-WEBB'
WHERE customer_id = 245;
SELECT customer_id, first_name, last_name
FROM customer
WHERE customer_id = 245;
DELETE FROM customer WHERE customer_id = 245;
ERROR 1451 (23000): Cannot delete or update a parent
row: a foreign key constraint fails (`sakila`.`payment`,
CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`)
REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE)
DELETE FROM payment WHERE customer_id = 245;
DELETE FROM rental WHERE customer_id = 245;
DELETE FROM customer WHERE customer_id = 245;
X1. 取得餘額 A
X2. 將 A+X 寫回去
Y1. 取得餘額 A + X
Y2. 將 A+X+Y 寫回去
X1. 取得餘額 A
Y1. 取得餘額 A
X2. 將 A+X 寫回去
Y2. 將 A+Y 寫回去
START TRANSACTION;
SELECT * FROM account WHERE name IN ('A', 'B') FOR UPDATE;
-- 如果餘額不足就需要透過程式執行 ROLLBACK
ROLLBACK;
START TRANSACTION;
SELECT * FROM account WHERE name IN ('A', 'B') FOR UPDATE;
-- 如果餘額足夠就開始進行轉帳
UPDATE account SET balance = balance - 10 WHERE name = 'A';
UPDATE account SET balance = balance + 10 WHERE name = 'B';
COMMIT;
原子性 | 一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。 |
一致性 | 在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。 |
隔離性 | 當兩個或者多個事務並發訪問(此處訪問指查詢和修改的操作)資料庫的同一數據時所表現出的相互關係。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。 |
持久性 | 在事務完成以後,該事務對資料庫所作的更改便持久地保存在資料庫之中,並且是完全的。 |
如何找出前五名演出最多電影的演員?
SELECT actor_id, COUNT(actor_id) AS appearances
FROM film_actor
GROUP BY actor_id
ORDER BY appearances DESC
LIMIT 5;
SELECT actor_id, first_name, last_name
FROM actor
WHERE actor_id IN (107, 102, 198, 181, 23);
如何找出前五名演出最多電影的演員?
SELECT
a.first_name, a.last_name,
COUNT(fa.film_id) AS appearance_count
FROM
film_actor AS fa
JOIN actor AS a ON a.actor_id = fa.actor_id
GROUP BY
fa.actor_id
ORDER BY
appearance_count DESC
LIMIT 5;
也想要計算沒有演出電影的演員時
與 LEFT JOIN 功能相同
By 戴均民