MySQL基礎部分學習筆記

怎麼理解數據庫

本質:就是個放數據的**“倉庫”**

數據存放

萌芽階段

  • 放在內存裏——瞬時:程序結束,上次的數據就沒啦
  • 放在文件裏——持久:進步了!能一直保存了(比如放在.txt文件裏),但還是存在問題
    • 不安全
    • 不方便在中間插入、刪除數據
    • 但也不是一無是處,可以應用於配置文件:.xml文件、.ini文件等等

數據庫的產生

核心:CRUD(最難的是“查找”)

  • 層次模型

    • 優點:層次清晰

    • 缺點:(假如一張“專業”表有你,“學校”表也有你)

      • 查詢效率低下(不知道查哪張)
      • 數據不完整(這張表改了那張表沒改)
    • 致命:重複就GG了

  • 網狀模型

    • 優點:解決複雜問題,數據也完整了,重複的話也只操作一個文件

    • 缺點:重複文件沒法解決特殊性問題(假設計算機一班的人和上mysql課的有一部分人都是)

      • 計算機一班的每人收100元
      • 上mysql課的每人收233元
    • 致命:並未解決導航問題

  • 關係型

    • 解決了導航問題:比如每張表都有個學號(公共的編號)
    • 分批管理,各管各的
    • 數據完整,層次清晰
    • 說白了,關係就是共性,爲了讓每張表都能找到爹
    • 和誰都有關係,但是又互不影響

安裝

  • 版本(看企業,貼合業務)

    • 5.7
    • 8.0
  • 下載

    • 點MySQL Community Download

    • 點MySQL Community Server、

    • 選MSI Installer(幾百M的那個)

    • 選5.7.29

    • 太慢?在下載內容裏複製鏈接到迅雷就行啦

  • 安裝

    • sever only
    • 有excute就點,彈框確認就完了
    • 一路next就完了
  • 添加到環境變量(比如:C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin)

  • 在cmd下進入(u是用戶名,p是密碼)

# 不推薦直接在-p後輸入密碼
mysql -u root -padmin
# 建議這樣
mysql -u root -p
>Enter Password:*****

root用戶可以爲所欲爲!!!

MySQL是個啥

  • 用C++開發(bin中的.exe、include中的.h可以看出來…)

  • 典型C/S架構

    • server服務端:MySQL Sever mysql服務端(在本地,客戶端要訪問,需要開啓服務)
    • client客戶端:通過終端cmd去訪問/操作數據庫
# 關閉服務(大小寫不敏感)
net stop mysql
# 開啓服務
net start mysql
  • 斷開連接

    • quit
    • exit
    • \q
    • 直接關閉CMD
  • windows系統的情況屏幕命令:cls

  • 在MySQL Server 的目錄下創建data文件夾

mysqld --initialize-insecure --user=root

庫的基本操作

顯示所有倉庫

# 輸入內容
show databases;
# 輸出內容
+--------------------+
| Database           |
+--------------------+
| information_schema |
| how2java           |
| mybatis            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)
  • information_schema:服務器管理數據庫的信息

  • mysql:用戶信息(比如root用戶)

  • performance_schema:存儲服務器性能的東西(5.5之後纔有的)

  • test:自帶的測試樣例

建庫

  • 通常做法
create database student;

tips:別用關鍵字,比如:database

  • 萬一庫很多,避免存在,可以先檢查是否存在,再創建,並指定字符集(推薦這種做法,更規範)
create database if not exists `student` charset=utf8;
  • 查看當時怎麼創建的(看到編碼)
# 輸入內容
mysql>show create database student;
# 輸出內容
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| student  | CREATE DATABASE `student` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

刪庫

  • 通常做法
drop database student;
  • 萬一我刪的是一個不存在的庫(推薦這種做法,更規範)
drop database if exists 'student';

字符集設置

  • 默認latin1
  • win10下學習用gbk,實際開發用utf8
  • 修改字符集
alter database student charset=gbk;

使用數據庫

use student;

表的基本操作

  • 本質:將倉庫裏的東西歸類

顯示庫內的所有表

  • 首先要use,才能show
show tables;

表的創建

  • 簡易創建
# 輸入內容
mysql> use school;
# 輸出內容
Database changed
# 輸入內容
mysql> create table student(
    -> id int,
    -> name varchar(30),
    -> age int
    -> );
# 輸出內容
Query OK, 0 rows affected (0.01 sec)
# 輸入內容
mysql> show tables;
# 輸出內容
+------------------+
| Tables_in_school |
+------------------+
| student          |
+------------------+
1 row in set (0.00 sec)
  • 規範創建
create table if not exists teacher(
id int auto_increment primary key comment '主鍵id',
name varchar(30) not null comment '老師的名字',
phone varchar(20) comment '電話號碼',
address varchar(100) default '暫時未知' comment '住址'
)engine=innodb;   

tips:

id name age:字段(field)

