0042 MySQL學習筆記-入門--01

来源:http://www.cnblogs.com/sonng/archive/2016/12/17/6192627.html
-Advertisement-
Play Games

基本概念: 資料庫DB(database): + 數據的倉庫,數據的集合,是數據的一種結構化的存儲 資料庫管理系統DBMS(database management system): + 管理資料庫的一套軟體 + 比如Oracle、MySQL、SQL server、DB2 + 介於應用程式和操作系統之 ...


基本概念:

  • 資料庫DB(database):
    • 數據的倉庫,數據的集合,是數據的一種結構化的存儲
  • 資料庫管理系統DBMS(database management system):
    • 管理資料庫的一套軟體
    • 比如Oracle、MySQL、SQL server、DB2
    • 介於應用程式和操作系統之間
  • 資料庫應用程式:
    • 使用資料庫應用程式與DBMS進行通信,訪問和管理資料庫中的數據
  • 資料庫伺服器:
    • 電腦+資料庫管理系統
    • 一個資料庫伺服器可以管理多個資料庫,一個資料庫下包含多個表
  • SQL語言
    • 全稱:Structured Query Language,結構化查詢語言
    • 由IBM在70年代開發出來,80年代被確定為關係型資料庫語言的標準
    • 主要包含,對數據的定義、操作、查詢、控制,四大類操作
  • 常見的資料庫產品
    • Oracle公司的Oracle
    • 微軟公司的SQL Server
    • IBM公司的DB2
    • 10gen公司的MongoDB:
    • Oracle公司的MySQL,早期為瑞典的MySQL AB公司開發
  • 資料庫引擎:

SQL語言

  • 數據定義語言:DDL(Data Definition Language)
    • 主要進行對資料庫、表的定義,比如CREATE、ALTE、RDROP等操作
  • 數據操作語言:DML(Data Manipulation Language)
    • 向資料庫中添加、刪除、修改數據,比如INSERT、UPDATE、DELETE等操作
  • 數據查詢語言:DQL(Data Query Language)
    • 從資料庫中查詢數據,主要是SELECT操作
    • 用得最多的操作
  • 數據控制語言:DCL(Data Control Language)
    • 用於控制用戶對資料庫的訪問許可權,比如GRANT、REVOKE、COMMIT、ROLLBACK等操作
  • 有一個標準的SQL語言(當前最新版本是SQL:2016),在各家DBMS上通用,但各個DBMS又對標準的SQL進行了擴展,學習的時候要註意

MySQL安裝、初步使用的註意事項

  • 版本的下載:
  • 安裝方式:
    • 典型安裝Typical:只包含伺服器、命令行客戶端、命令行使用程式
    • 定製安裝Custom:
    • 完全安裝Complete:各種組件全部安裝
  • 配置:
    • 包括詳細配置和標準配置
    • 詳細配置:
    • 伺服器類型:會影響到對記憶體、磁碟、過程等的決策
      • 開發者類型:適用於開發者,記憶體占用少
      • 伺服器類型:專門用提供服務
      • 專用MySQL伺服器:該機器專門用來作為MySQL的伺服器,資源開銷最大
    • 資料庫用途:
      • 多功能資料庫:同時使用InnoDB和MyISAM引擎
      • 事務處理資料庫:同時使用InnoDB和MyISAM引擎,但InnoDB能分配到更多的資源
      • 非事務處理資料庫:只是用MyISAM引擎
    • 最大併發連接數
      • 決策支持(Decision Support):不需要大量的併發連接
      • 聯機事務處理(Online Transaction Processing):需要大量的併發連接,最大500
      • 人工設置(Manual Setting):預設連接數15
    • 預設埠3306
    • 字元集:
      • 標準字元集(Standard Character Set):支持西歐語言
      • 支持多語言(Best Support For Multilingualism):UTF-8字元集
      • 人工選擇(Manual Selected Default Character Set/Collection):自己選擇,GBK;GB2312;UTF-8
  • 配置文件:
    • my.ini:正在使用的配置文件,一定會被讀取
    • 其他:my-huge/large/medium/small/template/innodb-heavy-4G.ini等可能會被讀取到
  • 缺少根元素
    • 刪除:C:\Users\用戶名\AppData\Roaming\Oracle\MySQL Notifier下的配置文件

