MySQL數據庫的使用和學習

2020-08-12 09:53:48

MySQL數據庫的使用和學習

一、數據庫簡介

1.數據庫系統

1.1數據庫

DataBase【DB】,指的是長期儲存到計算機上的數據,按照一定順序組織,可以被各種使用者或者應用共用的數據集合

【用於儲存數據的地方,可以視爲儲存數據的容器】

1.2數據庫管理系統

DataBase Management System【DBMS】,能夠管理和操作數據庫的大型的軟體

數據庫是CS模式:Client/Server

用於建立、使用和維護數據庫,對數據庫進行統一的管理和控制,爲了保證數據庫的安全性和完整性,使用者可以通過數據庫管理系統存取數據庫中的數據
在这里插入图片描述

1.3數據庫的應用

涉及到大量的數據需要長期儲存,就可以使用數據庫

使用:增刪改查的操作

持久化: 數據持久化, 一般存在硬碟, MySQL

快取: 臨時儲存, 一般可以存在記憶體, Redis

2.常見數據庫管理系統

1>Oracle(甲骨文): 目前比較成功的關係型數據庫管理系統,執行穩定,功能齊全,效能超羣,技術領先,主要應用在大型的企業數據庫領域, 收費.

2>DB2: IBM(國際商業機器公司)的產品,伸縮性比較強

3>SQL Server: Microsoft的產品,軟體介面友好,易學易用,在操作性和互動性方面獨樹一幟

4>MySQL: 免費的數據庫系統,被廣泛參照於中型應用系統,體積小,速度快,總體擁有成本低,開放原始碼,2008年被SUN收購,2009年SUN被Oracle收購

二、數據庫的安裝

數據庫的安裝請自行百度,有很多人會安裝出錯,注意安裝的路徑,最好是自己另開一個,然後把環境變數新增到系統變數中。

三、SQL概述

1.SQL簡介

Structure Query Language,結構化查詢語言

2.數據庫伺服器、數據庫和表之間的關係

表:爲了儲存應用實體中的數據,一般會給數據庫中建立表,一個數據庫可以同時管理多個表
在这里插入图片描述

3.數據在SQL中的儲存形式

數據庫 => 表

表: 表格

列:表示欄位, id, name, age

行:代表一條數據, 一條記錄 或 一個實體
在这里插入图片描述

4.SQL的分類

DDL【Data Definition Language】,數據定義語言,使用者建立、修改、刪除表結構

DML【Data Manipulation Language】,數據操作語言,用於對錶數據進行增刪改的操作

DQL【Data Query Language】,數據查詢語言,用於負責表數據的查詢工作

DCL【Data Control Language】:數據控制語言,用來定義存取許可權和安全級別

四、數據庫操作

1.登錄數據庫

管理員許可權開啓cmd,輸入mysql -u root -p命令進行登錄,並輸入密碼即可登錄數據庫

在这里插入图片描述

2.檢視和建立數據庫

在上面介面敲入命令show databases;回車可以檢視當前所有的數據庫
在上面介面敲入命令create database myuserdb;可以檢視當前所有的數據庫
注意:在MySQL數據庫中,我們的命令列一般都需要加入英文 ‘;’

3.數據庫的詳細操作

DDL

進入我建立的數據庫:
use myuserdb;

檢視所有表
show tables;

建立表格(簡單)
create table user(id int, name varchar(30),age int);

描述表格:
desc user;

刪除表:
drop table user;

建立標準表:

	mysql> create table user(
    -> id int primary key auto_increment, # 自動增長
    -> name varchar(20),
    -> age int
    -> );

表格的增刪改查:

	mysql> insert into user(name, age) values('馬雲',50);
	Query OK, 1 row affected (0.01 sec)
	mysql> select * from user;
	+----+------+------+
	| id | name | age  |
	+----+------+------+
	|  1 | 馬雲 |   50 |
	+----+------+------+

更新表格
mysql> update user set name=‘馬超’ where id=10;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

刪除數據:
mysql> delete from user where id=10;
Query OK, 1 row affected (0.01 sec)
id不會重置(auto_increment欄位)
truncate 快速清空表中得數據,能針對自動增值得數據重新置1
drop 刪除整個表和表結構

DML

insert 插入數據
insert into table_name(items) values(item_value)
可以一次性插入一條或者多條數據

update 更新表/修改表格內容
update table_name set field1=new_value1, field2=new_value2 [where Clause]
注意:
a.完全可以更新一個欄位或者多個欄位
b.where相當於Python中的if語句
c.可以指定任何條件到where子句中
d.如果沒有where子句,則預設所有的行都被同時更新爲指定的操作[慎用!一般要結合where使用]