auto_increment:自動增長(必須是primary key

primary key:主鍵,唯一不重複,靠它來區分此表

comment:註釋

not null:該字段不爲空

default:默認值

engine=innodb:暫不解釋

查看錶結構

mysql> desc teacher;
+---------+--------------+------+-----+----------+----------------+
| Field   | Type         | Null | Key | Default  | Extra          |
+---------+--------------+------+-----+----------+----------------+
| id      | int(11)      | NO   | PRI | NULL     | auto_increment |
| name    | varchar(30)  | NO   |     | NULL     |                |
| phone   | varchar(20)  | YES  |     | NULL     |                |
| address | varchar(100) | YES  |     | 暫時未知 |                |
+---------+--------------+------+-----+----------+----------------+
4 rows in set (0.00 sec)

刪表

  • 標準做法
drop table if exists 'stu';
  • 多張表可以逗號隔開
drop table if exists ooo,jjj,kkk;

修改表

  • 添加字段
alter table student add phone varchar(20);
  • 放在某字段後面
alter table student add gender varchar(2) after name;
  • 放在第一個
alter table student add sex varchar(1) first;
  • 刪除字段
alter table student drop phone;
  • 修改字段屬性(change可以改名字,也可以改類型;modify只能改類型)
alter table student change phone tel_phone int(11);
alter table student modify tel_phone varchar(13);
  • 改名字(表名不能是複數,這邊是不規範的)
alter table student rename to students;

數據的基本操作

添加

  • 插入單條數據
insert into teacher (name,phone,address) values('王帥真','18359730121','嘉園路');

順序沒要求,但屬性一定要一一對應;

如果不寫第一個"()"的內容,就要按順序了,且id處填null

  • 插入多條數據
insert into teacher values(NULL,'Tom',NULL,default),(NULL,'Jack',NULL,default);

刪除

  • 按屬性刪除
delete from teacher where id=2;
delete from teacher where name="Tom";
delete from teacher where age>18;
  • 清空表(自增id會從1開始,而delete不會)
truncate table student;

更新

where儘可能的唯一,防止SQL注入

update teacher set name='Jack' where id=1;

查找

  • 查整張表(*表示找出全部,方便但是性能低)
mysql> select * from teacher;
+----+--------+-------------+---------+
| id | name   | phone       | address |
+----+--------+-------------+---------+
|  1 | 王帥真 | 18359730121 | 嘉園路  |
+----+--------+-------------+---------+
1 row in set (0.00 sec)
  • 指定字段
mysql> select name from teacher where id=1;
+--------+
| name   |
+--------+
| 王帥真 |
+--------+
1 row in set (0.00 sec)

SQL語句區分

  • DDL:Data Definition Language
    • 針對【數據庫】
    • 數據庫定義語言 create alter drop show
  • DML:Data Manipulation Language
    • 針對【數據】
    • 數據庫操縱語言 insert update delete select

查看字符集情況

  • 查找所有字符集設置
show variables like 'character_set_%';
  • 設置客戶端字符集
set character_set_client=utf8;

數據類型

數值類型

類型 大小 範圍(有符號) 範圍(無符號) 用途
TINYINT 1 byte (-128,127) (0,255) 小整數值
SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整數值
MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整數值
INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數值
BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 極大整數值
FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 單精度 浮點數值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 雙精度 浮點數值
DECIMAL 對DECIMAL(M,D) ,如果M>D,爲M+2否則爲D+2 依賴於M和D的值 依賴於M和D的值 小數值
  • 整型應用
create table user(
id smallint unsigned auto_increment primary key comment 'id',
age tinyint unsigned not null default 0,
kkk int(6)
);

int()裏的代表數據的寬度,即十進制位數

tinyint默認是3(255),smallint默認是5(65535)

  • 浮點數應用(**錢千萬不能用浮點型!!!!!**存在精度丟失問題!!!)
create table t_1(
num1 float(3,1),
num2 double(5,2),
)

()裏的前一個是總寬度,後一個是小數部分寬度

如果我故意插入(2.99,2.777777777777)

最後會出來的是(3.0,2.78),也就是會被約

  • 定點數(Decimal)應用(錢用這個,不會丟失精度)

一部分空間存整數,一部分空間存小數

字符串類型

類型 大小 用途
CHAR 0-255 bytes 定長字符串
VARCHAR 0-65535 bytes 變長字符串(多餘的空間會回收,但效率偏低)
TINYBLOB 0-255 bytes 不超過 255 個字符的二進制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二進制形式的長文本數據
TEXT 0-65 535 bytes 長文本數據(比如:存博客文章)
MEDIUMBLOB 0-16 777 215 bytes 二進制形式的中等長度文本數據
MEDIUMTEXT 0-16 777 215 bytes 中等長度文本數據
LONGBLOB 0-4 294 967 295 bytes 二進制形式的極大文本數據
LONGTEXT 0-4 294 967 295 bytes 極大文本數據

日期和時間類型

業內規定,表內都要有!!!!!!

類型 大小 ( bytes) 範圍 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 時間值或持續時間
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4 1970-01-01 00:00:00/2038結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和時間值,時間戳

布爾類型

  • boolean
    • true:1
    • false:0

枚舉類型

create table t_5(
sex enum('man','woman','?','none','it')
);

枚舉類型有的才能取

第一個類型是1(‘man’)

第二個類型是2(‘woman’)

以此類推

實際存的就是整數數據

優點:

  • 速度快

  • 節省空間,限制數據(2byte)

集合類型

create table t_6(
hobby set('哲學','經濟學','IT','人文社科')
);

插入的話只能插入一個字段

insert into t_6 values('IT,經濟學');

哲學——2^0

經濟學——2^1

IT——2^2

人文社科——2^3

比如:我插入1,就是'哲學';我插入5,就是'哲學','IT'

總之就是“位操作

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