幸运PK10APP

  • <input id="yd5s6"><acronym id="yd5s6"><li id="yd5s6"></li></acronym></input>
  • <code id="yd5s6"><cite id="yd5s6"></cite></code>
  • <var id="yd5s6"><output id="yd5s6"></output></var>

  • <code id="yd5s6"></code>

    <code id="yd5s6"></code>

    360源碼屋(www.50154.cn)精品網站源碼,織夢模版,游戲源碼分享平臺
    當前位置:網站首頁 VIP資源 網站搭建 正文

    史上最全的mysql基礎教程

    時間:2020-03-05 21:15:42 [網站搭建]作者:360源碼屋

    360網站源碼總結:啟動與停止

    啟動mysql服務

    sudo /usr/local/mysql/support-files/mysql.server start

    停止mysql服務

    sudo /usr/local/mysql/support-files/mysql.server stop

    重啟mysql服務

    sudo /usr/local/mysql/support-files/mysql.server restart

    進入mysql目錄文件

    cd /usr/local/mysql/support-files

    進入mysql命令行

    /usr/local/MySQL/bin/mysql -uroot -p12345678

    退出數據庫

    exit;

    數據庫相關操作

    查詢所有數據庫

    show databases;

    選擇(使用)數據庫

    use mybatis;

    查詢當前正在使用的數據庫名稱

    select database();

    創建數據庫

    create database 數據庫名稱;

    創建數據庫,判斷不存在,再創建: create database if not exists 數據庫名;

    刪除數據庫

    drop database 數據庫名稱;

    判斷數據庫存在,存在再刪除:drop database if exists 數據庫名稱;

    數據庫表相關操作

    創建數據庫表

    create table 表名(

    列名1 數據類型1,

    列名2 數據類型2,

    ....

    列名n 數據類型n

    );

    1

    2

    3

    4

    5

    6

    復制表

    create table 表名 like 被復制的表名;

    查看某個數據庫中的所有的數據表

    show tables;

    查看數據表的結構

    desc pet;或describe pet;

    修改表名

    alter table 表名 rename to 新的表名;

    修改表的字符集

    alter table 表名 character set 字符集名稱;

    添加一列

    alter table 表名 add 列名 數據類型;

    刪除列

    alter table 表名 drop 列名;

    刪除表

    drop table 表名;或drop table if exists 表名 ;

    添加數據

    insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);

    其中列名和值要一一對應。如果表名后,不定義列名,則默認給所有列添加值,如:insert into 表名 values(值1,值2,...值n);除了數字類型,其他類型需要使用引號(單雙都可以)引起來.

    刪除數據

    delete from 表名 where 條件

    其中:如果不加條件,則刪除表中所有記錄。如果要刪除所有記錄, 使用delete from 表名;一般不推薦使用。這種操作有多少條記錄就會執行多少次刪除操作.

    TRUNCATE TABLE 表名;推薦使用,效率更高 先刪除表,然后再創建一張一樣的表.

    修改數據

    update 表名 set 列名1 = 值1, 列名2 = 值2,... where 條件;如果不加任何條件,則會將表中所有記錄全部修改.

    insert into user2 values (1,'李四','123'); // 增

    delete from pet where ower = 'disn'; //刪

    update pet set name = '后裔' where ower = 'dfn'; //改


    1

    2

    3

    4

    查詢數據

    ①> 、< 、<= 、>= 、= 、<>

    ②BETWEEN...AND

    ③ IN( 集合)

    ④LIKE 模糊查詢

    ⑤_單個任意字符

    ⑥%多個任意字符

    ⑦IS NULL  

    ⑧and  或 &&

    ⑨or  或 || 

    ⑩not  或 !

    查詢條件應用舉例:

    SELECT * FROM user WHERE age >= 18;

    SELECT * FROM user WHERE age >= 18 AND  age <=36;

    SELECT * FROM user WHERE age BETWEEN 40 AND 70;

    SELECT * FROM user WHERE age IN (6,18,37);

    // 關于NULL

    SELECT * FROM user WHERE height = NULL; 錯誤,因為null值不能使用=或(!=) 判斷

    SELECT * FROM user WHERE height IS NULL;(正確)

    SELECT * FROM user WHERE height  IS NOT NULL;(正確)

    // 查詢姓陳的有哪些?< like>

    SELECT * FROM user WHERE NAME LIKE '陳%';

    // 查詢姓名第二個字是新的人

    SELECT * FROM user WHERE NAME LIKE "_新%";

    // 查詢姓名是三個字的人

    SELECT * FROM user WHERE NAME LIKE '___';

    // 查詢姓名中包含狗的人

    SELECT * FROM user WHERE NAME LIKE '%狗%';

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    約束相關

    主鍵約束 (primary key)

    能夠唯一確定一張表中的的一條記錄,我們通過給某個字段添加約束, 可以使得這個字段不重復且不為空.

     create table user (

    id int primary key auto_increment, // 在創建表時,添加主鍵約束,并且完成主鍵自增

    name varchar(20)

     );

    -- 聯合主鍵: 由多個字段聯合組成的主鍵, 只要聯合的主鍵加起來不重復就可以.聯合主鍵中的任何一個字段都不能為空.

    create table user2 (

      id int,

      name varchar(20),

      password varchar(20),

      primary key(id, name)

    );


    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    表創建完成后:

    添加主鍵.如:

    ①alter table user add primary key(id);②alter table user modify id int primary key;

    刪除主鍵:alter table user drop primary key;


    唯一約束:unique 約束修飾的字段的值不可以重復.

     create table user1 (

      id int primary key auto_increment,

      phone_num varchar(20) unique

      );

     create table user2 (

      id int primary key auto_increment,

      name varchar(20),

      unique(id, name) // 表示兩個字段在一起不重復就可以

      );

       

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    也可以在表創建完成后, 通過alter table user3 add unique(phone_num);或alter table user3 modify phone_num varchar(20) unique;來添加unique約束.

    刪除unique約束:alter table user3 drop index phone_num;


    非空約束:not null 修飾的字段不能為空NULL

    create table user3 (

    id int primary key auto_increment,

    name varchar(20) not null

    );

    1

    2

    3

    4

    刪除非空約束:alter table user3 modify name varchar(20);


    默認約束

    當我們插入字段值時候,如果對應的字段沒有插入值,則會使用默認值.如果傳入了值,則不會使用默認值.

    create table user4(

    id int primary key auto_increment,

    age int default 18,

    name varchar(20) not null

    );

    1

    2

    3

    4

    5

    外鍵約束:foreign key

    create table 表名(

    ....

    外鍵列

    constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)

    );

    // 班級

    create table classes(

    id int primary key,

    name varchar(20)

    );

    // 學生表

    create table student (

    id int primary key,

    name varchar(20),

    class_id int,

    foreign key(class_id) references classes(id)

    );

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    數據庫查詢進階

    查詢所有記錄

    例如:查詢student表中的所有記錄.

    select * from student;

    查詢指定字段

    例如:查詢student中的sname,ssex,class.

    select sname,ssex,class from student;

    查詢教師表中所有的單位即不重復的depart列. <排除重復distinct>

    select distinct depart from teacher;

    查詢score表中成績在60到80之間的所有記錄 <查詢區間 between…and…>

    select * from score where degree between 60 and 80;

    select * from score where degree > 60 and degree < 80;

    查詢score表中成績為85,86或88的記錄

    select * from score where degree in(85, 86, 88);

    查詢student表中’95031’班或性別為’女’的同學記錄. <or 表示或者>

    select *from student where class = '95031' or sex = '女';

    以class降序查詢student表的所有記錄 <降序:desc, 升序asc,默認升序(省略)>.

    select * from student order by class desc;

    以cno升序,degree降序查詢score表的所有記錄

    select * from score order by cno asc,degree desc;

    查詢"95031’班的學生人數 <統計 count>

    select count(*) from student where class = '95031';

    查詢score表中最高分的學生學號和課程號(子查詢)

    select sno, cno from score where degree = (select max(degree) from score );其中:select max(degree) from score 先查出最高分.

    select sno,cno degree from score order by degree desc limit 0,1;其中:limit第一個數字表示從多少開始,第二個表示多少條.當有多個相同最高分時,容易出bug,不推薦使用這種方式查詢.

    查詢每門課的平均成績

    select cno, avg(degree) from score group by cno;

    查詢score表中至少有2名學生選修的并以3開頭的課程的平均分數.

    select cno, avg(degree) from score group by cno having count(cno) >= 2 and cno like '3%';

    查詢分數大于70, 小于90的sno列.

    select sno, degree from score where degree between 70 and 90;

    查詢所有學生的sname, cno和degree列.

    select sname, cno, degree from student, score where student.sno = score.sno;

    查詢所有學生的sno,cname和degree列

    select sno,cname,degree from course ,score where course.cno = score.cno;

    查詢"95031"班學生每門課的平均分.

    select cno, avg(degree) from score where sno in (select sno from student where class = '95031') group by cno;

    查詢選修"3-105"課程的成績高于"109"號同學"3-105"成績的所有同學的記錄.

    select * from score where cno = '3-105' and degree > (select degree from score where sno = '109' and cno = '3-105');

    查詢成績高于學號為"109", 課程號為"3-105"的成績的所有記錄

    select * from score where degree > (select degree from score where sno = '109' and cno = '3-105');

    查詢和學號為108,101的同學同年出生的所有的sno, sname, sbirthday

    select *from student where year(sbirthday) in (select year(sbirthday) from student where sno in(108, 101));

    查詢"張旭"教師任課的學生成績

    select * from score where cno = ( select cno from course where tno = (select tno from teacher where tname = "張旭"));

    查詢選修某課程的同學人數多于5人的教師姓名.

    select tname from teacher where tno = (select tno from course where cno = (select cno from score group by cno having count(*) > 5));

    查詢存在有85分以上的成績的課程的cno

    select cno, degree from score where degree > 85;

    查詢出"計算機系"教師所教課程的成績表

    select * from score where cno in (select cno from course where tno in (select tno from teacher where depart = "計算機系"));

    查詢選修編號為"3-105"課程且成績至少高于選休息編號為"3-245"的同學的cno,sno和degree,并按degree從高到低次序排序.

    any 至少一個.

    select * from score where cno = '3-105' and degree > any(select degree from score where cno = '3-245') order by degree desc;


    1

    2

    查詢選修編號為"3-105"課程且成績高于選休息編號為"3-245"的同學的cno,sno和degree,并按degree從高到低次序排序.

    all 表示所有

    select * from score where cno = '3-105' and degree > all(select degree from score where cno = '3-245') order by degree desc;


    1

    2

    查詢所有教師和同學的name, sex和birthday

    select tname as name, tsex as sex, tbirthday as birthday from teacher union select sname, ssex, sbirthday from student;


    1

    2

    查詢所有"女"教師和"女"同學的name,sex和birthday

    select tname as name, tsex as sex, tbirthday as birthday from teacher where tsex = '女' union select sname, ssex, sbirthday from student where ssex = '女';



    1

    2

    3

    查詢成績比該課程成績低的同學的成績表

    思路: 從a表查出對應的分數跟b表篩選出來的平均分作比較.

    select * from score a where degree < (select avg(degree) from score b where a.cno = b.cno);

    表a

    +-----+-------+--------+

    | sno | cno   | degree |

    +-----+-------+--------+

    | 101 | 3-105 |     91 |

    | 102 | 3-105 |     92 |

    | 103 | 3-105 |     92 |

    | 103 | 3-245 |     86 |

    | 103 | 6-166 |     85 |

    | 104 | 3-105 |     81 |

    | 105 | 3-105 |     88 |

    | 105 | 3-245 |     75 |

    | 105 | 6-166 |     79 |

    | 109 | 3-105 |     76 |

    | 109 | 3-245 |     68 |

    | 109 | 6-166 |     81 |

    +-----+-------+--------+

    12 rows in set (0.00 sec)   


    表b

    | sno | cno   | degree |

    +-----+-------+--------+

    | 101 | 3-105 |     91 |

    | 102 | 3-105 |     92 |

    | 103 | 3-105 |     92 |

    | 103 | 3-245 |     86 |

    | 103 | 6-166 |     85 |

    | 104 | 3-105 |     81 |

    | 105 | 3-105 |     88 |

    | 105 | 3-245 |     75 |

    | 105 | 6-166 |     79 |

    | 109 | 3-105 |     76 |

    | 109 | 3-245 |     68 |

    | 109 | 6-166 |     81 |

    +-----+-------+--------+

    12 rows in set (0.00 sec) 


    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    查詢所有任課教師的tname和depart

    select tname, depart from teacher where tno in (select tno from course);

    查詢至少有兩名男生的班號

    select class from student where ssex= '男' group by class having count(*) > 1


    1

    2

    查詢student表中不姓"王"的同學記錄

    select * from student where sname not like '王%';

    1

    查詢student表中每個學生的姓名和年齡

    select sname, year(now()) - year(sbirthday)  as '年齡' from student;

    1

    查詢student表中最大和最小的sbirthday日期值

    select max(sbirthday) as '最大', min(sbirthday) as '最小' from student;

    1

    以班號和年齡從大到小的順序查詢student表中的全部記錄

    select * from student order by class desc, sbirthday;

    1

    查詢"男"教師及其所上的課程

    select * from course where tno in (select tno from teacher where tsex = '男');


    1

    2

    查詢最高分同學的sno, cno和degree列

    select * from score where degree = (select max(degree) from score);

    1

    查詢和李軍同性別的所有同學的sname

    select sname from student where ssex = (select ssex from student where sname = '李軍');


    1

    2

    查詢和李軍同性別并同班 同學sname

    select sname from student where ssex = (select ssex from student where sname = "李軍") and class = (select class from student where sname = '李軍');


    1

    2

    查詢所有選修"計算機導論"課程的"男"的成績表

    select * from score where cno = (select cno from course where cname = '計算機導論') and sno in(select sno from student where ssex = '男');


    1

    2

    SQL的四種連接查詢

    分析用例的數據準備:

    mysql> select * from person;

    +----+--------+--------+

    | id | name   | cardId |

    +----+--------+--------+

    |  1 | 張三   |      1 |

    |  2 | 李四   |      3 |

    |  3 | 王五   |      6 |

    +----+--------+--------+

    3 rows in set (0.00 sec)

    mysql> select * from card;

    +------+-----------+

    | id   | name      |

    +------+-----------+

    |    1 | 飯卡      |

    |    2 | 建行卡    |

    |    3 | 農行卡    |

    |    4 | 工商卡    |

    |    5 | 郵政卡    |

    +------+-----------+

    5 rows in set (0.00 sec)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    內連接

    inner join 或者 join, 后面通常跟對一個on表示條件

    ---- 內聯查詢: 就是兩張表中的數據, 通過某個字段相等,查詢出相關記錄數據.

    <當前表中的cardid與id相同.>

    select * from person inner join card on person.cardId = card.id;

    +----+--------+--------+------+-----------+

    | id | name   | cardId | id   | name      |

    +----+--------+--------+------+-----------+

    |  1 | 張三   |      1 |    1 | 飯卡      |

    |  2 | 李四   |      3 |    3 | 農行卡    |

    +----+--------+--------+------+-----------+

    2 rows in set (0.00 sec)


    1

    2

    3

    4

    5

    6

    7

    8

    9

    外連接

    左外連接:左連接 left join 或者 left outer join

    ---- 左外連接, 會把左邊表里面的所有數據取出來, 而右邊表中的數據,如果有相等的,就顯示出來, 如果沒有, 則會補NULL.

    select * from person left join card on person.cardId = card.id;


    +----+--------+--------+------+-----------+

    | id | name   | cardId | id   | name      |

    +----+--------+--------+------+-----------+

    |  1 | 張三   |      1 |    1 | 飯卡      |

    |  2 | 李四   |      3 |    3 | 農行卡    |

    |  3 | 王五   |      6 | NULL | NULL      |

    +----+--------+--------+------+-----------+

    3 rows in set (0.00 sec)


    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    右外連接:右連接 right join 或者right outer join

    ----右外連接, 會把右邊表里面的所有數據取出來, 而左邊表中的數據,如果有相等的,就顯示出來, 如果沒有, 則會補NULL.


    select * from person right join card on person.cardId = card.id;


    +------+--------+--------+------+-----------+

    | id   | name   | cardId | id   | name      |

    +------+--------+--------+------+-----------+

    |    1 | 張三   |      1 |    1 | 飯卡      |

    |    2 | 李四   |      3 |    3 | 農行卡    |

    | NULL | NULL   |   NULL |    2 | 建行卡    |

    | NULL | NULL   |   NULL |    4 | 工商卡    |

    | NULL | NULL   |   NULL |    5 | 郵政卡    |

    +------+--------+--------+------+-----------+

    5 rows in set (0.01 sec)


    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    全外連接:完全外連接 full join 或者full outer join<mysql不支持full join>


    mysql> select * from person full join card on person.cardId= card.id;

    ERROR 1054 (42S22): Unknown column 'person.cardId' in 'on clause'

    **** 解決mysql不支持full join的方法****

     <左連接 + 右鏈接> , 即通過union來連接左右連接. <左連接 union 右鏈接>.

    eg:


    select * from person left join card on person.cardId = card.id union select * from person right join card on person.cardId = card.id;


    +------+--------+--------+------+-----------+

    | id   | name   | cardId | id   | name      |

    +------+--------+--------+------+-----------+

    |    1 | 張三   |      1 |    1 | 飯卡      |

    |    2 | 李四   |      3 |    3 | 農行卡    |

    |    3 | 王五   |      6 | NULL | NULL      |

    | NULL | NULL   |   NULL |    2 | 建行卡    |

    | NULL | NULL   |   NULL |    4 | 工商卡    |

    | NULL | NULL   |   NULL |    5 | 郵政卡    |

    +------+--------+--------+------+-----------+

    6 rows in set (0.01 sec)


    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    要點梳理

    where 和 having 的區別?

    (1) having通常用在聚合函數前面,對聚合函數進行過濾,(MAX、MIN、COUNT、SUM).having通常和group by 一起連用,因為where不能加在group by的后面.

    (2) where 在分組之前進行限定,如果不滿足條件,則不參與分組。having在分組之后進行限定,如果不滿足結果,則不會被查詢出來. where 后不可以跟聚合函數,having可以進行聚合函數的判斷。

    MYSQL執行語句順序,嚴格遵循次順序,不能改變

    select

    from

    where

    group by

    having

    order by

    1

    2

    3

    4

    5

    6

    7

    mysql的事務

    關于事務

    mysql中, 事務其實是一個最小的不可分割的工作單元. 事務能夠保證一個業務的完整性.

    分析:

    例如:

    a --> -100

    update user set money = money - 100 where name = 'a';

    b --> +100

    update user set money = money + 100 where name = 'b';

    -- 實際程序中, 如果只有一條sql語句執行成功了,而另外一條沒有執行成功?則會出現前后數據不一致的情況.

    update user set money = money - 100 where name = 'a';

    update user set money = money + 100 where name = 'b';

    在多條sql語句,可能會有同時成功的要求,要么就同時失敗.


    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    事務控制

    (1)事務主要包含自動提交@@autocommit=1;,手動提交commit;和事務回滾rollback;.

    (2) mysql默認是開啟事務的(自動提交).

    ----當我們去執行一個sql語句的時候,效果會立即提現出來,且不能回滾.

    set autocommit = 0;設置mysql是否自動提交,<0為否, 1為是.>

    select @@autocommit;查看mysql的自動提交方式.

    commit; 手動提交.

    具體事務控制相關參照下面代碼分析:

    mysql> select @@autocommit;

    +--------------+

    | @@autocommit |

    +--------------+

    |            1 |

    +--------------+

    1 row in set (0.00 sec)

    // 建表

    create database bank;

    create table user (

    id int primary key,

        name varchar(20),

        money int

        );

    // 首先在表中插入一條用戶數據a.

    insert into user values (1,'a',1000);

    Query OK, 1 row affected (0.00 sec)

    // 進行回滾操作.

    mysql> rollback;

    Query OK, 0 rows affected (0.00 sec)

    // 執行回滾后,查看數據表信息,發現即使調用了rollback,但插入的數據依然存在.說明當前不能回滾.

    mysql> select * from user;

    +----+------+-------+

    | id | name | money |

    +----+------+-------+

    |  1 | a    |  1000 |

    +----+------+-------+

    1 row in set (0.00 sec)

    // 可以通過設置msql的回滾自動提交為false.

    set autocommit = 0;

    Query OK, 0 rows affected (0.00 sec)

    mysql> select @@autocommit;

    +--------------+

    | @@autocommit |

    +--------------+

    |            0 |

    +--------------+

    1 row in set (0.00 sec)

    // 也就說, 通過上面的set autocommit = 0;操作關閉了mysql的自動提交(commit).

    *******再次插入數據:*******

    insert into user values (2,'b',1000);

    Query OK, 1 row affected (0.00 sec)

    // 插入數據后查看表,用戶2數據添加成功.

    mysql> select * from user;

    +----+------+-------+

    | id | name | money |

    +----+------+-------+

    |  1 | a    |  1000 |

    |  2 | b    |  1000 |

    +----+------+-------+

    2 rows in set (0.00 sec)

    // 執行回滾操作.

    mysql> rollback;

    Query OK, 0 rows affected (0.00 sec)

    // 回滾后再次查看表,發現剛才插入的數據已經被干掉了.

    mysql> select * from user;

    +----+------+-------+

    | id | name | money |

    +----+------+-------+

    |  1 | a    |  1000 |

    +----+------+-------+

    1 row in set (0.01 sec)

    **** 對于這種場景,如果想讓用戶b數據成功提交, 可以通過commit;命令執行手動提交操作.手動提交后,如果想再次通過rollback來撤銷,則是不可以的.也就是說,事務一旦提交,執行的sql語句就不可以再撤銷,也就是說事務一旦提交數據就會持久的產生效果.




    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    (3)手動開啟事務

    begin和start transaction都可以手動開啟一個事務. 也就是說,當我們當前的mysql如果默認的是自動提交模式,則執行rollback進行事務回滾則是無效的. 但是可以通過begin和start transaction手動開啟事務.


    即:

      當前默認為自動提交模式,此時執行rollback無效.執行下面sql語句:

      start transaction;(或者begin;)

      update user set money = money - 100 where name = 'a';

      update user set money = money + 100 where name = 'b';

      執行完插入a,b用戶數據后,再執行rollback,發現可以成功回滾事務.可以成功切換成手動開啟事務的模式.若想使得插入的數據生效,也需要手動執行commit進行提交操作.

      事務開啟之后,一旦commit提交,就不可以回滾,也就說,當前的這個事務在提交的時候就已經結束了.

      

    1

    2

    3

    4

    5

    6

    7

    8

    事務的四大特征 

    A 原子性: 事務是最小的單元, 不可以在分割.

    C 一致性: 事務要求, 同一事務中的sql語句必須保證同時成功,同時失敗.

    I 隔離性: 事務1 和事務2之間shi具有隔離性的.

    D 持久性: 事務一旦結束(commit,rollback),就不可以返回.

    事務的隔離性

    多個事務之間隔離的,相互獨立的。但是如果多個事務操作同一批數據,則會引發一些問題,設置不同的隔離級別就可以解決這些問題.

    存在問題:

    (1) 臟讀:一個事務,讀取到另一個事務中沒有提交的數據.

    (2)不可重復讀(虛讀):在同一個事務中,兩次讀取到的數據不一樣.

    (3)幻讀:一個事務操作(DML)數據表中所有記錄,另一個事務添加了一條數據,則第一個事務查詢不到自己的修改.

    read uncommitted; 讀未提交的–>產生的問題:臟讀、不可重復讀、幻讀.

    read committed; 讀已經提交的–>產生的問題:不可重復讀、幻讀repeatable read; 可以重復讀–>產生的問題:幻讀

    serializable; 串行化<性能特差>

    通常是隔離級別越高,性能越差.

    (1)查看數據庫的隔離級別

    mysql默認的隔離級別: REPEATABLE-READ

    mysql8.0:

    系統級別的:select @@global.transaction_isolation;

    會話級別的:select @@transaction_isolation;

    mysql5.x:

    系統級別的:select @@global.tx_isolation;

    會話級別的:select @@tx_isolation;

    mysql> select @@global.transaction_isolation;

    +--------------------------------+

    | @@global.transaction_isolation |

    +--------------------------------+

    | REPEATABLE-READ                |

    +--------------------------------+

    1 row in set (0.00 sec)

    1

    2

    3

    4

    5

    6

    7

    (2)修改隔離級別

    set global tansaction isolation level read uncomitted;


    數據庫的三大范式

    第一范式

    數據表中的所有字段都是不可分割的原子項.初步可以理解為:字段值還可以繼續拆分的,就不滿足第一范式.

    比如某表中有一個address的字段,插入值為"中國陜西省西安市碑林區柏樹林11號".該字段值是可以繼續拆分的,原則上就不滿足第一范式.可以依次拆分為:國家/省/市/區/街道等等.

    當然,范式設計的越詳細,對某些實際操作可能會更好.但不一定都是好處.<比如對address字段來說,可能拆分開來永遠都用不到這么詳細的信息,可能就沒有拆分的必要.>

    第二范式

    必須是滿足第一范式的前提下,第二范式要求,除主鍵外的每一列都必須完全依賴主鍵.如果要出現不完全依賴,只可能發生在聯合主鍵的情況下.

    例如:

    create table myorder(

    product_id int,

    customer_id int,

    product_name varchar(20),

    customer_name varchar(20),

    primary key(product_id, customer_id

    );

    當前表中, 除主鍵以外的其他列, 只依賴于主鍵的部分字段.則不滿足第二范式,通常需要拆表.

    create table myorder(

    order_id int primary key,

    product_id int,

    customer_id int

    );

    create  table product (

    id int primary key,

    name varchar(20)

    );

    create table customer(

    id int primary key,

    name varchar(20)

    );

    拆分成三個表后,滿足第二范式.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    第三范式

    必須先滿足第二范式.除開主鍵列的其他列之間不能有傳遞依賴關系.

    附件

    查詢語句所涉及的sql語句


    create table student(

    sno varchar(20) primary key,

    sname varchar(20) not null,

    ssex varchar(20) not null,

    sbrithday datetime,

    class varchar(20)

    );


    create table student(

    sno varchar(20) primary key,

    sname varchar(20) not null,

    ssex varchar(10) not null,

    sbirthday datetime,

    class varchar(20)

    )


    create table teacher(

    tno varchar(20) primary key,

    tname varchar(20) not null,

    tsex varchar(20) not null,

    tbirthday datetime,

    prof varchar(20) not null,

    depart varchar(20) not null

    );


    create table course(

    cno varchar(20) primary key,

    cname varchar(20) not null,

    tno varchar(20) not null,

    foreign key(tno) references teacher(tno)

    );


    create table score(

    sno varchar(20) not null,

    degree decimal,

    primary key (sno, cno),

    foreign key (sno) references student(sno),

    foreign key (cno) references course(cno)

    );


    insert into student values ('101','曾華','男','1977-09-01','95033');

    insert into student values ('102','匡明','男','1975-10-02','95031');

    insert into student values ('103','王麗','女','1976-01-23','95033');

    insert into student values ('104','李軍','男','1976-02-20','95033');

    insert into student values ('105','王芳','女','1975-02-10','95031');

    insert into student values ('106','陸君','男','1974-06-03','95031');

    insert into student values ('107','王尼瑪','男','1976-02-20','95033');

    insert into student values ('108','張全蛋','男','1975-02-10','95031');

    insert into student values ('109','趙鐵柱','男','1974-06-03','95031');


    insert into teacher values ('804','李成','男','1958-12-02','副教授','計算機系');

    insert into teacher values ('856','張旭','男','1969-03-12','講師','電子工程系');

    insert into teacher values ('825','王萍','女','1972-05-05','助教','計算機系');

    insert into teacher values ('831','劉冰','女','1977-08-14','助教','電子工程系');


    insert into course values ('3-105','計算機導論', '825');

    insert into course values ('3-245','操作系統', '804');

    insert into course values ('6-166','數字電路', '856');

    insert into course values ('9-888','高等數學', '831');

      

    insert into score values('103','3-245','86');

    insert into score values('105','3-245','75');

    insert into score values('109','3-245','68');

    insert into score values('103','3-105','92');

    insert into score values('105','3-105','88');

    insert into score values('109','3-105','76');

    insert into score values('103','3-105','64');

    insert into score values('105','6-166','79');

    insert into score values('109','6-166','81');



    create table person(

    id int primary key auto_increment,

    name varchar(20),

    cardId int

    );


    create table card (

    id int,

    name varchar(20)

    );


    insert into card values (1,'飯卡');

    insert into card values (2,'建行卡');

    insert into card values (3,'農行卡');

    insert into card values (4,'工商卡');

    insert into card values (5,'郵政卡');


    insert into person values (1,'張三',1);

    insert into person values (2,'李四',3);

    insert into person values (3,'王五',6);




    ————————————————



    本文標簽:AutoTags插件服務端需要您提供購買者的賬號和密碼才能繼續訪問  福利活動  自由織夢  織夢貓  秀站網  跟版網  dede58  莎莎源碼  折翼天使 

    轉載請注明來源:史上最全的mysql基礎教程

    本文永久鏈接地址:http://www.50154.cn/9558.html

    鄭重聲明:
    本站所有內容均由互聯網收集整理、網友上傳,并且以計算機技術研究交流為目的,僅供大家參考、學習,不存在任何商業目的與商業用途。
    若您需要商業運營或用于其他商業活動,請您購買正版授權并合法使用。 我們不承擔任何技術及版權問題,且不對任何資源負法律責任。
    如無法鏈接失效或侵犯版權,請給我們來信:han2311678@163.com

    幸运PK10APP
    莱芜| 定边| 迁西| 枣阳| 肃宁| 容县| 会泽| 岫岩| 镇宁| 当雄| 绥宁| 南京| 奉贤| 麻城| 秀屿港| 湟中| 循化| 黎平| 富平| 台儿庄| 塔河| 宁化| 娄烦| 勉县| 托托河| 万州天城| 勉县| 郴州| 胡尔勒| 三都| 高平| 磴口| 嘉义| 中甸| 慈利| 曲周| 武川| 永丰| 潞江坝| 资兴| 黎川| 淮阳| 景德镇| 宁晋| 松江| 高州| 广安| 灵山| 花都| 赤峰郊区站| 吉安县| 靖州| 杞县| 满洲里| 肇州| 萍乡| 榆林| 阜阳| 海城| 宣化| 德钦| 丰南| 长乐| 通州| 蒙自| 北碚| 五峰| 加查| 馆陶| 金阳| 吉首| 昌江| 威信| 盖州| 沙县| 炉山| 永福| 洋县| 商城| 九寨沟| 集贤| 西盟| 鹤城区| 通河| 大港| 松滋| 固阳| 进贤| 辽中| 冷湖| 宁化| 江安| 浩尔吐| 黄山区| 淄博| 庆云| 张北| 平果| 清水河| 西峰| 文县| 普兰| 抚顺| 互助| 门头沟| 清涧| 霍山| 宣汉| 舞钢| 硇洲| 威信| 台山| 犍为| 金山| 高邮| 余江| 安多| 海拉尔| 满洲里| 信阳| 蒙山| 罗田| 怀柔| 庄浪| 进贤| 罗定| 静海| 锦州| 喀左| 建平县| 扶沟| 静乐| 宜川| 错那| 罗子沟| 永吉| 安仁| 常德| 淄博| 宾川| 开鲁| 志丹| 金沙| 青龙山| 巴东| 永城| 鼎新| 费县| 乐都| 石家庄| 宁德| 临县| 永善| 淮滨| 杭锦旗| 东莞| 石岛| 正安| 喀左| 费县| 平凉| 丽江| 珊瑚岛| 嘉祥| 崆峒| 治多| 华山| 九台| 北流| 醴陵| 鸡公山| 平顶山| 南漳| 唐海| 习水| 利津| 淮阴县| 杭锦旗| 绵竹| 畹町镇| 洛浦| 北宁| 伊春| 苏尼特左旗| 靖宇| 云龙| 雅江| 汤阴| 高力板| 海林| 金湖| 图里河| 金秀| 互助| 遵义| 南郑| 嘉兴| 绵阳| 海拉尔| 新源| 永宁| 乌兰乌苏| 江华| 句容| 且末| 高力板| 霸州| 兴宁| 伊吾| 小二沟| 钦州| 泉州| 呼兰| 吐鲁番| 勐海| 白山| 高阳| 洪洞| 华山| 隰县| 太原| 辛集| 中泉子| 青龙山| 汤河口| 北安| 资溪| 聂拉木| 海力素| 兰西| 阳信| 绩溪| 平昌| 麻栗坡| 陵县| 洛浦| 尼勒克| 临泉| 会理| 南城| 泽库| 神木| 全州| 建瓯| 城固| 马边| 海阳| 枝江| 汉沽| 留坝| 庆元| 株洲县| 满城| 文水| 漳州| 莲塘| 商水| 铁干里克| 罗江| 偃师| 宁陕| 新丰| 武义| 喀什| 方正| 金塔| 道孚| 开原| 玛曲| 龙山| 永福| 绥中| 勃利| 龙胜| 容县| 阳江| 蒙城| 烟台| 鄂托克前旗| 勉县| 马尔康| 西连岛| 阜康| 怀化| 灵寿| 天长| 陆川| 石拐| 济南| 安康| 福海| 茶卡| 塔城| 文安| 舍伯吐| 高阳| 甘南| 江门| 野牛沟| 隆子| 镇源| 娄烦| 兰考| 安县| 潞城| 榕江| 察哈尔右翼中旗| 虎林| 达拉特旗| 孟津| 焦作| 淳化| 宝过图| 石家庄| 曲沃| 定安| 潮州| 中宁| 西青| 永宁| 元谋| 乌审召| 光泽| 汪清| 武邑| 诺木洪| 分宜| 澄江| 桐梓| 兴山| 怀远| 洛川| 田林| 泸西| 成县| 信阳地区农试站| 美姑| 青岛| 九寨沟| 尼木| 务川| 合川| 宁晋| 蓝田| 芒康| 通渭| 兰溪| 高台| 韶山| 芜湖| 信阳地区农试站| 磐石| 双峰| 汾西| 秀屿港| 洛南| 靖西| 呼图壁| 金平| 沈阳| 青岛| 祁连| 福清| 理县| 梨树| 巴盟农试站| 平江| 如皋| 塔什库尔干| 淇县| 任县| 延吉| 秀山| 阿里| 察哈尔右翼后旗| 和田| 大勐龙| 武穴| 邻水| 开县| 青龙山| 刚察| 东乡| 灵台| 白日乌拉| 浑源| 隰县| 八达岭| 松江| 歙县| 茫崖| 耿马| 崇信| 犍为| 曲沃| 丰县| 遂川| 尉氏| 万全| 翁牛特旗