曾經遇到的一個面試題:主鍵與索引區別
主鍵:主鍵是唯一的,一個表中只能包含一個主鍵,也可以利用主鍵查詢記錄
索引:可根據索引快速訪問表中的特定信息,它是對錶中一列或多列的值進行排序的一種結構,等價於書的目錄
是不是還是體會不到兩者真正的區別~~~~~
詳解:參照:
第一部分:環境搭建
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)
第四部分:事務的使用