where子句
where子句其實就是一個操作符,類似於Python中的if語句,可以做數據的篩選

| =                | 相等                      |
| ---------------- | ------------------------- |
| <> / !=          | 不相等                    |
| <                | 小於                      |
| <=               | 小於等於                  |
| 操作符           | 說明                      |
| >                | 大於                     |
| >=               | 大於等於                 |
| IN(A,B)         | A 和 B 之間               |
| between A  and B | 位於兩值之間              |
| AND              | 連線多個表達式 並且的關係  |

delete 刪除
delete from table_name where clause
注意:
a.如果where子句沒有指定,則預設將表中的數據全部刪除【慎用!】
b.可以指定任何條件在where子句中
刪除表中的數據的方法有delete,truncate, 其中truncate table用於刪除表中的所有行,而不記錄單個行刪除操作。TRUNCATE TABLE 與沒有 WHERE 子句的 DELETE 語句類似;但是,TRUNCATE TABLE 速度更快,使用的系統資源和事務日誌資源更少
Truncate是一個能夠快速清空資料表內所有資料的SQL語法。並且能針對具有自動遞增值的欄位,做計數重置歸零重新計算的作用。

DQL

數據庫執行DQL語言不會對數據庫中的數據發生任何改變,而是讓數據庫發送查詢結果到用戶端

查詢返回的結果其實是一張虛擬表

語法:

SELECT 列名 FROM 表名【WHERE --> GROUP BY -->HAVING--> ORDER BY】

基本查詢語句

#1.查詢所有列
mysql> select * from student;
+------+----------+------+--------+
| id   | name     | age  | gender |
+------+----------+------+--------+
| 1    | aaaa     |   19 | female |
| 2    | bbbbbbbb |   20 | male   |
| 3    | cc       |   15 | male   |
| 4    | ddd      |   16 | female |
| 5    | eee      |   20 | female |
+------+----------+------+--------+
5 rows in set (0.00 sec)


#2.查詢指定列
mysql> select id,name,gender from student;
+------+----------+--------+
| id   | name     | gender |
+------+----------+--------+
| 1    | aaaa     | female |
| 2    | bbbbbbbb | male   |
| 3    | cc       | male   |
| 4    | ddd      | female |
| 5    | eee      | female |
+------+----------+--------+
5 rows in set (0.00 sec)

條件查詢

主要結合where的使用

between…and: 介於…和…之間
and:邏輯與
or:邏輯或
in / not in:類似於Python中的成員運算子
is / is not: 類似於Python中的身份運算子 , 常用語判斷null值, 如:name is null
演示:

#1.查詢性別爲女,並且年齡爲20的記錄
mysql> select * from student where gender='female' and age=20;
+------+------+------+--------+
| id   | name | age  | gender |
+------+------+------+--------+
| 5    | eee  |   20 | female |
+------+------+------+--------+
1 row in set (0.00 sec)

#2.查詢編號爲1或者姓名爲ddd的記錄
mysql> select * from student where id='1' or name='ddd';
+------+------+------+--------+
| id   | name | age  | gender |
+------+------+------+--------+
| 1    | aaaa |   19 | female |
| 4    | ddd  |   16 | female |
+------+------+------+--------+
2 rows in set (0.00 sec)

#3.查詢編號分別爲1,2,3的記錄
mysql> select * from student where id='1' or id='2' or id='3';
+------+----------+------+--------+
| id   | name     | age  | gender |
+------+----------+------+--------+
| 1    | aaaa     |   19 | female |
| 2    | bbbbbbbb |   20 | male   |
| 3    | cc       |   15 | male   |
+------+----------+------+--------+
3 rows in set (0.00 sec)
#簡寫形式
mysql> select * from student where id in('1','2','3');
+------+----------+------+--------+
| id   | name     | age  | gender |
+------+----------+------+--------+
| 1    | aaaa     |   19 | female |
| 2    | bbbbbbbb |   20 | male   |
| 3    | cc       |   15 | male   |
+------+----------+------+--------+
3 rows in set (0.00 sec)

#4.查詢編號不爲1,2,3的記錄
mysql> select * from student where id not in('1','2','3');
+------+------+------+--------+
| id   | name | age  | gender |
+------+------+------+--------+
| 4    | ddd  |   16 | female |
| 5    | eee  |   20 | female |
+------+------+------+--------+
2 rows in set (0.00 sec)