資料庫的基本操作

# 命令行下登錄到資料庫:開始菜單中找到“MySQL 5.7 Command Line Client” 打開
# 輸入root用戶的密碼,即可登錄
# 在MySQL workbench中操作更加方便
# MySQL Workbench中建立連接,輸入connection name; connection method; hostname port; username password等,下次直接點擊這個連接就能連上資料庫
# 在建立好的連接上面點擊右鍵,“Copy JDBC Connection String to Clipboard”,可以用在將來的jdbc編程中
# 點擊該連接,連接上資料庫
SHOW DATABSASES;                           # 查看有哪些資料庫。系統預設有information_scheme;mysql;performance_scheme;sys四個;另有sakila和world兩個示例庫
CREATE DATABASE newDB;                     # 創建一個資料庫,名叫newDB
SHOW CREATE DATABASE newDB;                # 查看資料庫newDB的信息,可以看到是Character Set UTF-8
ALTER DATABASE newDB DEFAULT CHARACTER SET gbk COLLATE gbk_bin;   # 將newDB的預設字元集改為gbk
DROP DATABASE newDB;                       # 刪除newDB這個資料庫

MySQL的數據類型

  • 整數類型:
    • TINYINT:1個位元組;0~28-1;-27~27-1;
    • SMALLINT:2個位元組;0~216-1;-215~215-1;
    • MEDIUMINT:3個位元組;0~224-1;-223~223-1;
    • INT:4個位元組;0~232-1;-231~231-1;
    • BIGINT:8個位元組;0~264-1;-263~263-1;
  • 浮點數與定點數
    • FLOAT:4個位元組;
    • DOUBLE:8個子ie;
    • DECIMAL(M,D);M+2個位元組;M表示總長度,D表示小數點後的長度
  • 日期與時間
    • YEAR:
      • 1個位元組;1901~2155;YYYY;0000
      • 四位字元串或數字:'2016'和2016皆可;
      • 兩位字元串:'16'表示2016;'69'表示2069;'70'表示1970;'99'表示1999;'00'表示2000
      • 兩位數字:1表示2001;69表示2069;70表示1970;99表示1999;0表示0000
    • DATE:
      • 4個位元組;1000-01-01~9999-12-03;YYYY-MM-DD;0000-00-00
      • 完整字元串'2016-12-16'和'20161216'都表示2016年12月16日
      • 年簡寫字元串:'16-12-16'和'161216'都表示2016年12月16日
      • 年簡寫數字:161216和12-12-16,都表示2016年12月16日
      • 函數與常量:NOW()和CURRENT_DATE都表示當前系統日期
    • TIME:
      • 3個位元組;-838:59:59~838:59:59;HH:MM:SS;00-00-00
      • 'D HH:MM:SS':D表示天數,可以是[0,34];比如'3 12:24:36'表示84:24:36
      • 'HHMMSS'或者HHMMSS:295416表示29:54:16
      • 常量與函數:CURRENT_TIME和NOW()表示當前系統時間
    • DATETIME:8個位元組;1000-01-01 00:00:00~9999-12-31 23:59:59;YYYY-MM-DD HH:MM:SS;0~0
    • TIMESTAMP:
      • 4個位元組;1970-01-01 00:00:01~2038-01-19 03:14:07;YYYY-MM-DD HH:MM:SS;0~0
      • 與DATETIME相同,只是取值範圍更小
      • CURRENT_TIMESTAMP和NULL和無輸入,都表示當前系統時間
    • 如果插入的數據非法,那麼會把零值插入
  • 字元串與二進位
    • CHAR:
      • 固定長度字元串:CHAR(4)表示最大可存儲4個位元組,並且始終占用4個位元組
    • VARCHAR
      • 可變長度字元串:VARCHAR(4)表示最大可存儲4個位元組,實際占用實際的位元組數+1,實際最大可占用5個位元組
    • BINARY
      • 固定長度二進位數據;實際長度不足時,用\0補齊
    • VARBINARY
      • 可變長度二進位數據;
    • BLOB
      • 數據量很大的二進位數據,大小與下麵的TEXT相同
      • 按照二進位編碼進行比較和排序;
      • TINYBLOB:
      • BLOB:
      • MEDIUMBLOB:
      • LONGBLOB:
    • TEXT
      • 表示大文本數據,如文章評論和內容等
      • 按照文本模式進行比較和排序
      • TINYTEXT:[0,255]個位元組;0.25K
      • TEXT:[0,65535]個位元組;64K
      • MEDIUMTEXT:[0,16777215]個位元組;16M
      • LONGTEXT:[0,4294967295]個位元組;4096M
    • ENUM
      • 枚舉類型;定義一個枚舉類型:ENUM('枚舉值1','枚舉值2','枚舉值3','枚舉值4','枚舉值5')
      • 存入資料庫的實際是這個枚舉值的編號,而不是值本身
    • SET
      • 與ENUM類似,表示的是字元串對象;SET('值1','值2','值3','值4','值5')
      • 存入資料庫的也是其編號,而不是字元串本身
    • BIT
      • 表示二進位數據;定義BIT(M),M表示值的位數,[1,64]
      • 如果長度小於M,那麼左邊用0補齊

