MySQL知識總結之一(基礎瞭解)

曾經遇到的一個面試題:主鍵與索引區別

主鍵:主鍵是唯一的,一個表中只能包含一個主鍵,也可以利用主鍵查詢記錄

索引:可根據索引快速訪問表中的特定信息,它是對錶中一列或多列的值進行排序的一種結構,等價於書的目錄

是不是還是體會不到兩者真正的區別~~~~~

詳解:參照:

第一部分:環境搭建

1.安裝MySQL:https://blog.csdn.net/bobo553443/article/details/81383194

2.啓動以及創建用戶

3.數據類型:數值類型、日期和時間類型、字符串類型

第二部分:MySQL的常用命令複習

1.MySQL 創建數據表:

mysql> create table employee(
    ->      emp_id int not null auto_increment,
    ->      name char(20) not null,
    ->      age int not null,
    ->      work char(32) not null,
    ->      register_date date,
    ->      primary key (emp_id)
    ->      );
Query OK, 0 rows affected (0.04 sec)

mysql> desc employee;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| emp_id        | int(11)  | NO   | PRI | NULL    | auto_increment |
| name          | char(20) | NO   |     | NULL    |                |
| age           | int(11)  | NO   |     | NULL    |                |
| work          | char(32) | NO   |     | NULL    |                |
| register_date | date     | YES  |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

備註:auto_increment 定義列爲自增的屬性,一般用於主鍵,數值會自動加1,primary key 關鍵字用於定義列爲主鍵。 可以使用多列來定義主鍵,列間以逗號分隔

2.MySQL插入數據:

mysql> insert into employee (name,age,work,register_date) values('Json',25,'teacher','2010-01-12');
Query OK, 1 row affected (0.00 sec)

mysql> insert into employee (name,age,work,register_date)
    -> values
    -> ('Mark',24,'teacher','2010-01-20'),
    -> ('Join',28,'programmer','2010-04-20');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from employee;
+--------+------+-----+------------+---------------+
| emp_id | name | age | work       | register_date |
+--------+------+-----+------------+---------------+
|      1 | Json |  25 | teacher    | 2010-01-12    |
|      2 | Json |  25 | teacher    | 2010-01-12    |
|      3 | Mark |  24 | teacher    | 2010-01-20    |
|      4 | Join |  28 | programmer | 2010-04-20    |
+--------+------+-----+------------+---------------+
4 rows in set (0.00 sec)

備註:插入數據時,注意批量插入數據的使用

3.MySQL查詢數據:

  • 可進行單表或者多表查詢,表之間用逗號(,)分割
  • select * from table,會返回表中的所有字段數據
  • 使用where語句設置任何查詢條件
  • 使用limit屬性限制返回記錄條數
  • 使用offset置頂select語句開始查詢的數據偏移量,默認爲0

語法:

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]

演習:

mysql> select * from table_A
    -> ;
+---+------+
| a | name |
+---+------+
| 1 | Mark |
| 2 | Json |
| 3 | Json |
| 4 | Rany |
+---+------+
4 rows in set (0.00 sec)

mysql> select * from table_B;
+---+------+
| b | name |
+---+------+
| 4 | Json |
| 4 | Rany |
| 1 | Mark |
+---+------+
3 rows in set (0.00 sec)

mysql> select * from table_A,table_B where table_A.a=table_B.b;
+---+------+---+------+
| a | name | b | name |
+---+------+---+------+
| 1 | Mark | 1 | Mark |
| 4 | Rany | 4 | Json |
| 4 | Rany | 4 | Rany |
+---+------+---+------+
3 rows in set (0.00 sec)

mysql> select name from table_A where name like 'J%';
+------+
| name |
+------+
| Json |
| Json |
+------+
2 rows in set (0.00 sec)

mysql> select name from table_A limit 3 offset 2;
+------+
| name |
+------+
| Json |
| Rany |
+------+
2 rows in set (0.00 sec)

科普一下limit、offset用法:

① select * from table_A limit 2,1;
是跳過前面的2條記錄之後,取出1條數據,limit後面是從第2條開始讀,讀取1條信息,即讀取第3條數據

② select * from table_A limit 2 offset 1;
是從第1條(不包括)數據開始取出2條數據,limit後面跟的是2條數據,offset後面是從第1條開始讀取,即讀取第2,3條

mysql> select * from table_A;
+---+------+
| a | name |
+---+------+
| 1 | Mark |
| 2 | Json |
| 3 | Json |
| 4 | Rany |
| 5 | cao  |
| 5 | zhi  |
| 5 | yun  |
+---+------+
7 rows in set (0.00 sec)

mysql> select * from table_A limit 4,2;
+---+------+
| a | name |
+---+------+
| 5 | cao  |
| 5 | zhi  |
+---+------+
2 rows in set (0.00 sec)

mysql> select * from table_A limit 2 offset 3 ;
+---+------+
| a | name |
+---+------+
| 4 | Rany |
| 5 | cao  |
+---+------+
2 rows in set (0.00 sec)

4.group by 使用:

語法:

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
mysql> select * from table_A;
+---+--------+
| a | name   |
+---+--------+
| 1 | Mark   |
| 2 | Json   |
| 3 | Json   |
| 4 | Rany   |
| 5 | lixian |
| 5 | lixian |
+---+--------+
6 rows in set (0.00 sec)

mysql> select name,count(*) from table_A group by name;
+--------+----------+
| name   | count(*) |
+--------+----------+
| Json   |        2 |
| lixian |        2 |
| Mark   |        1 |
| Rany   |        1 |
+--------+----------+
4 rows in set (0.00 sec)

