1. 程式人生 > >MySQL基礎知識(1)

MySQL基礎知識(1)

			**

MySQL概述

**

1.什麼是資料庫     資料庫就是儲存資料的倉庫

2.都有那些公司在使用資料庫 電商公司,遊戲公司,金融機構,政府部門

3.提供資料庫服務的軟體 1.軟體分類 MySQL,Oracle,SQL-Server,DB2,MongoDB,MariaDB,… //fa 2.生產環境中,如何選擇使用哪一種資料庫軟體 1).是否開源 1.開源軟體:MySQL,MongoDB,MariaDB 2.商業軟體:Oracle,DB2,SQL-Server   2).是否跨平臺 1.不跨平臺:SQL-Server 2.跨平臺:… 3).公司型別 1.商業軟體:政府機構,金融機構     2.開源軟體:遊戲公司,電商公司,論壇和貼吧網站,…

4.MySQL資料庫特點 1.關係型資料庫 1)關係型資料庫的特點     1.資料以行和列(表格)形式儲存 2.表中每一行叫一條記錄,每一列叫一個欄位     3.表與表之間的邏輯關聯叫關係 2)例項: 1.關係型資料庫儲存資料: 表1 學生資訊表 姓名 年齡 班級 星矢 25 三班 水冰月 25 六班 /f 表2 班級資訊表 班級 班主任 三班  大空翼   六班 松仁 /f 3).非關係型資料庫儲存資料 {“姓名”:“星矢”, “年齡”:“25”, “班級”:“三班”, “班主任”:“大空翼”} {“姓名”:“水冰月”, “年齡”:“25”, “班級”:“六班”, “班主任”:“松仁”} /f 2.跨平臺 可以在Windows,Linux,Unix上執行 /f 3.支援多種程式語言 Python,Java,PHP,…

5.資料庫軟體,資料庫,資料倉庫的概念 1.資料庫(database,簡寫:DB,db) 儲存在計算機內的有組織,可共享的資料集合 2.資料庫軟體(資料庫管理系統) 一個軟體,看得見,可操作的工具,可以通過SQL語句操作資料庫(SQL:結構化查詢語句) 3.資料倉庫(Data WareHouse, 簡寫:DW,DWH) 資料量要比資料庫大的多,主要用於資料分析和資料探勘 et:   資料庫:購物車表,使用者資訊表   資料倉庫:分析哪個時間段使用者的訪問量最大,哪個使用者一年中購物最多

--------------------------------------------------- /f MySQL安裝

1.Ubuntu安裝MySQL服務(命令列安裝方式) 1.安裝服務端 sudo apt-get install mysql-server 2.安裝客戶端 sudo apt-get install mysql-client 3.Ubuntu安裝軟體 1).sudo apt-get update 訪問源列表中的每個網址,讀取軟體列表,儲存到本地/var/lib/apt/lists 2).sudo apt-get upgrade   把本地已安裝軟體與剛下載的軟體列表進行比對,如果發現已安裝軟體的版本低,則   更新軟體 3).sudo apt-get -f install  表示修復依賴關係

2.Windows安裝MySQL 1.下載安裝包 mysql-installer***5.7.24.msi 2.按照安裝教程安裝

3.Mac 安裝MySQL 1.下載安裝包(dmg --> pkg) 2.設定環境變數 1). vi.base_profile 2). 在末尾寫入如下內容,儲存並退出 export PATH=PATH:/user/local/mysql/binPATH={PATH}:/user/local/mysql/bin 或者 PATH={PATH}:/user/local/mysql/bin 3.在命令列下執行:$source.base_profile 4.登入測試 mysql -uroot - p

4.啟動和連線資料庫 1.啟動服務端(終端下) 1).檢視MySQL狀態 sudo /etc/init.d/mysql status 2).啟動MySQL服務 sudo /etc/init.d/mysql start |stop|restart 2.客戶端連線 1)命令格式: mysql -h主機地址 -u使用者名稱 -p密碼 et: mysql -hlocalhost -uroot -p123456 2)本地連線可以省略-h選項 mysql -uroot -p123456