模糊查詢
where 子句中=表示精準查詢
like:一般情況下結合where子句使用
萬用字元:
​ _: 匹配任意一個字元
​ %:匹配0~n個字元【n大於等於1】
演示:

#1.查詢姓名由4個字元組成的記錄
mysql> select * from student where name like '____';
+------+------+------+--------+
| id   | name | age  | gender |
+------+------+------+--------+
| 1    | aaaa |   19 | female |
+------+------+------+--------+
1 row in set (0.00 sec)

#2.查詢姓名由3個字元組成的記錄,並且最後一個字母爲c的記錄
mysql> select * from student where name like '__c';
Empty set (0.00 sec)

#3.查詢以a開頭的記錄
mysql> select * from student where name like 'a%';
+------+------+------+--------+
| id   | name | age  | gender |
+------+------+------+--------+
| 1    | aaaa |   19 | female |
+------+------+------+--------+
1 row in set (0.01 sec)

#4.查詢姓名中包含b的記錄
mysql> select * from student where name like '%b%';
+------+----------+------+--------+
| id   | name     | age  | gender |
+------+----------+------+--------+
| 2    | bbbbbbbb |   20 | male   |
+------+----------+------+--------+
1 row in set (0.00 sec)

#5.查詢姓名中第2個字母爲c的記錄
mysql> select * from student where name like '_c%';
+------+------+------+--------+
| id   | name | age  | gender |
+------+------+------+--------+
| 3    | cc   |   15 | male   |
+------+------+------+--------+
1 row in set (0.00 sec)

欄位控制查詢
as: 起別名,用法 :select 欄位 as 別名
distinct: 去除重複記錄

#1.去除重複記錄
mysql> select distinct id from student;
#2.給列名起別名
mysql> select name as 姓名,gender as 性別  from student;

排序
order by:指定數據返回的順序
asc:ascending,升序
desc: descending,降序
用法:select from 表 order by xxx
演示:

#1.查詢所有的記錄,按照年齡升序排序
mysql> select * from student order by age asc;
#2.查詢所有學生記錄,按照年齡降序排序,如果年齡相等,則按照編號進行升序排序 
mysql> select * from student order by age desc,id asc; 

聚合函數

聚合函數主要用來做縱向運算
1、count():統計指定列不爲null的記錄行數

#1.查詢年齡大於20的人數
mysql> select count(*)  from student where age>20; 

2、sum():計算指定列的數值和

#1.查詢所有學生的年齡和
mysql> select sum(age) from student;

3、求指定列中的最大值和最小值
max():
min():

#求最大年齡和最小年齡
mysql> select max(age),min(age) from student;

4、avg()
average:平均數

#查詢所有學生的平均年齡
mysql> select avg(age) from student;

總結:
查詢關鍵字的書寫順序:select 聚合函數 from where order by

分組查詢
group by:分組查詢
having:有…,表示條件,類似於where的用法
演示:

#在當前數據庫下建立新的表
mysql> create table emp(			
 -> empno int primary key,
 -> enname varchar(20),
 -> job varchar(20),
 -> mgr int,
 -> hiredate date,
 -> sal double,
 -> comm double,
 -> deptno int
 -> );

#1.查詢各個部門的人數
mysql> select count(*) from emp group by deptno;  # 先分組 後count

#2.查詢每個部門的部門編號和每個部門的工資和
mysql> select deptno,sum(sal) from emp group by deptno;

#3.查詢每個部門的部門編號和每個部門工資大於1500的人數
mysql> select deptno,count(*) from emp where sal>1500 group by deptno;

#4.查詢工資總和大於7000的部門編號以及工資和
mysql> select deptno,sum(sal) from emp group by deptno having sum(sal)>7000;

總結:
​ having和where的區別
​ a.二者都表示對數據執行條件
​ b.having是在分組之後對數據進行過濾
​ where是在分組之前對數據進行過濾
​ c.having後面可以使用聚合函數
​ where後面不可以使用聚合函數

分頁查詢

limit:用來限定查詢的起始行,以及總行數
演示:

#1.查詢4行記錄,起始行從0開始
mysql> select * from emp limit 0,4;
#2.查詢3行記錄,起始行從2開始
mysql> select * from emp limit 2,3;

總結:

mysql> select deptno,sum(sal) from emp where sal>1500  group by deptno having sum(sal)>5000 order by sum(sal) asc limit 4; 

​ 查詢語句書寫順序:select----》from—》where—》group by-----》having-----》order by----->limit

​ 查詢語句執行順序:from----》where-----》group by----》having----》order by ----》select-----》limit