約束

  • 約束:約束就是一個條件,表示被約束的數據應當滿足約束條件
  • 為什麼有約束:因為為了後續的各種計算和操作,資料庫中的數據不能是雜亂無章的,要符合一定的規則
  • 常見約束:
    • 主鍵約束:PRIMARY KEY
    • 外鍵約束:FOREIGN KEY
    • 非空約束:NOT NULL
    • 唯一性約束:UNIQUE
    • 預設值約束:DEFAULT
  • 主鍵約束PRIMARY KEY
    • 用主鍵約束的列的數據可以唯一的表示這一條記錄(這一行數據)
    • 主鍵約束的數據不能重覆,不能為空,每張表只能有一個主鍵約束
    • 是否可重用,得看具體的資料庫
    • 單欄位主鍵:
      • 主鍵約束在一個欄位上,這個欄位的值唯一標識一條記錄
    • 多欄位主鍵:
      • 主鍵約束在多個欄位上,這幾個字的的值拼接起來唯一標識一條記錄
  • 外鍵約束FOREIGN KEY
  • 非空約束
    • 非空約束的欄位的值不能為空,必須填寫
  • 唯一約束UNIQUE
    • 唯一約束的字讀的值不能重覆
  • 預設約束DEFAULT
    • 預設約束的欄位,如果沒有插入數據,那麼會自動插入預設值

表的基本操作

USE newDB;                                 # 進入newDB資料庫,後續的操作都在這個資料庫中

CREATE TABLE teacher(                      # 創建一個名為teacher的表
    tea_id TINYINT PRIMARY KEY,            # 教師編碼,主鍵約束,唯一且非空
    tea_ID_num CHAR(18),                   # 身份證號
    tea_name VARCHAR(10),                  # 姓名
    tea_gender ENUM('男','女'),             # 性別
    tea_birth DATE                         # 出生日期
);

SHOW TABLES;                               # 查看這個資料庫下的表

SHOW CREATE TABLE teacher;                 # 查看teacher這個表

DESCRIBE teacher;                          # 查看teacher這個表的欄位信息

DESC teacher;                              # DESCRIBE的簡寫

ALTER TABLE teacher RENAME TO tea;         # 修改表名:teacher--->tea

DESC tea;

ALTER TABLE tea CHANGE tea_gender tea_sex ENUM('男','女');     # 修改欄位名:tea_gender--->tea_sex,數據類型為ENUM('男','女'),註意數據類型不可省略,即使一樣也不可省略

ALTER TABLE tea MODIFY tea_sex ENUM('男','女','其他');         # 修改數據類型:tea_sex的新數據類型為ENUM('男','女','其他')

ALTER TABLE tea DROP tea_birth;                              # 刪除欄位:刪除tea_birth欄位

ALTER TABLE tea ADD tea_birth DATE NOT NULL FIRST;           # 添加欄位:添加tea_birth欄位,非空,位置為first,就是第一個欄位,(也可以是是AFTER 欄位名),