5.基本SQL命令 1.SQL命令的使用規則 1).SQL命令不區分大小寫,但是區分中英文的標點符合,yi律使用 英文標點符號"":空格 2).每條命令以;結尾 3).使用\c終止當前命令的執行 /f 2.庫的管理 1)庫的基本操作     1.檢視已有庫 show databases; 2.建立庫 create database 庫名; 建立的同時指定字符集 create database 庫名 character set utf-8; 3.檢視建立庫的語句(字符集) show create database 庫名;     4.檢視當前所在庫 select database(); 5.切換/選擇庫 use 庫名; 6.檢視當前庫中所有的表 show tables; 7.刪除庫 drop database 庫名; /f 2)庫名的命名規則 1.庫名由數字,字母,下劃線組成,不能使用純數字    2.庫名區分大小寫,SQL命令不區分大小寫 et: 1.SQL命令不區分大小寫 CREATE DATABASE TESTDB; 等價於 create database TESTDB; /f 2.庫名區分大小寫 create database TESTDB; create database testdb; 以上是分別建立了兩個庫:TESTDB, testdb /f     3.不能使用特殊字元和MySQL的關鍵字 /** 3.表記錄管理** 1).表的管理 1. 表的基本操作 1. 建立表 create table 表名(欄位名 資料型別,欄位2 資料型別,…); 建立的同時制定字符集 create table 表名(欄位1 資料型別,欄位2 資料型別,…)character set utf8; 2. 檢視已有表的字符集 show create table 表名; 3. 查看錶結構 desc 表名; 4. 刪除表 drop table 表名; /f 注意 : 1. 如果涉及多個庫切換操作表,一定不要忘了切換資料庫 2. 所有的資料在資料庫中都是以檔案的形式儲存的,存放目錄為: /var/lib/mysql /f 2).表記錄管理(操作資料) 1.插入資料(insert) 1.insert into 表名 values(值1),values(值2),…; 注意:()括號中的值實際代表的是一行,一條記錄,不能分開寫 例:insert into stuinfo values(1,‘劉備’,2000),(2,‘關羽’,1998); 2.insert into 表名(欄位1,欄位2,…) values(值1),(值2),…; et: insert into stuinfo(name,age) values(‘張飛’,1996),(‘呂布’,2002); /f 2.查詢資料(select) 1.select * from 表名; //查詢所有資料 2.select * from 表名 where 條件 //查詢表中滿足條件的資料 3.select 欄位1,欄位2,… from 表名 [where 條件];   //注意:[]裡內容可選擇省略 /f 4.更改預設字符集 1).方法:修改mysql的配置檔案   2).步驟: 1.獲取root許可權 sudo -i //回到終端執行,不能在mysql中執行 2.cd /etc/mysql/mysql.conf.d/ 3.備份(相當重要) cp mysqld.cnf mysqld.cnf.bak //.bak表示備份 4.修改: //使用sublime修改 subl mysqld.cnf   找到中括號[mysqld] 新增 character_set_server = utf8 /f //使用vi修改命令 vi mysqld.cnf 找到中括號[mysqld] 新增 character_set_server = utf8 5.重啟mysql服務 sudo /etc/init.d/mysql restart //sudo可省略     6.連線客戶端 mysql -uroot -p123456 7.MAC電腦 檔案路徑 /etc/my.cnf [mysqld] 新增 character_set_server = utf8

6.資料型別 1.數值型別 1)整型 1.int 大整型(4個位元組) 取值範圍:0 ~ 2(32)-1 2.tinyint 微小整型(1個位元組) 1.有符號整型(預設) 取值範圍:-128 ~ 127 id tinyint signed 2.無符號整型(unsigned) 取值範圍:0 ~ 255 age tinyint unsigned 3.smallint 小整型(2位元組) 4.bigint 極大整型(8個位元組) /f 2)浮點型 1.float (4個位元組,最多顯示7個有效位) //單精度(精度即準確度) 1.用法 欄位名 float(m,n) m表示總位數,n表示小數位的位數 et: score float(3,1) 2.double(8個位元組) //雙精度 誤差稍小,在mysql內部運算時,都採用double雙精度運算 /f 3.dicimal(最多可顯示28個有效位) 用法:(和double一樣)     decimal(m,n) m表示總位數,n表示小數位的位數 /f 注意:1.浮點型,插入整數時,小數位會自動補0; 2.小數位如果多於指定位,會自動對指定位的下一位四捨五入       3. /f 3)數值型別佔用的儲存空間 整數和小數分開儲存的,需要各自計算所需的位元組數 規則: 將9的倍數包裝成4個位元組 餘數佔用位元組對照表 餘數 位元組 0 0 1~2 1 3~4 2 5~6 3 7~8 4 et: decimal(19,9) 計算儲存空間: 整數位數 除以 9, 商都佔用4個位元組 餘數,根據對照表判斷佔用幾個位元組 10 / 9 商 1 餘數 1 佔用位元組數: 4 + 1 = 5個位元組 小數位數 除以9 9 / 9 商 1 餘數 0 佔用位元組數:4 + 0 = 4個位元組 /f 2.字元型別 1)char(m) m指定最大顯示寬度,同時也指定最大字元個數 取值範圍1 ~ 255 特點: 定長儲存 例:char(10) 固定分配10個字元的空間儲存資料 2)varchar(m) m指定最大顯示寬度,同時也指定最大字元個數 取值範圍1 ~ 65535 特點: 變長儲存 例:varchar(10) 根據資料的實際長度分配空間,小於10個字元,按照實際的字元數分配空間, 最大可分配10個字元的空間,超過10個字元,無法儲存,會報錯 3)text / longtext(4G) / blob / longblob(4G) text相關的型別可以用來儲存大批量的文字資料(博文等) blob相關的型別是用於二進位制資料的儲存(圖片等)    注意: 1.定長和變長字元型別在儲存空間上區別較大 char 定長儲存:浪費儲存空間,效能高 varchar 變長儲存:節省儲存空間,效能較低     2.字元型別的顯示寬度與數值型別寬度的區別: et: int(11) char(10) 1,數值型別的寬度為顯示寬度,用於select查詢是顯示結果,和佔用儲存空間無關 即使超出顯示寬度,只要沒有超出當前資料型別的取值範圍,都可以插入成功 2.字元型別的寬度不僅是顯示寬度,還是最大字元個數,超出就無法儲存 3.數值型別如果指定顯示寬度,而資料長度小於寬度,會自動補0,填充顯示寬度 結合zerofill屬性檢視效果 id int(5) zerofill; /f 區別:定長儲存,會直接分配固定的儲存空間;     變長儲存,會根據實際的字元數,分配儲存空間 /f 3.列舉和集合型別 1).列舉 enum,是一個字串物件,可以將一些不重複的字串儲存成一個預定義的集合; 欄位值必須從這個集合中選取,才是合法值.最多可以列舉65535個值,列舉經常用來 實現單選: et: create table userinfo(id int,name char(10),sex enum(‘男’,‘女’,‘保密’)); 特點:   列舉集合中的資料,從左到右會自動分配索引,從1開始,查詢資料時,可以   根據字串值進行查詢,也可以根據索引值查詢 et: select * from userinfo where sex=‘男’; 等價於: select * from userinfo where sex=1; /f 2).集合 集合是一種特殊的列舉型別,可以指定一個選項列表,但是欄位值可以取範圍內的多個   值。可以實現多選。型別名使用set表示     et: create table couseTab(sportcouse set(‘籃球’,‘足球’,‘乒乓求’,‘星際爭霸’));

/f 4.日期和時間型別 1).date:“YYYY-MM-DD” 2).time:“hh:mm:ss” 3).datetime:“YYYY-MM-DD hh:mm:ss” 4).timestamp:“YYYY-MM-DD hh:mm:ss” 注意:     1.datetime:給NULL,預設返回NULL 2.timestamp:給NULL,預設返回系統當前時間 3.日期格式: “2000/11/11 10:10:10” “20181111111111” /f 5.日期時間函式 1).now()返回當前系統時間 2).curdate()返回當前日期(年月日) 3).curtime()返回當前時間(時分秒) 4).year(date)返回指定日期的年份 5).date(date)返回指定日期的年月日 6).time(date)返回指定日期的時分秒 練習: 1.往表中插入3條資料 2.查詢2018-10-10有那些使用者充值了? 3.查詢2018年11月的充值資訊 4.查詢2018年8月30日10:00-12:00的充值資訊 /f 6.日期時間運算 1)語法格式 select * from 表名 where 欄位名 運算子 (時間-interval 時間單位) 時間單位: et: 1 day | 1 hour | 1 minute | 1 year | 1 month 練習: 1.查詢1天內的充值記錄 2.查詢1年前的充值記錄 3.查詢1天以前,3天以內的充值記錄 /f 3)表示未來的時間節點 et: 從當前系統時間向後推算一年,明年now()-interval -1 year

一.表結構操作(操作欄位)     1.語法:alter table 表名 執行動作; 2.新增欄位(add) //直接在最後一列的位置新增新的欄位 alter table 表名 add 欄位名 資料型別;     //在第一列的位置新增新的欄位 alter table 表名 add 欄位名 資料型別 first; //在指定欄位的後面新增新的欄位 alter table 表名 add 欄位名 資料型別 after 指定欄位名; 3.刪除欄位(drop) alter table 表名 drop 欄位名; 4.修改資料型別(modify) alter table 表名 modify 欄位 新資料型別; 5.表的重新命名(rename) alter table 表名 rename 新表名; 練習: 1.建立庫 studb; 2.在庫中建立表t1,欄位:name char(10),age tinyint unsigned,phnumber char(11); 3.查看錶結構 4.在表中第一列的位置插入一個id欄位 5.修改phnumber的資料型別為int 6.在最後一列的位置插入address欄位 7.刪除age欄位 8.查看錶結構 9,把表名修改為tab1;

二.表記錄管理 1.插入資料 insert into 表名 values(),(),…; 2.查詢資料 select * from 表名 where 條件; 3.刪除資料 1.delete from 表名 where 條件; 2.如果省略where條件, delete from 表名; 表示清空所有記錄 4.更新資料 1.update 表名 set 欄位1=值,欄位2=值,…where 條件; 2.update 必須寫where條件

三.運算子 1.數值比較/字元比較 1.數值比較: = != > >= < <= 2.字元比較: = != 3.練習:   1.查詢攻擊力超過150的英雄的名字和攻擊值      2.將趙雲的攻擊值設定為360,防禦值設定為450 /f 2.邏輯運算子 1. 條件1 and 條件2; //(查詢同時滿足兩個條件的資料) 2. 條件1 or 條件2; //(查詢滿足條件1或滿足條件2的資料) 練習:   1.找出攻擊值高於200的蜀國英雄的名字和攻擊力   2.將吳國英雄攻擊值為110對應的英雄,改為攻擊力100,防禦值60   3.查詢蜀國和魏國的英雄資訊 /f 3.範圍內比較 1.between 值1 and 值2 //設定範圍在值1和值2之間 2.where 欄位名 in(值1,值2,值3,…) //匹配欄位值在in給出的範圍內的資料 et: where age in(22,23,24,25); 3.where 欄位名 not in(值1,值2,值3,…) //匹配欄位值不在指定範圍內的資料 練習:   1.查詢攻擊值在100~200之間的蜀國英雄資訊   2.查詢蜀國和吳國以外的國家中,女英雄的資訊   3.查詢id=1,3,5範圍內的蜀國英雄和貂蟬的資訊

4.匹配空,非空 1.匹配空:where 欄位 is null; 2.匹配非空:where 欄位 is not null; 注意: 1.is null和is not null 主要用來匹配欄位值等於NULL的資料 2.空字串可以直接使用 =

  1. List item

來匹配     et: where name=’’; where name is null; /f 5.模糊查詢 1.格式:where 欄位名 like 表示式 2.表示式: 1). _ :表示匹配一個字元 2). % :表示匹配0到多個字元 3.示例:   1.查詢姓名包含2個字元(含2個字元)以上的資料 select * from sanguo where name like ‘%’; 2.匹配所有資料 select name from sanguo where name like ‘%’; 注意:     NULL值不會被匹配出來   空字串表示0個字元,會被正常匹配   3.匹配姓名為3個字元的資料 where name like ‘’;  4.匹配姓趙的資料 where name like '趙%’; et: select name from sanguo where name like '趙%’; 更改查詢結果中的顯示欄位 select name as n from sanguo where name like '趙%’;

四.SQL查詢 1.完整的查詢語句由以下關鍵字組成 順序為書寫順序,序號是mysql執行順序: 3.select 1.where //條件 2.group by //分組,可以對查詢結果分組 4.having //判斷having 5.order by //查詢結果按照一定順序顯示 6.limit //分頁查詢 2.order by:對查詢結果進行排序 1.格式:…order by 欄位名 ASC(升許)/DESC(降序) 2.示例: 1).將英雄按照防禦值從高到低排列 select * from sanguo order by fangyu DESC;     2).將蜀國英雄按照攻擊值從高到低降序排列 select * from sanguo where country=‘蜀國’ order by gongji DESC;     3).將魏國和蜀國英雄中名字為3個字的,按防禦值升序排列 select * from sanguo where country=‘魏國’ or country=‘蜀國’ and name like ‘___’ order by fangyu ASC; 3.limit分頁查詢 永遠放在SQL語句的最後書寫 分頁用來控制顯示多少條結果中的資料 1.語法: 1).limit n; 表示顯示n條資料 2).limit m,n; 表示從第m+1條記錄開始顯示n條資料 et: limit 2,3; //顯示第3,4,5三條資料     3).示例: 1.查詢蜀國英雄中,防禦值倒數第2名至倒數第4名的英雄記錄 select * from sanguo where country=‘蜀國’ order by fangyu ASC limit 1,3; 2.查詢蜀國英雄中,攻擊值前3名且名字不為NULL的英雄資訊 select * from sanguo where country=‘蜀國’ and name is not null order by gongji DESC limit 0,3; 3.如果想要顯示查詢結果中第20到25條資料 limit 19,6; 4.select查詢 select * select 欄位 select 聚合函式 where …   //條件可省略 1.聚合函式 最大值 最小值 求和 平均值 計數

練習: 1. 建立庫studb,指定字符集為utf8 create database studb character set utf8; 2. 進入studb庫中 use studb; 3. 檢視當前所在庫 select database(); 4. 建立庫studb2,指定字符集為latin1 create database studb2 character set latin1; 5. 進入studb2中 use studb2; 6. 檢視當前庫的字符集 show create database studb2; 7. 刪除建立好的兩個庫 drop database studb; drop database studb2;

練習2: 1.建立庫studb create database sudb character set utf8; 2.在庫中建立stuinfo表,指定字符集為utf8,指定欄位id name age; 3.檢視建立表stuinfo的語句 4.查看錶結構 5.在庫中建立score表, 6.刪除表,刪除庫 注意:1.如果涉及到多個庫切換操作表,一定不要忘了切換資料庫      2.所有的資料在資料庫中都是以檔案的形式儲存的,存放目錄為:/var/lib/mysql

練習3: 1. 建立庫studb2 create database studb2; 2. 在庫中建立表stuinfo,要求 : id 大整型 name 字元型,寬度是15 age 微小整型,不能為負數 height 浮點型,小數位為2位(float(5,2)) money 浮點型,小數位為2位(decimal(5,2)) et : use studb2; create table stuinfo(id int,name char(15),age tinyint unsigned,height float(5,2),money decimal(5,2)); /f 3. 查看錶結構 desc stuinfo; 4. 查看錶的字符集 show create table stuinfo; 5. 插入1條完整記錄,在表中id,name兩個欄位中插入兩條記錄 insert into stuinfo values(1, ‘Jack’,10,121.34,100.23); insert into stuinfo(id,name) values(2,‘Rose’),(3,‘liming’); 6. 查詢所有記錄 select * from stuinfo; 7. 查詢所有學生的id和姓名 select id,name from stuinfo;