1. 程式人生 > 其它 >第三章 SQL基礎應用-1

第三章 SQL基礎應用-1

  1. mysql內建的功能
    1.1 連線資料庫
    -u
    -p
    -S
    -h
    -P
    -e
    <
    例子:
    1. mysql -uroot -p -S /tmp/mysql.sock
    2. mysql -uroot -p -h10.0.0.51 -P3306
    3. -e 免互動執行sql語句
      [root@db01 ~]# mysql -uroot -p -e "show databases;"
    4. < 恢復資料
      [root@db01 ~]# mysql -uroot -p123</root/world.sql
      1.2 內建命令
      help 列印mysql幫助
      \c ctrl+c 結束上個命令執行
      \q quit; exit; ctrl+d 退出mysql
      \G 將資料豎起來顯示
      source 恢復備份檔案
  2. SQL基礎應用
    2.1 SQL介紹
    結構化的查詢語言
    關係型資料庫通用的命令
    遵循SQL92的標準(SQL_MODE)
    2.2 SQL常用種類
    DDL 資料定義語言
    DCL 資料控制語言
    DML 資料操作語言
    DQL 資料查詢語言
  3. SQL引入-資料庫的邏輯結構

    庫名字
    庫屬性:字符集,排序規則

    表名
    表屬性:儲存引擎型別,字符集,排序規則
    列名
    列屬性:資料型別,約束,其他屬性
    資料行
  4. 字符集 (charset)
    相當於MySQL的密碼本(編碼表)
    mysql> show charset;
    utf8 : 3個位元組
    utf8mb4 (建議): 4個位元組,支援emoji
  5. 排序規則: collation
    mysql> show collation;
    對於英文字串的,大小寫的敏感
    utf8mb4_general_ci 大小寫不敏感
    utf8mb4_bin 大小寫敏感(存拼音,日文)
  6. 資料型別介紹
    6.1 數字
    整數
    tinyint:極小整數資料型別(0-255)
    int:-231到231-1最大10位數,一般超過10位用字串型別
    浮點數(自己擴充套件,略)
    6.2 字串
    char(100)
    定長字串型別,最多為255個字元,不管字串長度多長,都立即分配100個字元長度的儲存空間,未佔滿的空間使用"空格"填充
    varchar(100)
    變長字串型別,每次儲存資料之前,都要先判斷一下長度,按需分配此盤空間.
    會單獨申請一個字元長度的空間儲存字元長度(少於255,如果超過255以上,會佔用兩個儲存空間)
    如何選擇這兩個資料型別?
  7. 少於255個字串長度,定長的列值,選擇char
  8. 多於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會受到時區的影響
    二進位制(不擅長存視訊,圖片,略)
  9. 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;