第三章 SQL基礎應用-1
- mysql內建的功能
1.1 連線資料庫
-u
-p
-S
-h
-P
-e
<
例子:- mysql -uroot -p -S /tmp/mysql.sock
- mysql -uroot -p -h10.0.0.51 -P3306
- -e 免互動執行sql語句
[root@db01 ~]# mysql -uroot -p -e "show databases;" - < 恢復資料
[root@db01 ~]# mysql -uroot -p123</root/world.sql
1.2 內建命令
help 列印mysql幫助
\c ctrl+c 結束上個命令執行
\q quit; exit; ctrl+d 退出mysql
\G 將資料豎起來顯示
source 恢復備份檔案
- SQL基礎應用
2.1 SQL介紹
結構化的查詢語言
關係型資料庫通用的命令
遵循SQL92的標準(SQL_MODE)
2.2 SQL常用種類
DDL 資料定義語言
DCL 資料控制語言
DML 資料操作語言
DQL 資料查詢語言 - SQL引入-資料庫的邏輯結構
庫
庫名字
庫屬性:字符集,排序規則
表
表名
表屬性:儲存引擎型別,字符集,排序規則
列名
列屬性:資料型別,約束,其他屬性
資料行 - 字符集 (charset)
相當於MySQL的密碼本(編碼表)
mysql> show charset;
utf8 : 3個位元組
utf8mb4 (建議): 4個位元組,支援emoji - 排序規則: collation
mysql> show collation;
對於英文字串的,大小寫的敏感
utf8mb4_general_ci 大小寫不敏感
utf8mb4_bin 大小寫敏感(存拼音,日文) - 資料型別介紹
6.1 數字
整數
tinyint:極小整數資料型別(0-255)
int:-231到231-1最大10位數,一般超過10位用字串型別
浮點數(自己擴充套件,略)
6.2 字串
char(100)
定長字串型別,最多為255個字元,不管字串長度多長,都立即分配100個字元長度的儲存空間,未佔滿的空間使用"空格"填充
varchar(100)
變長字串型別,每次儲存資料之前,都要先判斷一下長度,按需分配此盤空間.
會單獨申請一個字元長度的空間儲存字元長度(少於255,如果超過255以上,會佔用兩個儲存空間)
如何選擇這兩個資料型別? - 少於255個字串長度,定長的列值,選擇char
- 多於255字元長度,變長的字串,可以選擇varchar
enum 列舉資料型別
address enum('sz','sh','bj'.....)
1 2 3
懸念,以上資料型別可能會影響到索引的效能
6.3 時間
datetime
範圍為從 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
timestamp
範圍為從 1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
timestamp會受到時區的影響
二進位制(不擅長存視訊,圖片,略) - DDL的應用(資料定義語言)
7.1 庫的定義
--- 建立資料庫
CREATE DATABASE zabbix CHARSET utf8mb4 COLLATE utf8mb4_bin;
--- 檢視庫情況
SHOW DATABASES;
SHOW CREATE DATABASE zabbix;
--- 刪除資料庫(不代表生產操作)
DROP DATABASE oldguo;
--- 修改資料庫字符集
注意: 目標字符集一定是源字符集的嚴格超級,比如utf8--->utf8mb4.
CREATE DATABASE oldguo;
SHOW CREATE DATABASE oldguo;
ALTER DATABASE oldguo CHARSET utf8mb4;
關於庫定義規範 *****
1)庫名使用小寫字元
示例:在windows環境下大小寫不敏感,linux環境下大小敏感
2)庫名不能以數字開頭
3)不能是資料庫內部的關鍵字
4)必須設定字符集.
7.2 DDL-表定義
--- 建表
表名,列名,列屬性,表屬性
--- 列屬性(除資料型別外)
PRIMARY KEY : 主鍵約束,表中只能有一個,非空且唯一(兩個欄位也可組成聯合主鍵)
NOT NULL : 非空約束,不允許空值
UNIQUE KEY : 唯一鍵約束,不允許重複值
DEFAULT : 一般配合 NOT NULL 一起使用.
UNSIGNED : 無符號,一般是配合數字列,非負數
COMMENT : 註釋
AUTO_INCREMENT : 自增長的列
開發規範:儘量所有的列非空,避免索引失效
CREATE TABLE stu (
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '學號',
sname VARCHAR(255) NOT NULL COMMENT '姓名',
age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年齡',
gender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性別',
intime DATETIME NOT NULL DEFAULT NOW() COMMENT '入學時間'
)ENGINE INNODB CHARSET utf8mb4;
關於建表規範 *****
1)表名小寫字母,不能數字開頭
2)不能是保留字元,使用和業務有關的表名
3)選擇合適的資料型別及長度
4)每個列設定 NOT NULL + DEFAULT,對於資料0填充,對於字元使用有效字串填充
5)每個列設定註釋
6)表必須設定儲存引擎和字符集
7)主鍵列儘量是無關數字列,最好是自增長
8)enum型別不要儲存數字,只能是字串型別
--- 查詢建表資訊
SHOW TABLES;
SHOW CREATE TABLE stu;
DESC stu;
--- 建立一個表結構一樣的表
CREATE TABLE test LIKE stu;
--- 刪表(不代表生產操作)
DROP TABLE test;
--- 修改表結構
會進行鎖表操作的,避開生產繁忙期
最原始的方法:建立一個臨時表,對臨時表變更然後進行原始替換
pt-osc :percona-toolkits online schema change.
--- 在stu表中新增qq列 *****
DESC stu;
ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL COMMENT 'qq號';
--- 在sname後加微信列 ***
ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT '微訊號' AFTER sname;
--- 在id列前加一個新列num ***
ALTER TABLE stu ADD num INT NOT NULL UNIQUE COMMENT '身份證' FIRST ;
DESC stu;
--- 把剛才新增的列都刪掉(危險,不代表生產操作) ***
ALTER TABLE stu DROP num;
DESC stu;
ALTER TABLE stu DROP qq;
ALTER TABLE stu DROP wechat;
--- 修改sname資料型別的屬性 ***
DESC stu;
ALTER TABLE stu MODIFY sname VARCHAR(64) NOT NULL COMMENT '姓名';
--- 將gender 改為 sex 資料型別改為 CHAR 型別 ***
ALTER TABLE stu CHANGE gender sex CHAR(1) NOT NULL COMMENT '性別';
7.4 DCL (資料控制語言)
grant
revoke
7.5 DML (資料操作語言-對資料行的增刪改)
-- insert
DESC stu;
--- 最偷懶
INSERT INTO stu VALUES(1,'zs',18,'m',NOW());
SELECT * FROM stu;
--- 最規範
INSERT INTO stu(id,sname,age,sex,intime)
VALUES (2,'ls',19,'f',NOW());
--- 針對性的錄入資料
INSERT INTO stu(sname,age,sex)
VALUES ('w5',11,'m');
--- 一次性錄入多行
INSERT INTO stu(sname,age,sex)
VALUES
('aa',11,'m'),
('bb',12,'f'),
('cc',13,'m');
-- update(一定要加where條件)
UPDATE stu SET sname='aaa';
SELECT * FROM stu;
UPDATE stu SET sname='bb' WHERE id=6;
-- delete (一定要有where條件)
DELETE FROM stu;
DELETE FROM stu WHERE id=9;
-- 生產中遮蔽delete功能
--- 使用update替代delete
ALTER TABLE stu ADD is_del TINYINT DEFAULT 0 ;
UPDATE stu SET is_del=1 WHERE id=7;
SELECT * FROM stu WHERE is_del=0;
7.6 作業
use school
student :學生表
sno: 學號
sname:學生姓名
sage: 學生年齡
ssex: 學生性別
teacher :教師表
tno: 教師編號
tname:教師名字
course :課程表
cno: 課程編號
cname:課程名字
tno: 教師編號
score :成績表
sno: 學號
cno: 課程編號
score:成績
INSERT INTO student(sno,sname,sage,ssex)
VALUES (1,'zhang3',18,'m');
INSERT INTO student(sno,sname,sage,ssex)
VALUES
(2,'zhang4',18,'m'),
(3,'li4',18,'m'),
(4,'wang5',19,'f');
INSERT INTO student
VALUES
(5,'zh4',18,'m'),
(6,'zhao4',18,'m'),
(7,'ma6',19,'f');
INSERT INTO student(sname,sage,ssex)
VALUES
('oldboy',20,'m'),
('oldgirl',20,'f'),
('oldp',25,'m');
INSERT INTO teacher(tno,tname) VALUES
(101,'oldboy'),
(102,'hesw'),
(103,'oldguo');
DESC course;
INSERT INTO course(cno,cname,tno)
VALUES
(1001,'linux',101),
(1002,'python',102),
(1003,'mysql',103);
DESC sc;
INSERT INTO sc(sno,cno,score)
VALUES
(1,1001,80),
(1,1002,59),
(2,1002,90),
(2,1003,100),
(3,1001,99),
(3,1003,40),
(4,1001,79),
(4,1002,61),
(4,1003,99),
(5,1003,40),
(6,1001,89),
(6,1003,77),
(7,1001,67),
(7,1003,82),
(8,1001,70),
(9,1003,80),
(10,1003,96);
SELECT * FROM student;
SELECT * FROM teacher;
SELECT * FROM course;
SELECT * FROM sc;