創(chuàng)建用戶 & 授權(quán)
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON *.* TO 'tinydolphin'@'localhost';
創(chuàng)建數(shù)據(jù)庫(kù) & 數(shù)據(jù)表
-- 創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE sampdb;
-- 查詢當(dāng)前選定的數(shù)據(jù)庫(kù)
SELECT database();
-- 選擇數(shù)據(jù)庫(kù)
USE sampdb;
-- 創(chuàng)建數(shù)據(jù)表
CREATE TABLE president(
last_name VARCHAR(15) NOT NULL COMMENT '名',
first_name VARCHAR(15) NOT NULL COMMENT '姓',
suffix VARCHAR(5) NULL COMMENT '姓名后綴',
city VARCHAR(20) NOT NULL COMMENT '出生地(城市)',
state VARCHAR(2) NOT NULL COMMENT '出生地(州)',
brith DATE NOT NULL COMMENT '出生日期',
death DATE NULL COMMENT '逝世日期'
) COMMENT='總統(tǒng)信息表';
-- comment '注釋'
CREATE TABLE member(
member_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (member_id), -- 設(shè)置主鍵
last_name VARCHAR(15) NOT NULL COMMENT '名',
first_name VARCHAR(15) NOT NULL COMMENT '姓',
suffix VARCHAR(5) NULL COMMENT '姓名后綴',
expiration DATE NULL COMMENT '失效日期',
email VARCHAR(100) NULL COMMENT '電子郵箱地址',
street VARCHAR(50) NULL COMMENT '郵政地址(街道地址)',
city VARCHAR(50) NULL COMMENT '郵政地址(城市名)',
state VARCHAR(2) NULL COMMENT '郵政地址(州)',
zip VARCHAR(10) NULL COMMENT '郵政編碼',
phone VARCHAR(20) NULL COMMENT '電話號(hào)碼',
interests VARCHAR(255) NULL COMMENT '會(huì)員興趣關(guān)鍵字'
) COMMENT='會(huì)員信息表';
-- unsigned 不允許出現(xiàn)負(fù)數(shù) & auto_increment 遞增
-- auto_increment 工作原理:如果沒(méi)有給出 member_id 的值(或者給出的值為 null),MySQL 將自動(dòng)生成下一個(gè)編號(hào)并賦值給它
-- primary key 表示需要對(duì) member_id 數(shù)據(jù)列創(chuàng)建索引以加快查找速度,同時(shí)也要求該數(shù)據(jù)列里的各個(gè)值必須是唯一的
-- 查看表結(jié)構(gòu)四種方式
DESCRIBE president '%name';
DESC president;
EXPLAIN president;
SHOW COLUMNS FROM president LIKE '%name';
-- 列出當(dāng)前數(shù)據(jù)庫(kù)里的數(shù)據(jù)表
SHOW TABLES ;
-- 列出當(dāng)前連接的服務(wù)器上的數(shù)據(jù)庫(kù)
SHOW DATABASES ;
CREATE TABLE student(
name VARCHAR(20) NOT NULL COMMENT '姓名',
sex ENUM('F','M') NOT NULL COMMENT '性別(F:女 M:男)',
student_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '學(xué)生ID',
PRIMARY KEY (student_id)
)ENGINE = InnoDB COMMENT='學(xué)生表';
-- ENUM('F','M'):枚舉類型
-- engine 子句是指定 MySQL 用來(lái)創(chuàng)建數(shù)據(jù)表的存儲(chǔ)引擎的名字,
-- 默認(rèn)是使用 MyISAM(indexed sequential access method:索引化順序訪問(wèn)方法)
-- 查看 student 的 sex 字段
DESCRIBE student 'sex';
CREATE TABLE grade_event(
data DATE NOT NULL COMMENT '日期',
category ENUM('T','Q') NOT NULL COMMENT '分?jǐn)?shù)的類型',
event_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '事件ID',
PRIMARY KEY (event_id)
) ENGINE = InnoDB COMMENT='年級(jí)事件表';
CREATE TABLE score(
student_id INT UNSIGNED NOT NULL COMMENT '學(xué)生ID',
event_id INT UNSIGNED NOT NULL COMMENT '事件ID',
score INT NOT NULL COMMENT '分?jǐn)?shù)',
PRIMARY KEY (event_id,student_id),
INDEX (student_id), -- 為什么定義一個(gè)索引?因?yàn)椴粷M足條件②,只能滿足條件①。
FOREIGN KEY (event_id) REFERENCES grade_event(event_id),
FOREIGN KEY (student_id) REFERENCES student(student_id)
) ENGINE = InnoDB COMMENT='分?jǐn)?shù)表';
-- foreign key 定義它遵循的約束條件
-- references 指定主外鍵對(duì)應(yīng)
-- 對(duì)于 foreign key 中出現(xiàn)的數(shù)據(jù)列,只有兩種:①、本身就是索引;②、多數(shù)據(jù)列索引里面的第一個(gè)被列出來(lái)的數(shù)據(jù)列(event_id)。
-- 此處,雖然 InnoDB 存儲(chǔ)引擎會(huì)自動(dòng)給出現(xiàn)在外鍵定義里的數(shù)據(jù)列(student_id) 創(chuàng)建索引,但是自動(dòng)創(chuàng)建的不一定是你想要的。
CREATE TABLE absence(
student_id INT UNSIGNED NOT NULL COMMENT '學(xué)生ID',
date DATE NOT NULL COMMENT '缺勤日期',
PRIMARY KEY (student_id,date),
FOREIGN KEY (student_id) REFERENCES student(student_id)
) ENGINE = InnoDB COMMENT='缺勤表';
添加新的數(shù)據(jù)行
-- 添加新的數(shù)據(jù)行
-- 1、利用 INSERT 語(yǔ)句添加數(shù)據(jù)
-- (1)、一次性地列出全部數(shù)據(jù)列的值
INSERT INTO student VALUES ('kyle','M',NULL );
INSERT INTO grade_event VALUES ('2017-12-03','Q',NULL );
INSERT INTO student VALUES ('Avery','F',NULL),('Nathan','M',NULL);
-- 字符串和日期值必須放在 '' 或者 "" 里才能被引用,放在 '' 里更加標(biāo)準(zhǔn)。
-- 在一個(gè) auto_increment 數(shù)據(jù)列里插入一個(gè)表示"無(wú)數(shù)據(jù)"的 NULL 值時(shí),MySQL 會(huì)為這個(gè)數(shù)據(jù)列自動(dòng)生成下一個(gè)序號(hào)。
-- (2)、直接對(duì)數(shù)據(jù)列進(jìn)行賦值
INSERT INTO member (last_name,first_name) VALUES ('Stein','Waldo');
INSERT INTO student (name, sex) VALUES ('Abby','F'),('Joseph','M');
-- (3)、包含 col_name = value(而非values()列表)的 SET 子句對(duì)數(shù)據(jù)列賦值
INSERT INTO member SET last_name='Stein',first_name='Waldo';
-- 不允許一次插入多個(gè)數(shù)據(jù)行
-- 2、通過(guò)從文件中讀取來(lái)添加新行(后續(xù)詳解)
LOAD DATA LOCAL INFILE 'member.txt' INTO TABLE member;
檢索信息
-- 檢索信息
SELECT * FROM president;
-- 注意:數(shù)據(jù)庫(kù)和數(shù)據(jù)表的名字可能區(qū)分字母的大小寫(xiě),取決于服務(wù)器主機(jī)上所使用的文件系統(tǒng),以及 MySQL 的配置情況
-- Windows 文件名不區(qū)分大小寫(xiě),Unix 文件區(qū)分大小寫(xiě)
-- 1、指定檢索條件
SELECT * FROM score WHERE score > 95;
-- 以下兩句相同效果
SELECT last_name,first_name,state FROM president
WHERE state='VA' OR state='MA';
SELECT last_name,first_name,state FROM president
WHERE state IN ('VA','MA');
-- 2、NULL 值
-- 完成 NULL 值與 NULL 值之間的比較
SELECT * FROM president WHERE death IS NULL ;
SELECT * FROM president WHERE death <=> NULL;
SELECT * FROM president WHERE suffix IS NOT NULL;
SELECT * FROM president WHERE NOT (suffix<=> NULL);
-- 3、對(duì)查詢結(jié)果進(jìn)行排序默認(rèn)升序: ASC升序 DESC降序
SELECT * FROM president ORDER BY last_name DESC,first_name ASC;
-- 對(duì)于 NULL 值的數(shù)據(jù)行,升序在開(kāi)頭,降序在末尾。
SELECT * FROM president ORDER BY if(death IS NULL ,0,1),death DESC;
-- IF():對(duì)第一個(gè)參數(shù)進(jìn)行求值。如果 death 為 NULL,返回 0,如果 death 不為 NULL,返回 1
-- 4、限制查詢結(jié)果中的數(shù)據(jù)行數(shù)
SELECT * FROM president ORDER BY brith LIMIT 5; -- 查詢結(jié)果的前 5 條
SELECT * FROM president ORDER BY brith DESC LIMIT 10,5; -- 查詢結(jié)果的第 11-15 條。
SELECT * FROM president ORDER BY rand() LIMIT 1; -- 隨機(jī)取出一條
-- 5、對(duì)輸出列進(jìn)行求值和命名
SELECT concat(first_name,' ',last_name) AS 'Name', concat(city,',',state) AS 'Brithplace' FROM president;
-- concat():合并多列; AS:設(shè)置別名
-- 6、日期有關(guān)
-- 日期中的年、月、日三部分可以用函數(shù) year()、month()、dayofmonth() 分離出來(lái)
SELECT * FROM president WHERE month(brith) = 3;
SELECT * FROM president WHERE timestampdiff(YEAR,brith,death) = 21; -- 查詢出 death、brith 相差的年數(shù)
-- to_days() 將日期轉(zhuǎn)換為天數(shù)
SELECT date_add('2017-1-1',INTERVAL 10 MONTH); -- 返回 2017-11-01
SELECT date_sub('2017-12-20',INTERVAL 10 MONTH); -- 返回 2017-02-20
-- 7、模式匹配
SELECT * FROM president WHERE last_name LIKE 'W%';
SELECT * FROM president WHERE last_name LIKE '____'; -- 查詢出姓氏僅由4個(gè)字母構(gòu)成的
-- 8、設(shè)置和使用 SQL 變量
-- 變量命名:@變量名 := 值
SELECT @brith := brith FROM president -- 查詢出來(lái)的結(jié)果保存在 brith 變量中,供今后查詢
WHERE last_name='Jackson' AND first_name = 'Andrew';
-- 調(diào)用變量:@變量名
SELECT * FROM president WHERE brith < @brith ORDER BY brith;
-- set 語(yǔ)句也能用來(lái)對(duì)變量賦值,此時(shí),'=' 和 ':=' 都可以用做賦值操作符
SET @today = curdate();
SET @one_week_ago := date_sub(@today , INTERVAL 7 DAY);
SELECT @today,@one_week_ago;
-- 9、生成統(tǒng)計(jì)信息
-- distinct:清除查詢結(jié)果中重復(fù)出現(xiàn)的數(shù)據(jù)行
SELECT DISTINCT state FROM president ORDER BY state;
-- count(*) 返回查詢結(jié)果的行數(shù)(非 NULL)
SELECT count(*) FROM member;
SELECT count(*),count(email),count(expiration) FROM member;
SELECT count(DISTINCT state) FROM president;
SELECT sex,count(*) FROM student GROUP BY sex;
SELECT month(brith) AS Month,monthname(brith) AS Name, count(*) AS count
FROM president
GROUP BY Name
ORDER BY Month;
-- 上一條語(yǔ)句不符合 MySQL 對(duì)于 ONLY_FULL_GROUP_BY 語(yǔ)義的判斷規(guī)則,所以需要去除 ONLY_FULL_GROUP_BY 語(yǔ)義規(guī)則
SET GLOBAL SQL_MODE='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
-- 查詢?nèi)肿兞?SQL_MODE 的值
SELECT @@global.SQL_MODE;
-- count() 之類的匯總函數(shù)的計(jì)算結(jié)果允許在 having 子句中出現(xiàn)
SELECT state,count(*) AS count FROM president
GROUP BY state HAVING count > 1 ORDER BY count DESC;
-- 如果想輸出"統(tǒng)計(jì)結(jié)果",那就增加一條 with rollup 子句
-- 作用:分組統(tǒng)計(jì)結(jié)果的匯總統(tǒng)計(jì)值
SELECT sex,count(*) FROM student GROUP BY sex WITH ROLLUP;
-- 10、多個(gè)數(shù)據(jù)表里檢索信息
-- 聯(lián)結(jié):join && 子查詢:select 語(yǔ)句嵌套一個(gè) select 語(yǔ)句
-- ①、聯(lián)結(jié)查詢
SELECT st.name,g.data,s.score,g.category
FROM grade_event g INNER JOIN score s INNER JOIN student st
ON g.event_id = s.event_id
AND s.student_id = st.student_id
WHERE g.data = '2008-09-23';
-- 左外聯(lián)結(jié):left join 輸出左邊表數(shù)據(jù)表中的每一條記錄
SELECT s.student_id,s.name,count(a.date) AS absences
FROM student s LEFT JOIN absence a
ON s.student_id = a.student_id
GROUP BY s.student_id;
-- ②、子查詢:查出全勤的學(xué)生
SELECT * FROM student
WHERE student_id NOT IN (SELECT student_id FROM absence);
刪除或更新數(shù)據(jù)行
DELETE FROM president WHERE state = 'OH';
UPDATE member SET email='123@qq.com',street='123 Elm St',city='Anytown',state='NY',zip='01003'
WHERE last_name = 'York' AND first_name='Jerome';