數(shù)據(jù)庫的相關(guān)概念
數(shù)據(jù)庫的好處
????1睛驳、持久化數(shù)據(jù)到本地
????2凰浮、可以實(shí)現(xiàn)結(jié)構(gòu)化查詢,方便管理
數(shù)據(jù)庫的常見概念??☆
????1拙已、DB:數(shù)據(jù)庫决记,保存一組有組織的數(shù)據(jù)的容器
????2、DBMS:數(shù)據(jù)庫管理系統(tǒng)倍踪,又稱為數(shù)據(jù)庫軟件(產(chǎn)品)系宫,用于管理DB中的數(shù)據(jù)
????3、SQL:結(jié)構(gòu)化查詢語言惭适,用于和DBMS通信的語言
數(shù)據(jù)庫存儲的特點(diǎn)
????1、將數(shù)據(jù)放到表中楼镐,表再放到庫中
????2癞志、一個數(shù)據(jù)庫中可以有多個表,每個表都有一個名字框产,用來標(biāo)識自己凄杯,表具有唯一性错洁。
????3、表具有一些特征戒突,這些特性定義了數(shù)據(jù)在表中如何存儲屯碴,類似java中“類”的設(shè)計。
????4膊存、表由列組成导而,我們也稱為字段。所有表都是由一個或多個列組成的隔崎,每一列類似java中的屬性今艺。
????5熬北、表中的數(shù)據(jù)是按行執(zhí)行存儲的孙咪,每一行類似于java中的“對象”毙籽。
常見的數(shù)據(jù)庫管理系統(tǒng)
????mysql紧卒、oracle畏妖、db2戴陡、sqlserver...
#MySQL的介紹
##一贱傀、MySQL的背景
????前身屬于瑞典的一家公司 MySQL AB
????06年被sun公司收購
????09年sun被oracle收購
MySQL的介紹?
MySQL的背景
????前身屬于瑞典的一家公司 MySQL AB
????06年被sun公司收購
????09年sun被oracle收購
MySQL的優(yōu)點(diǎn)
????1荞雏、開源轴合、免費(fèi)创坞、成本低
????2、性能高值桩、移植性好
????3摆霉、體積小、便于安裝
MySQL產(chǎn)品的安裝
????屬于c/s架構(gòu)的軟件奔坟,一般來講安裝服務(wù)端
????企業(yè)版
????社區(qū)版
MySQL服務(wù)的啟動和停止
????方式一:計算機(jī)--右鍵管理--服務(wù)
????方式二:通過管理員身份運(yùn)行
????net start 服務(wù)名(啟動服務(wù))(MySQL55)
????net stop 服務(wù)名(停止服務(wù))(MySQL55)
MySQL服務(wù)的登錄與退出
????方式一:通過MySQL自帶的客戶端
????只限于root用戶
????方式二:通過windows自帶的客戶端
????登錄:
????mysql 【-h主機(jī)名(localhost) -P端口號(3306)】 -u用戶名(root) -p密碼(admin)
????eg:mysql -h localhost -P3306 -u root -padmin
????????mysql -u root -padmin
????退出:
????exit或者Ctrl+C
MySQL的常見命令
????1携栋、查看當(dāng)前所有的數(shù)據(jù)庫
????show databases;
????2、打開指定的庫
????use 庫名;
????3咳秉、查看當(dāng)前庫的所有表
????show tables;
????4婉支、查看其他庫的所有表
????show tables from 庫名;
????5、創(chuàng)建表
????create table 表名(
????????列名 列類型,(如:name varchar<20>,)
????????列名 列類型澜建,
????????...
????);
????6向挖、查看表結(jié)構(gòu)
????desc 表名;
????7、查看服務(wù)器的版本
????方式一:登錄到mysql服務(wù)端
????select version();
????方式二:沒有登錄到mysql服務(wù)端
????mysql --version
????或
????mysql --V
MySQL的語法規(guī)范
????1炕舵、不區(qū)分大小寫何之,建議關(guān)鍵字大寫,表名列名小寫
????2咽筋、每條命令最好用分號結(jié)尾(還有一種\g)
????3溶推、每條命令可以根據(jù)需要,可以進(jìn)行縮進(jìn)或換行
????4、注釋
????????單行注釋:#注釋文字
????????單行注釋:-- 注釋文字(注意:注釋文字前有一個空格)
????????多行注釋:/*注釋文字*/
DQL語言
????DQL(Data Query Language) 數(shù)據(jù)查詢語言
基礎(chǔ)查詢
語法
????select 查詢列表
????from 表名;
二蒜危、特點(diǎn)
????1虱痕、查詢列表可以使字段、常量辐赞、表達(dá)式部翘、函數(shù)、也可以是多個
????2响委、查詢結(jié)果是一個虛擬表
三新思、實(shí)例
????1、查詢某個字段
????select 字段名 from 表名;
????2晃酒、查詢多個字段
????select 字段名,字段名 from 表名;
????3表牢、查詢所有字段
????select * from 表名
????4、查詢常量
????select 常量值:
????注意:字符型和日期型的常量值必須用單引號引起來贝次,數(shù)值型不需要
????5崔兴、查詢函數(shù)
????select函數(shù)名(實(shí)參列表);
????6、查詢表達(dá)式
????select 100/125;
????7蛔翅、起別名
????①as
????②空格
????8敲茄、去重
????select distinct 字段名 from 表名;
????9、+
????作用:做加法運(yùn)算
????select 數(shù)值+數(shù)值; 直接運(yùn)算
????select 字符+數(shù)值; 先試圖將字符轉(zhuǎn)換成數(shù)值山析,如果轉(zhuǎn)換成功堰燎,則繼續(xù)運(yùn)算,否則轉(zhuǎn)換成0笋轨,在做運(yùn)算
????select null+值; 結(jié)果為null
????10秆剪、【補(bǔ)充】contact函數(shù)
????功能:拼接字符
????select concat(字符1,字符2,...);
????11、【補(bǔ)充】ifnull函數(shù)
????功能:判斷某字段或表達(dá)式是否為null爵政,如果為null仅讽,返回給定的值,否則返回原本的值
????select ifnull(commission_pct,0) from employees;
????12钾挟、【補(bǔ)充】isnull函數(shù)
????功能:判斷某字段或表達(dá)式是否為null洁灵,如果是,則返回1掺出,否則返回0
????select isnull(commission_pct,0) from employees;
條件查詢
語法
????select 查詢列表
????from 表名
????where 篩選條件;
篩選條件的分類
????1徽千、簡單運(yùn)算符
????> < = <> != >= <= <=>安全等于
????2、邏輯運(yùn)算符
????&& and
????|| of
????!??not
????3汤锨、模糊查詢
????like:一般搭通配符使用双抽,用于判斷字符型或數(shù)值型
????通配符:%任意多個字符,_任意單個字符闲礼。
????between and
????in
????is null / is not null:用于判斷null值
????is null 和 <=> 的 PK
????is null:僅可以判斷null值牍汹,可讀性較高琅翻,建議使用
<=>: 既可以判斷null值,又可以判斷數(shù)值柑贞,可讀性較低
排序查詢
語法
????select 查詢列表
????from 表
????where 篩選條件
????order by 排序列表 【asc|desc】
特點(diǎn)
????1、asc :升序聂抢,如果不寫默認(rèn)升序
???????desc:降序
????2钧嘶、排序列表 支持 單個字段、多個字段琳疏、函數(shù)有决、表達(dá)式、別名
????????# 例子, 根據(jù)年薪進(jìn)行排序
????????SELECT
????????????*, (salary * (1 + ifnull( commission_pct, 0))??* 12) as year_salary
????????FROM
????????????employees?
????????ORDER BY
????????????year_salary DESC;
????????# 按照員工的姓名的長度進(jìn)行排序
????????select?
????????????*, concat(first_name, ' ', last_name) as 'name'
????????from?
????????????employees
????????order by
????????????length(name) desc;
????3空盼、order by的位置一般放在查詢語句的最后(除limit語句之外)
常見函數(shù)
概述
????功能:類似于java中的方法
????好處:提高重用性和隱藏實(shí)現(xiàn)細(xì)節(jié)
????調(diào)用:select 函數(shù)名(實(shí)參列表),和程序中的函數(shù)使用方法類似.
單行函數(shù)
1书幕、字符函數(shù)
????concat:連接
????substr:截取子串
????????# sql中的索引都是從1開始的
????????# 只有一個參數(shù)表示從指定索引往后截取剩下的.
????????select substr('中國人民站起來了', 4) as out_put;
????????# 兩個參數(shù)時, 第一個參數(shù)是起始索引位置, 第二個參數(shù)是截取的長度
????????select substr('中國人民站起來了', 2, 3) as out_put;?
????upper:變大寫
????lower:變小寫
????replace:替換??全部替換
????????select replace('aaaabbbbcccc', 'b', 'x');??--> aaaaxxxxcccc
????length:獲取字節(jié)長度, 需要根據(jù)編碼類型來看
????????select length('漢字123')??--> 9
????trim:去前后空格
????????# 去除前后指定的字符, 默認(rèn)是去除空格
????????select trim('a' from 'aaaa中國aaa人aaaaa');??---> 中國aaa人
????lpad:用指定字符左填充
????????select lpad('ab', 5, 'x');??--> xxxab
????rpad:用指定字符右填充
????????select rpad('abcde', 3, 'x');??--> abc???相當(dāng)于被截取了
????instr:獲取子串第一次出現(xiàn)的索引, 不存在則返回0, 索引位置從1開始
2、數(shù)學(xué)函數(shù)
????ceil:向上取整
????round:四舍五入
????mod:取模
????????# mod的算法: a % b = a - a / b * b 除是整除
????????select mod(-10, -3); --> -1
????????select mod(-10, 3);??--> -1
????floor:向下取整
????truncate:截斷??truncate(1.652656,1);=======>1.6
????rand:獲取隨機(jī)數(shù)揽趾,返回0-1之間的小數(shù)
3台汇、日期函數(shù)
????now:返回當(dāng)前日期+時間
????year:返回年
????month:返回月
????day:返回日
????date_format:將日期轉(zhuǎn)換成字符
????curdate:返回當(dāng)前日期
????str_to_date:將字符轉(zhuǎn)換成日期
????curtime:返回當(dāng)前時間
????hour:小時
????minute:分鐘
????second:秒
????datediff:返回兩個日期相差的天數(shù)
????monthname:以英文形式返回月
4、其他函數(shù)
????version 當(dāng)前數(shù)據(jù)庫服務(wù)器的版本
????database 當(dāng)前打開的數(shù)據(jù)庫
????user當(dāng)前用戶
????password('字符'):返回該字符的密碼形式
????md5('字符'):返回該字符的md5加密形式
5篱瞎、流程控制函數(shù)
????1苟呐、if(條件表達(dá)式,表達(dá)式1俐筋,表達(dá)式2):如果條件表達(dá)式成立牵素,返回表達(dá)式1,否則返回表達(dá)式2
????2澄者、 case 情況1
????case 變量或表達(dá)式或字段
????when 常量1 then 值1
????when 常量2 then 值2
????...
????else 值n
????end
????????# 例子
????????/*
????????部門id是30, 工資1.1
????????部門id是40, 工資1.2
????????部門id是50, 工資1.3
????????否則, 不變??
????????*/
????????SELECT
????????????salary AS 原始工資,
????????????department_id,
????????CASE
????????????department_id?
????????????WHEN 30 THEN
????????????salary * 1.1?
????????????WHEN 40 THEN
????????????salary * 1.2?
????????????WHEN 50 THEN
????????????salary * 1.3 ELSE salary?
????????????END AS 新工資?
????????FROM
????????????employees;
????3笆呆、 case 情況2
????case?
????when 條件1 then 值1
????when 條件2 then 值2
????...
????else 值n
????end
????# 例子
????????/*
????????工資> 20000 a級別
????????工資> 15000 a級別
????????工資> 10000 a級別
????????否則, d
????????*/??
????????select?
????????????salary as '工資',
????????case
????????????when salary > 20000 then 'A'
????????????when salary > 15000 then 'B'
????????????when salary > 10000 then 'C'
????????????else 'D'
????????????end as '工資級別'
????????from?
????????????employees;
分組函數(shù)
1、分類
????max 最大值
????min 最小值
????sum 和
????avg 平均值
????count 計算個數(shù)
2粱挡、特點(diǎn)
????1赠幕、 語法
????select max(字段) from 表名;
????2、支持的類型
????sum和avg一般用于處理數(shù)值型
????max抱怔、min劣坊、count可以處理任何數(shù)據(jù)類型
????3、以上分組函數(shù)都忽略null
????4屈留、都可以搭配distinct使用局冰,實(shí)現(xiàn)去重的統(tǒng)計
????select sum(distinct 字段) from 表;
????5、count函數(shù)
????count(字段):統(tǒng)計該字段非空值的個數(shù)
????count(*):統(tǒng)計結(jié)果集的行數(shù)
????案例:查詢每個部門的員工個數(shù)
????1 xx????10
????2 dd????20
????3 mm????20
????4 aa????40
????5 hh????40
????count(1):統(tǒng)計結(jié)果集的行數(shù)
????效率上:
????MyISAM存儲引擎灌危,count(*)最高
????InnoDB存儲引擎康二,count(*)和count(1)效率>count(字段)
????6、和分組函數(shù)一同查詢的字段勇蝙,要求是group by后出現(xiàn)的字段
分組查詢
語法
????select 分組函數(shù)沫勿,分組后的字段?????⑤
????from 表???????????????????????????①
????【where 篩選條件】????????????????②
????group by 分組的字段???????????????③
????【having 分組后的篩選】???????????④
????【order by 排序列表】?????????????⑥
特點(diǎn)
???????????????????????????使用關(guān)鍵字???篩選的表???????????????????位置
????分組前篩選???????where??????????原始表????????????????????group by的前面
????分組后篩選???????having?????????分組后的結(jié)果???????????group by 的后面
分組類型
????1.?通用分組, 按單個字段分組
????# 查詢領(lǐng)導(dǎo)編號>102的每個領(lǐng)導(dǎo)手下的最低工資>5000的領(lǐng)導(dǎo)編號是哪個,以及最低工資
????select?
????????manager_id,
????????min(salary) as min_salary
????from?
????????employees
????where?
????????manager_id > 102
????group by?
????????manager_id
????having?
????????min_salary > 5000;
????2.?group by 支持使用函數(shù)的結(jié)果來進(jìn)行分組
????# having和group by 都支持使用別名來進(jìn)行分組和篩選
????# 按員工的名的長度分組, 查詢每一組的員工個數(shù), 并且員工個數(shù)>5的有哪些.
????select?
????????length(last_name) as length_name,
????????count(*) as count_num
????from?
????????employees
????group by
????????length_name
????having?
????????count_num > 5;
????3.?支持多個字段進(jìn)行分組
????# 查詢每個部門每個工種的員工的平均工資, 并按工資排序
????# 這種類似于聯(lián)合主鍵一樣, 部門id和工種一樣的才算是一組
????select??
????????avg(salary),
????????department_id,
????????job_id
????from?
????????employees
????group by
????????department_id, job_id
????having?
????????avg(salary) > 10000
????order by
????????avg(salary);
連接查詢
含義
????當(dāng)查詢中涉及到了多個表的字段产雹,需要使用多表連接
????select 字段1诫惭,字段2
????from 表1,表2,...;
????笛卡爾乘積:當(dāng)查詢多個表時蔓挖,沒有添加有效的連接條件夕土,導(dǎo)致多個表所有行實(shí)現(xiàn)完全連接
????如何解決:添加有效的連接條件
分類
????按年代分類:
????sql92:
????????等值??
????????非等值
????????自連接
????????也支持一部分外連接(用于oracle、sqlserver瘟判,mysql不支持)
????sql99【推薦使用】
????內(nèi)連接
????????等值
????????非等值
????????自連接?????
????外連接
????????左外
????????右外
????????全外(mysql不支持)
????交叉連接
SQL92語法
????1怨绣、等值連接
????語法:
????????select 查詢列表
????????from 表1 別名,表2 別名
????????where 表1.key=表2.key
????????【and 篩選條件】
????????【group by 分組字段】
????????【having 分組后的篩選】
????????【order by 排序字段】
????特點(diǎn):
????????① 一般為表起別名
????????②多表的順序可以調(diào)換
????????③n表連接至少需要n-1個連接條件
????????④等值連接的結(jié)果是多表的交集部分
????2、非等值連接
????語法:
????????select 查詢列表
????????from 表1 別名,表2 別名
????????where 非等值的連接條件
????????【and 篩選條件】
????????【group by 分組字段】
????????【having 分組后的篩選】
????????【order by 排序字段】
????3拷获、自連接
????語法:
????????select 查詢列表
????????from 表 別名1,表 別名2
????????where 等值的連接條件
????????【and 篩選條件】
????????【group by 分組字段】
????????【having 分組后的篩選】
????????【order by 排序字段】
SQL99語法
????1篮撑、內(nèi)連接
????語法:
????select 查詢列表
????from 表1 別名
????【inner】 join 表2 別名 on 連接條件
????where 篩選條件
????group by 分組列表
????having 分組后的篩選
????order by 排序列表
????limit 子句;
????特點(diǎn):
????①表的順序可以調(diào)換
????②內(nèi)連接的結(jié)果=多表的交集
????③n表連接至少需要n-1個連接條件
????分類:
????等值連接
????非等值連接
????自連接
????2、外連接
????語法:
????select 查詢列表
????from 表1 別名
????left|right|full【outer】 join 表2 別名 on 連接條件
????where 篩選條件
????group by 分組列表
????having 分組后的篩選
????order by 排序列表
????limit 子句;
????特點(diǎn):
????①查詢的結(jié)果=主表中所有的行匆瓜,如果從表和它匹配的將顯示匹配行赢笨,如果從表沒有匹配的則顯示null
????②left join 左邊的就是主表,right join 右邊的就是主表
??????full join 兩邊都是主表
????③一般用于查詢除了交集部分的剩余的不匹配的行
????3驮吱、交叉連接
????語法:
????select 查詢列表
????from 表1 別名
????cross join 表2 別名;
????特點(diǎn):
????類似于笛卡爾乘積
子查詢
含義
????嵌套在其他語句內(nèi)部的select語句稱為子查詢或內(nèi)查詢质欲,
????外面的語句可以是insert、update糠馆、delete嘶伟、select等,一般select作為外面語句較多
????外面如果為select語句又碌,則此語句稱為外查詢或主查詢
分類
1九昧、按出現(xiàn)位置
????select后面:
????????????僅僅支持標(biāo)量子查詢
????from后面:
????????????表子查詢
????where或having后面:★★
????????????標(biāo)量子查詢??★
????????????列子查詢????★
????????????行子查詢
????exists后面:
????????????標(biāo)量子查詢
????????????列子查詢
????????????行子查詢
????????????表子查詢
2、按結(jié)果集的行列
????標(biāo)量子查詢(單行子查詢):結(jié)果集為一行一列
????列子查詢(多行子查詢):結(jié)果集為多行一列
????行子查詢:結(jié)果集為一行多列
????表子查詢:結(jié)果集為多行多列
示例
????where或having后面
????1毕匀、標(biāo)量子查詢
????案例:查詢最低工資的員工姓名和工資
????①最低工資
????select min(salary) from employees
????②查詢員工的姓名和工資铸鹰,要求工資=①
????select last_name,salary
????from employees
????where salary=(
????????select min(salary) from employees
????);
????2、列子查詢
????案例:查詢所有是領(lǐng)導(dǎo)的員工姓名
????①查詢所有員工的 manager_id
????select manager_id
????from employees
????②查詢姓名皂岔,employee_id屬于①列表的一個
????select last_name
????from employees
????where employee_id in(
????????select manager_id
????????from employees
????);
????# 查詢有員工表的部門名字, 相當(dāng)于拿著部門表的每條記錄去和員工表的記錄做篩選, 看是否存在值
????# exists本質(zhì)上是返回一個bool值類型的數(shù)據(jù)
????select department_name
????from departments as d
????where exists(
????????????select d.department_id from employees??as e
????????????where d.department_id = e.department_id
????)
分頁查詢
應(yīng)用場景
????當(dāng)要查詢的條目數(shù)太多蹋笼,一頁顯示不全
二、語法
????select 查詢列表
????from 表
????limit 【offset,】size;
????注意:
????offset代表的是起始的條目索引躁垛,默認(rèn)從0開始
????size代表的是顯示的條目數(shù)
????公式:
????假如要顯示的頁數(shù)為page剖毯,每一頁條目數(shù)為size
????from 表
????limit (page-1)*size,size;
????連接的總的順序語法:(這里存疑?)
????select 查詢列表?????⑦
????from 表1 別名???????①
????連接類型 join 表2???②
????on 連接條件?????????③
????where 篩選??????????④
????group by 分組列表???⑤
????having 篩選?????????⑥
????order by排序列表????⑧
????limit 起始條目索引,條目數(shù);??⑨
聯(lián)合查詢
一教馆、含義
????union:合并逊谋、聯(lián)合,將多次查詢結(jié)果合并成一個結(jié)果
二土铺、語法
????查詢語句1
????union 【all】
????查詢語句2
????union 【all】
????...
三胶滋、意義
????1板鬓、將一條比較復(fù)雜的查詢語句拆分成多條語句
????2、適用于查詢多個表的時候究恤,查詢的列基本是一致
四俭令、特點(diǎn)
????1、要求多條查詢語句的查詢列數(shù)必須一致
????2部宿、要求多條查詢語句的查詢的各列類型唤蔗、順序最好一致
????3、union 去重窟赏,union all包含重復(fù)項 即union默認(rèn)是去重的.
查詢總結(jié)
一、語法
????select 查詢列表?????⑦
????from 表1 別名???????①
????連接類型 join 表2???②
????on 連接條件?????????③
????where 篩選??????????④
????group by 分組列表???⑤
????having 篩選?????????⑥
????order by排序列表????⑧
????limit 起始條目索引箱季,條目數(shù);??⑨
DML語言
????DML(Data Manipulation Language)數(shù)據(jù)操縱語言
一涯穷、插入
一、方式一:
????語法:
????insert into 表名(字段名,...) values(值,...);
????特點(diǎn):
????1藏雏、要求值的類型和字段的類型要一致或兼容
????2拷况、字段的個數(shù)和順序不一定與原始表中的字段個數(shù)和順序一致
????但必須保證值和字段一一對應(yīng)
????3、假如表中有可以為null的字段掘殴,注意可以通過以下兩種方式插入null值
????①字段和值都省略
????②字段寫上赚瘦,值使用null
????4、字段和值的個數(shù)必須一致
????5奏寨、字段名可以省略起意,默認(rèn)所有列
方式二:
????語法:
????insert into 表名 set 字段=值,字段=值,...;
兩種方式的區(qū)別:
1.方式一支持一次插入多行,語法如下:
????insert into 表名【(字段名,..)】 values(值病瞳,..),(值揽咕,...),...;
2.方式一支持子查詢,語法如下:
????insert into 表名
????查詢語句;
二套菜、修改:
一亲善、修改單表的記錄★
????語法:update 表名 set 字段=值,字段=值 【where 篩選條件】;
二、修改多表的記錄【補(bǔ)充】
????語法:
????update 表1 別名?
????left|right|inner join 表2 別名?
????on 連接條件??
????set 字段=值,字段=值?
????where 篩選條件;
三逗柴、刪除:
方式一:使用delete
????一蛹头、刪除單表的記錄★
????語法:delete from 表名 【where 篩選條件】【limit 條目數(shù)】
????二、級聯(lián)刪除[補(bǔ)充]
????語法:
????delete 別名1,別名2 from 表1 別名?
????inner|left|right join 表2 別名?
????on 連接條件
?????【where 篩選條件】??
方式二:使用truncate
????語法:truncate table 表名
兩種方式的區(qū)別【面試題】
1.truncate刪除后戏溺,如果再插入渣蜗,標(biāo)識列從1開始
??????delete刪除后,如果再插入旷祸,標(biāo)識列從斷點(diǎn)開始
2.delete可以添加篩選條件
?????truncate不可以添加篩選條件
3.truncate效率較高
4.truncate沒有返回值
????delete可以返回受影響的行數(shù)
5.truncate不可以回滾
????delete可以回滾
DDL語言
????DDL(數(shù)據(jù)定義語言,Data Definition Language)
一袍睡、庫的管理
????一、創(chuàng)建庫
????create database 【if not exists】 庫名【 character set 字符集名】;
????二肋僧、修改庫
????alter database 庫名 character set 字符集名;
????三斑胜、刪除庫
????drop database 【if exists】 庫名;
二控淡、表的管理
????一、創(chuàng)建表 ★
????create table 【if not exists】 表名(
????????字段名 字段類型 【約束】,
????????字段名 字段類型 【約束】,
????????...
????????字段名 字段類型 【約束】?
????)
????二止潘、修改表
1.添加列
????alter table 表名 add column 列名 類型 【first|after 字段名】;
2.修改列的類型或約束
????alter table 表名 modify column 列名 新類型 【新約束】;
3.修改列名
????alter table 表名 change column 舊列名 新列名 類型;
????4 .刪除列
????alter table 表名 drop column 列名;
5.修改表名
????alter table 表名 rename 【to】 新表名;
????三掺炭、刪除表
????drop table【if exists】 表名;
????四、復(fù)制表
????1凭戴、復(fù)制表的結(jié)構(gòu)
????create table 表名 like 舊表;
????2涧狮、復(fù)制表的結(jié)構(gòu)+數(shù)據(jù)
????create table 表名?
????select 查詢列表 from 舊表【where 篩選】;
三、數(shù)據(jù)類型
????一么夫、數(shù)值型
????1者冤、整型
????tinyint、smallint档痪、mediumint涉枫、int/integer、bigint
????1?????????2????????3??????????4????????????8
????特點(diǎn):
????①都可以設(shè)置無符號和有符號腐螟,默認(rèn)有符號愿汰,通過unsigned設(shè)置無符號
????②如果超出了范圍,會報out or range異常乐纸,插入臨界值(5.5), 后面版本報錯
????③長度可以不指定衬廷,默認(rèn)會有一個長度
????長度代表顯示的最大寬度,如果不夠則左邊用0填充汽绢,但需要搭配zerofill吗跋,并且默認(rèn)變?yōu)闊o符號整型
????2、浮點(diǎn)型
????定點(diǎn)數(shù):decimal(M,D)
????浮點(diǎn)數(shù):
????????float(M,D)???4
????????double(M,D)??8
????特點(diǎn):
????①M(fèi)代表整數(shù)部位+小數(shù)部位的個數(shù)宁昭,D代表小數(shù)部位
????②如果超出范圍小腊,則報out or range異常,并且插入臨界值
????③M和D都可以省略久窟,但對于定點(diǎn)數(shù)秩冈,M默認(rèn)為10,D默認(rèn)為0
????④如果精度要求較高斥扛,則優(yōu)先考慮使用定點(diǎn)數(shù)
????二入问、字符型
????char、varchar稀颁、binary芬失、varbinary、enum匾灶、set棱烂、text、blob
????char:固定長度的字符,寫法為char(M)臂容,最大長度不能超過M,其中M可以省略艾猜,默認(rèn)為1
????varchar:可變長度的字符衬鱼,寫法為varchar(M)业筏,最大長度不能超過M,其中M不可以省略
????三鸟赫、日期型
????year年
????date日期
????time時間
????datetime 日期+時間??????????8??????
????timestamp 日期+時間?????????4???比較容易受時區(qū)蒜胖、語法模式、版本的影響抛蚤,更能反映當(dāng)前時區(qū)的真實(shí)時間
四台谢、常見的約束
一、常見的約束
????NOT NULL:非空岁经,該字段的值必填
????UNIQUE:唯一朋沮,該字段的值不可重復(fù)
????DEFAULT:默認(rèn),該字段的值不用手動插入有默認(rèn)值
????CHECK:檢查蒿偎,mysql不支持
????PRIMARY KEY:主鍵,該字段的值不可重復(fù)并且非空??unique+not null
????FOREIGN KEY:外鍵怀读,該字段的值引用了另外的表的字段
????主鍵和唯一
????1诉位、區(qū)別:
????①、一個表至多有一個主鍵菜枷,但可以有多個唯一
????②苍糠、主鍵不允許為空,唯一可以為空
????2啤誊、相同點(diǎn)
????都具有唯一性
????都支持組合鍵岳瞭,但不推薦
????★注意: 唯一約束在5.7版本允許多個值為空
????外鍵:
????1、用于限制兩個表的關(guān)系蚊锹,從表的字段值引用了主表的某字段值
????2瞳筏、外鍵列和主表的被引用列要求類型一致,意義一樣牡昆,名稱無要求
????3姚炕、主表的被引用列要求是一個key(一般就是主鍵)
????4、插入數(shù)據(jù)丢烘,先插入主表
????刪除數(shù)據(jù)柱宦,先刪除從表
????可以通過以下兩種方式來刪除主表的記錄
????#方式一:級聯(lián)刪除
????ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
????#方式二:級聯(lián)置空
????ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
二、創(chuàng)建表時添加約束
????create table 表名(
????????字段名 字段類型 not null,#非空
????????字段名 字段類型 primary key,#主鍵
????????字段名 字段類型 unique,#唯一
????????字段名 字段類型 default 值,#默認(rèn)
????????constraint 約束名 foreign key(字段名) references 主表(被引用列)
????)
????注意:
????????????????????????????支持類型????????????????????????????????可以起約束名??????????
????列級約束? ? ? ? ?除了外鍵????????????????????????????????????不可以
????表級約束????????除了非空和默認(rèn)? ? ? ? ? ? ? ? ? ? ? ?可以播瞳,但對主鍵無效
????列級約束可以在一個字段上追加多個掸刊,中間用空格隔開,沒有順序要求
三赢乓、修改表時添加或刪除約束
????1忧侧、非空
????添加非空
????alter table 表名 modify column 字段名 字段類型 not null;
????刪除非空
????alter table 表名 modify column 字段名 字段類型 ;
????2石窑、默認(rèn)
????添加默認(rèn)
????alter table 表名 modify column 字段名 字段類型 default 值;
????刪除默認(rèn)
????alter table 表名 modify column 字段名 字段類型 ;
????3、主鍵
????添加主鍵
????alter table 表名 add【 constraint 約束名】 primary key(字段名);
????刪除主鍵
????alter table 表名 drop primary key;
????4苍柏、唯一
????添加唯一
????alter table 表名 add【 constraint 約束名】 unique(字段名);
????刪除唯一
????alter table 表名 drop index 索引名;
????5尼斧、外鍵
????添加外鍵
????alter table 表名 add【 constraint 約束名】 foreign key(字段名) references 主表(被引用列);
????刪除外鍵
????alter table 表名 drop foreign key 約束名;
四、自增長列
????特點(diǎn):
????1试吁、不用手動插入值棺棵,可以自動提供序列值,默認(rèn)從1開始熄捍,步長為1
????auto_increment_increment
????如果要更改起始值:手動插入值
????如果要更改步長:更改系統(tǒng)變量
????set auto_increment_increment=值;
????2烛恤、一個表至多有一個自增長列
????3、自增長列只能支持?jǐn)?shù)值型
????4余耽、自增長列必須為一個key
????一缚柏、創(chuàng)建表時設(shè)置自增長列
????create table 表(
????????字段名 字段類型 約束 auto_increment
????)
????二、修改表時設(shè)置自增長列
????alter table 表 modify column 字段名 字段類型 約束 auto_increment
????三碟贾、刪除自增長列
????alter table 表 modify column 字段名 字段類型 約束?
TCL語言
事務(wù):
????一币喧、含義
????事務(wù):一條或多條sql語句組成一個執(zhí)行單位,一組sql語句要么都執(zhí)行要么都不執(zhí)行
????二袱耽、特點(diǎn)(ACID)
????A 原子性:一個事務(wù)是不可再分割的整體杀餐,要么都執(zhí)行要么都不執(zhí)行
????C 一致性:一個事務(wù)可以使數(shù)據(jù)從一個一致狀態(tài)切換到另外一個一致的狀態(tài)
????I 隔離性:一個事務(wù)不受其他事務(wù)的干擾,多個事務(wù)互相隔離的
????D 持久性:一個事務(wù)一旦提交了朱巨,則永久的持久化到本地
????三史翘、事務(wù)的使用步驟 ★
????了解:
????隱式(自動)事務(wù):沒有明顯的開啟和結(jié)束,本身就是一條事務(wù)可以自動提交冀续,比如insert琼讽、update、delete
????顯式事務(wù):具有明顯的開啟和結(jié)束
????使用顯式事務(wù):
????①開啟事務(wù)?
????????1.?set autocommit=0; 用來禁止使用當(dāng)前會話的自動提交洪唐。這就相當(dāng)于一直處于事務(wù)狀態(tài).
????????2.?start transaction 或 begin;#可以省略
????②編寫一組邏輯sql語句
????注意:sql語句支持的是insert钻蹬、update、delete
????設(shè)置回滾點(diǎn):
????savepoint 回滾點(diǎn)名;
????③結(jié)束事務(wù)
????提交:commit;
????回滾:rollback;
????回滾到指定的地方:rollback to 回滾點(diǎn)名;
????四凭需、并發(fā)事務(wù)
????1脉让、事務(wù)的并發(fā)問題是如何發(fā)生的?
????多個事務(wù) 同時 操作 同一個數(shù)據(jù)庫的相同數(shù)據(jù)時
????2功炮、并發(fā)問題都有哪些溅潜?
????臟讀:一個事務(wù)讀取了其他事務(wù)還沒有提交的數(shù)據(jù),讀到的是其他事務(wù)“更新”的數(shù)據(jù)
????不可重復(fù)讀:一個事務(wù)多次讀取薪伏,結(jié)果不一樣
????幻讀:一個事務(wù)讀取了其他事務(wù)還沒有提交的數(shù)據(jù)滚澜,只是讀到的是其他事務(wù)“插入”的數(shù)據(jù)
????3、如何解決并發(fā)問題
????通過設(shè)置隔離級別來解決并發(fā)問題
????4.?查看及設(shè)置當(dāng)前事務(wù)的隔離級別
????select @@tx_isolation;
????# 設(shè)置當(dāng)前會話的事務(wù)隔離級別
????set session transaction isolation level read uncommitted;??# 讀未提交
????set session transaction isolation level read committed;????# 讀已提交
????set session transaction isolation level repeatable read;???# 可重復(fù)讀??默認(rèn)的隔離級別
????set session transaction isolation level serializable ;?????# 串行化嫁怀, 最高的隔離級別
????# 查看...
????mysql> select @@tx_isolation;
+------------------+
????| @@tx_isolation???|
+------------------+
????| READ-UNCOMMITTED |
+------------------+
????5设捐、隔離級別
?????????????????????????????????????????????????????????臟讀??????????不可重復(fù)讀????????幻讀
????read uncommitted:????讀未提交? ? ?????×????????????????×??????????????????????×????????
????read committed:????讀已提交??????????√????????????????×??????????????????????×
????repeatable read:????可重復(fù)讀?????????√????????????????√??????????????????????×
????serializable:????????????串行化? ? ? ? ? ? ?√????????????????√??????????????????????√
其他
視圖:
一借浊、含義
????mysql5.1版本出現(xiàn)的新特性,本身是一個虛擬表萝招,它的數(shù)據(jù)來自于表蚂斤,通過執(zhí)行時動態(tài)生成。
????好處:
????1槐沼、簡化sql語句
????2曙蒸、提高了sql的重用性
????3、保護(hù)基表的數(shù)據(jù)岗钩,提高了安全性
二纽窟、創(chuàng)建
????create view 視圖名
????as
????查詢語句;
三、修改
????方式一:
????create or replace view 視圖名
????as
????查詢語句;
????方式二:
????alter view 視圖名
????as
????查詢語句
四兼吓、刪除
????drop view 視圖1臂港,視圖2,...;
五、查看
????desc 視圖名;
????show create view 視圖名;
六视搏、使用
1.插入 insert
2.修改 update
3.刪除 delete
4.查看 select
????注意:視圖一般用于查詢的审孽,而不是更新的,所以具備以下特點(diǎn)的視圖都不允許更新
????① 包含分組函數(shù)浑娜、group by佑力、distinct、having棚愤、union搓萧、
????② join
????③ 常量視圖
????④ where后的子查詢用到了from中的表
????⑤ 用到了不可更新的視圖
七杂数、視圖和表的對比
????????????????關(guān)鍵字???????????是否占用物理空間????????????????????使用
????視圖?????view? ? ? ? ? ? ? 占用較小宛畦,只保存sql邏輯??????一般用于查詢
????表? ? ? ? table???????????????保存實(shí)際的數(shù)據(jù)?????????????????????增刪改查
變量
????分類
????一、系統(tǒng)變量
????說明:變量由系統(tǒng)提供的揍移,不用自定義
????語法:
????①查看系統(tǒng)變量
????show 【global|session 】variables like ''; 如果沒有顯式聲明global還是session次和,則默認(rèn)是session
????②查看指定的系統(tǒng)變量的值
????select @@【global|session】.變量名; 如果沒有顯式聲明global還是session,則默認(rèn)是session
????③為系統(tǒng)變量賦值
????方式一:
????set 【global|session 】 變量名=值; 如果沒有顯式聲明global還是session那伐,則默認(rèn)是session
????方式二:
????set @@global.變量名=值;
????set @@變量名=值踏施;
????1、全局變量
????服務(wù)器層面上的罕邀,必須擁有super權(quán)限才能為系統(tǒng)變量賦值畅形,作用域?yàn)檎麄€服務(wù)器,也就是針對于所有連接(會話)有效
????2诉探、會話變量
????服務(wù)器為每一個連接的客戶端都提供了系統(tǒng)變量日熬,作用域?yàn)楫?dāng)前的連接(會話)
????二、自定義變量
????說明:
????1肾胯、用戶變量
????作用域:針對于當(dāng)前連接(會話)生效
????位置:begin end里面竖席,也可以放在外面
????使用:
????①聲明并賦值:
????set @變量名=值;或
????set @變量名:=值;或
????select @變量名:=值;
????②更新值
????方式一:
????????set @變量名=值;或
????????set @變量名:=值;或
????????select @變量名:=值;
????方式二:
????????select xx into @變量名 from 表;
????③使用
????select @變量名;
????2耘纱、局部變量
????作用域:僅僅在定義它的begin end中有效
????位置:只能放在begin end中,而且只能放在第一句
????使用:
????①聲明
????declare 變量名 類型 【default 值】;
????②賦值或更新
????方式一:
????????set 變量名=值;或
????????set 變量名:=值;或
????????select @變量名:=值;
????方式二:
????????select xx into 變量名 from 表;
????③使用
????select 變量名;
##存儲過程與函數(shù)
????說明:都類似于java中的方法毕荐,將一組完成特定功能的邏輯語句包裝起來束析,對外暴露名字
????好處:
????1、提高重用性
????2憎亚、sql語句簡單
????3员寇、減少了和數(shù)據(jù)庫服務(wù)器連接的次數(shù),提高了效率
存儲過程
????一虽填、創(chuàng)建 ★
????create procedure 存儲過程名(參數(shù)模式 參數(shù)名 參數(shù)類型)
????begin
????????????存儲過程體
????end
????注意:
1.參數(shù)模式:in丁恭、out、inout斋日,其中in可以省略
2.存儲過程體的每一條sql語句都需要用分號結(jié)尾
????二牲览、調(diào)用
????call 存儲過程名(實(shí)參列表)
????舉例:
????調(diào)用in模式的參數(shù):call sp1(‘值’);
????調(diào)用out模式的參數(shù):set @name; call sp1(@name);select @name;
????調(diào)用inout模式的參數(shù):set @name=值; call sp1(@name); select @name;
????三、查看
????show create procedure 存儲過程名;
????四恶守、刪除
????drop procedure 存儲過程名;
函數(shù)
????一第献、創(chuàng)建
????create function 函數(shù)名(參數(shù)名 參數(shù)類型) returns??返回類型
????begin
????????函數(shù)體
????end
????注意:函數(shù)體中肯定需要有return語句
????二、調(diào)用
????select 函數(shù)名(實(shí)參列表);
????三兔港、查看
????show create function 函數(shù)名;
????四庸毫、刪除
????drop function 函數(shù)名;
流程控制與結(jié)構(gòu)
????說明:
????順序結(jié)構(gòu):程序從上往下依次執(zhí)行
????分支結(jié)構(gòu):程序按條件進(jìn)行選擇執(zhí)行衫樊,從兩條或多條路徑中選擇一條執(zhí)行
????循環(huán)結(jié)構(gòu):程序滿足一定條件下飒赃,重復(fù)執(zhí)行一組語句
分支結(jié)構(gòu)
????特點(diǎn):
????1、if函數(shù)
????功能:實(shí)現(xiàn)簡單雙分支
????語法:
????if(條件科侈,值1载佳,值2)
????位置:
????可以作為表達(dá)式放在任何位置
????2、case結(jié)構(gòu)
????功能:實(shí)現(xiàn)多分支
????語法1:
????case 表達(dá)式或字段
????when 值1 then 語句1;
????when 值2 then 語句2臀栈;
????..
????else 語句n;
????end [case];
????語法2:
????case?
????when 條件1 then 語句1;
????when 條件2 then 語句2蔫慧;
????..
????else 語句n;
????end [case];
????位置:
????可以放在任何位置,
????如果放在begin end 外面权薯,作為表達(dá)式結(jié)合著其他語句使用
????如果放在begin end 里面姑躲,一般作為獨(dú)立的語句使用
????3、if結(jié)構(gòu)
????功能:實(shí)現(xiàn)多分支
????語法:
????if 條件1 then 語句1;
????elseif 條件2 then 語句2;
????...
????else 語句n;
????end if;
????位置:
????只能放在begin end中
循環(huán)結(jié)構(gòu)
????位置:
????只能放在begin end中
????特點(diǎn):都能實(shí)現(xiàn)循環(huán)結(jié)構(gòu)
????對比:
????①這三種循環(huán)都可以省略名稱盟蚣,但如果循環(huán)中添加了循環(huán)控制語句(leave或iterate)則必須添加名稱
????②
????loop 一般用于實(shí)現(xiàn)簡單的死循環(huán)
????while 先判斷后執(zhí)行
????repeat 先執(zhí)行后判斷黍析,無條件至少執(zhí)行一次
????1、while
????語法:
????【名稱:】while 循環(huán)條件 do
????????????循環(huán)體
????end while 【名稱】;
????2屎开、loop
????語法:
????【名稱:】loop
????????????循環(huán)體
????end loop 【名稱】;
????3阐枣、repeat
????語法:
????【名稱:】repeat
????????????循環(huán)體
????until 結(jié)束條件?
????end repeat 【名稱】;
????二、循環(huán)控制語句
????leave:類似于break,用于跳出所在的循環(huán)
????iterate:類似于continue侮繁,用于結(jié)束本次循環(huán)虑粥,繼續(xù)下一次