#:此處count(*),是爲了統計分組後,每組成員(name)的總和

mysql> select name,count(*) as sum from table_A group by name;
+--------+-----+
| name   | sum |
+--------+-----+
| Json   |   2 |
| lixian |   2 |
| Mark   |   1 |
| Rany   |   1 |
+--------+-----+
4 rows in set (0.00 sec)
#:重命名語法 as

mysql> select name from table_A group by name;
+--------+
| name   |
+--------+
| Json   |
| lixian |
| Mark   |
| Rany   |
+--------+
4 rows in set (0.00 sec)

mysql> select name,a from table_A group by name with rollup;
+--------+---+
| name   | a |
+--------+---+
| Json   | 2 |
| lixian | 5 |
| Mark   | 1 |
| Rany   | 4 |
| NULL   | 4 |
+--------+---+
5 rows in set (0.00 sec)
#:這裏with rollup是爲了統計分組後,有多少組,這裏分組後有4組

mysql> select name,count(*) as sum from table_A group by name with rollup;
+--------+-----+
| name   | sum |
+--------+-----+
| Json   |   2 |
| lixian |   2 |
| Mark   |   1 |
| Rany   |   1 |
| NULL   |   6 |
+--------+-----+
5 rows in set (0.00 sec)
#:此處with rollup之後是null和6,null表示所有成員,6是統計的每組成員的總和

mysql> select coalesce(name, 'name_sum'),count(*) as sum from table_A group by name with rollup;
+----------------------------+-----+
| coalesce(name, 'name_sum') | sum |
+----------------------------+-----+
| Json                       |   2 |
| lixian                     |   2 |
| Mark                       |   1 |
| Rany                       |   1 |
| name_sum                   |   6 |
+----------------------------+-----+
5 rows in set (0.00 sec)
# coalesce 來設置一個可以取代 NUll 的名稱

mysql> select name,count(*) as sum ,a,a as b from table_A group by name with rollup;
+--------+-----+---+---+
| name   | sum | a | b |
+--------+-----+---+---+
| Json   |   2 | 2 | 2 |
| lixian |   2 | 5 | 5 |
| Mark   |   1 | 1 | 1 |
| Rany   |   1 | 4 | 4 |
| NULL   |   6 | 4 | 4 |
+--------+-----+---+---+
5 rows in set (0.00 sec)
備註:所以後面不管你加多少列 這裏都是統計分組後的組數總和

第三部分:Mysql連接

#table_A表:
mysql>  select * from table_A;
+---+--------+
| a | name   |
+---+--------+
| 1 | Mark   |
| 2 | Json   |
| 3 | Json   |
| 4 | Rany   |
| 5 | lixian |
| 5 | lixian |
+---+--------+
6 rows in set (0.00 sec)
#table_B表:
mysql>  select * from table_B;
+---+------+
| b | name |
+---+------+
| 4 | Json |
| 4 | zhi  |
| 1 | nan  |
| 7 | liu  |
| 6 | yang |
+---+------+
5 rows in set (0.00 sec)

1.內連接:獲取兩個表中字段匹配關係的記錄

mysql> select * from table_A A inner join table_B B on A.a=B.b;
+---+------+---+------+
| a | name | b | name |
+---+------+---+------+
| 1 | Mark | 1 | nan  |
| 4 | Rany | 4 | Json |
| 4 | Rany | 4 | zhi  |
+---+------+---+------+
3 rows in set (0.00 sec)

mysql> select * from table_A A, table_B B where A.a=B.b;
+---+------+---+------+
| a | name | b | name |
+---+------+---+------+
| 1 | Mark | 1 | nan  |
| 4 | Rany | 4 | Json |
| 4 | Rany | 4 | zhi  |
+---+------+---+------+
3 rows in set (0.00 sec)

#:內鏈接,也就是求交集,平常中用的最多,等價於where

2.左連接:獲取左表所有記錄,即使右表沒有對應匹配的記錄

mysql> select * from table_A A left join table_B B on A.a=B.b;
+---+--------+------+------+
| a | name   | b    | name |
+---+--------+------+------+
| 4 | Rany   |    4 | Json |
| 4 | Rany   |    4 | zhi  |
| 1 | Mark   |    1 | nan  |
| 2 | Json   | NULL | NULL |
| 3 | Json   | NULL | NULL |
| 5 | lixian | NULL | NULL |
| 5 | lixian | NULL | NULL |
+---+--------+------+------+
7 rows in set (0.00 sec)

3.右連接:與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄

mysql> select * from table_A A right join table_B B on A.a=B.b;
+------+------+---+------+
| a    | name | b | name |
+------+------+---+------+
|    1 | Mark | 1 | nan  |
|    4 | Rany | 4 | Json |
|    4 | Rany | 4 | zhi  |
| NULL | NULL | 7 | liu  |
| NULL | NULL | 6 | yang |
+------+------+---+------+
5 rows in set (0.00 sec)

4.多表並集:

mysql> select * from table_A A right join table_B B on A.a=B.b union select * from table_A A left join table_B B on A.a=B.b
    -> ;
+------+--------+------+------+
| a    | name   | b    | name |
+------+--------+------+------+
|    1 | Mark   |    1 | nan  |
|    4 | Rany   |    4 | Json |
|    4 | Rany   |    4 | zhi  |
| NULL | NULL   |    7 | liu  |
| NULL | NULL   |    6 | yang |
|    2 | Json   | NULL | NULL |
|    3 | Json   | NULL | NULL |
|    5 | lixian | NULL | NULL |
+------+--------+------+------+
8 rows in set (0.01 sec)

第四部分:事務的使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章