ALTER TABLE tea MODIFY tea_birth DATE AFTER tea_sex;         # 修改欄位位置:修改tea表下的tea_birth欄位的位置為tea_sex之後

DROP TABLE tea;                                              # 刪除數據表。特別小心,表跟表之間往往存在關聯

CREATE TABLE teacher(                                        # 新建一張表
    tea_id TINYINT PRIMARY KEY AUTO_INCREMENT,  # tea_id欄位為主鍵,且自增(AUTO_INCREMENT,適合於任何整數類型),即每添加一條記錄,這個欄位的值就增加1
    tea_ID_num CHAR(18),
    tea_name VARCHAR(10),
    tea_gender ENUM('男','女','其他'),
    tea_birth DATE
);

CREATE TABLE teacher(
    tea_id TINYINT,
    tea_ID_num CHAR(18),
    tea_name VARCHAR(10),
    tea_gender ENUM('男','女','其他'),
    tea_birth DATE,
    PRIMARY KEY(tea_id,tea_ID_num)                # 設置多欄位主鍵
);

添加、更新、刪除數據

CREATE TABLE teacher(                        # 創建個teacher表
    tea_id TINYINT,
    tea_ID_num CHAR(18),
    tea_name VARCHAR(10),
    tea_gender ENUM('男','女','其他'),
    tea_birth DATE,
    PRIMARY KEY(tea_id)                       # tea_id為主鍵
);

INSERT INTO teacher(tea_id,tea_ID_num,tea_birth,tea_name,tea_gender)
            values(1,'102315198102215425','1981-02-21','王洪','女');  # 添加一條記錄,值的順序跟欄位名的順序匹配,欄位名的順序跟表裡面的欄位順序無關

INSERT INTO teacher VALUES(2,'102315198503136216','李剛','男','1985-03-13');  # 添加一條記錄:省略欄位名,值的順序跟表中欄位的順序一致

INSERT INTO teacher(tea_id,tea_name,tea_gender)
            VALUES (3,'張華','男');                       # 添加一條記錄,只給部分欄位添加,被忽略的欄位,不能有非空約束或者得有預設值

INSERT INTO teacher VALUES(4,'102315197601213162','王和','女','1976-01-21'),
                          (5,'102315198205168435','阿Q','男','1982-05-16');
                          # 一次添加兩條記錄,省略了欄位名

INSERT INTO teacher 
        SET tea_id=6,                   # 欄位=值的形式
            tea_name='李飛',
            tea_gender='男';

SELECT * FROM teacher;                  # 查詢teacher中的所有的記錄

UPDATE teacher                          # 更新一條信息
    SET tea_ID_num='102315197001207511',tea_birth='19700120' 
    WHERE tea_id=3;                     # 特別註意,不能少了WHREE字句

UPDATE teacher
    SET tea_gender=null                 # 刪除一條記錄某個欄位的值,可將其UPDATE為null
    WHERE tea_id=1;
    
DELETE FROM teacher WHERE tea_id=1;     # 刪除符合特定條件的記錄:使用DELETE的時候,對條件的限定千萬不能少,否則可能會刪除整張表的記錄

UPDATE teacher
    SET tea_gender='其他';              # 沒有限定條件,會導致tea_teacher的值全部改為'其他'

DELETE FROM teacher;                    # 刪除teacher表的所有記錄

TRUNCATE TABLE teacher;                 # 清空teacher表

DELETE與TRUNCATE的區別

  • 二者都能將整個表的數據全部刪除
  • DELETE是DML語句;TRUNCATE是DDL語句
  • DELETE後面一般要跟WHERE字句來限定要刪除的記錄,TRUNCATE則不能跟WHERE字句,而是刪除整張表的記錄
  • 對於有AUTO_INCREMENT約束的欄位,DELETE後,從原來的記錄的值開始自增;TRUNCATE則重新從1開始

簡易的單表查詢

SELECT tea_name,tea_gender FROM teacher;                 # 查詢2個欄位

SELECT tea_id,
       tea_ID_num,
       tea_birth,
       tea_name,
       tea_gender FROM teacher;                          # 查詢5個欄位,結果按照這個順序排列
       
SELECT * FROM teacher;                                   # 用通配符查詢所有欄位。註意效率較低

