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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...