SELECT * FROM teacher WHERE tea_id>3;                    # 單條件查詢所有欄位

SELECT * FROM teacher WHERE tea_id BETWEEN 2 AND 6;      # BETWEEN X AND Y。[X,Y]且X<Y

SELECT * FROM teacher WHERE tea_id NOT BETWEEN 2 AND 5;  # 對BETWEEN AND 取反

SELECT * FROM teacher WHERE tea_id IN (1,3,4);           # IN查詢,相等匹配多個值

SELECT * FROM teacher WHERE tea_id_num IS NULL;          # 匹配NULL

SELECT * FROM teacher WHERE tea_id_num IS NOT NULL;      # 匹配NOT NULL

SELECT DISTINCT tea_gender FROM teacher;                 # 查詢結果去重

SELECT DISTINCT tea_name,tea_gender FROM teacher;        # DISTINCT可用於多個欄位

SELECT * FROM teacher WHERE tea_name LIKE '王_';         # LIKE模煳匹配,下劃線匹配單個字元,不包括空字元串,用\轉義

SELECT * FROM teacher WHERE tea_ID_num LIKE '102315197%';  # %匹配若幹個字元,包括空字元串,用\轉義

SELECT * FROM teacher WHERE tea_id>2 AND tea_id<6;       # AND連接多個條件,交集

SELECT * FROM teacher WHERE tea_id>3 OR tea_birth>'1982-01-01';  # OR連接兩個條件,並集

SELECT * FROM teacher WHERE tea_name LIKE '李_' AND tea_gender='男';

SELECT * FROM teacher WHERE 
        tea_id<5 AND 
        tea_name LIKE '王_' AND 
        tea_birth>'1980-01-01';                          # AND連接3個條件

SELECT * FROM teacher WHERE 
        tea_name LIKE '李_' AND tea_birth>'1980-01-01'   # AND 與 OR聯用,AND優先順序高於OR
        OR 
        tea_name LIKE '王_' AND tea_birth<'1980-01-01';




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (未給Fragment的佈局設置BackGound) 之前關於Android中Fragment的概念以及創建方式,我專門寫了一篇博文《Android中Fragment的兩種創建方式》,就如何創建Fragment混合佈局做了詳細的分析,今天就來詳細說道說道Fragment與宿主Activity之間是如 ...
  • 設計思路:給UIView增加一個分類 所有的視圖都可以根據需要來進行紅點顯示 ...
  • 在OC當中自動計算行高主要調用系統的 - (--boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *) ...
  • GridView 可以指定顯示的條目的列數。 listview一般顯示的條目的列數都是一列 如果是列表(單列多行形式)的使用ListView,如果是多行多列網狀形式的優先使用GridView android:numColumns=”auto_fit” //GridView的列數設置為自動 GridV ...
  • 現在二維碼的應用越來越普及,二維碼掃描也成為手機應用程式的必備功能了。本文將基於 Xamarin.Android 平臺使用 ZXing.Net.Mobile 做一個簡單的 Android 條碼掃描示常式序。 1、新建一個 Xamarin.Android 應用: 閱讀全文 ...
  • 苦心人天不負, 為了項目終於把 iOS 10 跳轉系統設置的方法給搞定了, 很欣慰. http://www.cnblogs.com/lurenq/p/6189580.html iOS 10 跳轉系統設置的欄位 電池電量 Prefs:root=BATTERY_USAGE 通用設置 Prefs:root ...
  • 從今天開始研究開發自己的編程語言Ocelot,從《自製編譯器》出發,然後再自己不斷完善功能並優化。 編譯器前端簡單,就不深入研究了,直接用現成的一款工具叫JavaCC,它可以生成抽象語法樹,抽象語法樹是生成中間代碼的關鍵,而中間代碼又是生成後端代碼的關鍵。 整個編譯器代碼採用java語言編寫,主要功 ...
  • 本文用於收集在運維中經常使用的系統內置函數,持續整理中 一,常用Metadata函數 1,查看資料庫的ID和Name 2,查看對象的ID和Name,對象的Schema,對象的定義 3,查看Schema的ID和Name,通過對象ID獲取對象的架構名(Schema) 4,查看Column的Name 二, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...