目錄java
1、###MySQL登陸和退出mysql
2、###MySQL經常使用命令sql
3、###MySQL語法規範數據庫
4、###基礎查詢安全
5、###條件查詢服務器
6、###排序查詢session
7、###常見函數的學習併發
8、###分組查詢函數
9、###鏈接查詢oop
10、###子查詢
11、###分頁查詢
12、###聯合查詢
十3、###DML語言
十4、###DDL語言
十5、###常見的數據類型
十6、###常見的約束
十7、###標識列
十8、###TCL
十9、###視圖
二10、###變量
二11、###存儲過程和函數
###1.MySQL登陸和退出
登陸:
mysql (-h主機名 -p端口號)-u用戶名 -p密碼
退出:
exit或者ctrl+c
###2.MySQL基礎命令
1.查看全部數據庫
show databases;
2.打開庫
use 庫名;
3.查看其餘庫中的表
show tables from 庫名;
4.建立表
creat table 表名(
列名 列類型,
列名 列類型,
。。。
);
5.查看錶結構
desc 表名;
###3.MySQL語法規範
1.不區分大小寫 建議關鍵字大寫,表名、列名小寫
2.每條命令用分號結尾
3.每條命令根據須要能夠縮進 換行
4.註釋
單行註釋:#註釋文字
單行註釋: - -註釋文字
多行註釋:/* 註釋文字 */
###4.基礎查詢
#語法:
select 查詢的東西
from 表名;
#特色:
1.查詢的東西能夠是:字段、常量值、表達式、函數
2.查詢的結果是一個虛擬的表格。
#1.查詢表中的單個字段
SELECT NAME FROM city;
#2.查詢表中的多個字段
SELECT NAME,id FROM city;
#3.查詢表中全部的字段
SELECT * FROM city;
#4.查詢常量值
SELECT 100;
SELECT 'beijing';
#5.查詢表達式
SELECT 100*98;
#6.查詢函數
SELECT version(); //獲得的是查詢函數的返回值
#7.爲字段起別名
①便於理解
②若是查詢的字段有重名狀況,使用別名能夠區分開
#方式一:使用As
SELECT 100*98 As 結果;
SELECT 'beijing' AS 首都;
#方式二:使用空格
SELECT 'beijing' 首都;
#案例:若是別名中存在關鍵字或特殊符號,加雙引號
(單引號也可,但建議雙引號)
#8.去重
SELECT DISTINCT 'beijing' from city;
#9.+的做用
運算符:
例如:select 100+10;//兩個操做數都爲數值型,則做加法運算
select '123'+90;//一個操做數是字符,另個一是數值,會
嘗試將字符型轉換爲數值型 結果:213;
SELECT DISTINCT 'beijing' + 10;//若不能轉換,則將字符型
視做0 結果:10;
SELECT DISTINCT 'beijing' + null;//如有一方是null,則
結果爲null
###5.條件查詢
#語法:
select
查詢列表
from
表名
where
篩選條件;
#分類
1、按條件表達式篩選
條件運算符> < = != <= >= 建議不等於用<>
案例:篩選id>50的城市
SELECT
*
FROM
city
WHERE
id>50
2、 按邏輯運算符篩選
邏輯運算符:
與:$$ 或:|| 非:!
建議使用: and or not
案例:查詢id 50到100的城市:
SELECT
*
FROM
city
WHERE
id>50 AND id<100
3、模糊查詢
like
between and
in
is null | is not null
#1.like
特色:
①通常和通配符搭配使用
通配符:
% 任意多個字符
_ 任意單個字符
若是查詢的中含有通配符,應轉譯 例如 \_
案例:查找ch開頭的國家
SELECT
*
FROM
country
WHERE
NAME LIKE 'ch%'
#2.between and
特色:
①包含臨界值
②調換順序不報錯,可是錯誤
案例:查找id在100到120的城市
SELECT
*
FROM
city
WHERE
id BETWEEN 100 AND 120
#3.in
特色:
①in列表的值必須一致或兼容
②不能使用通配符
案例:查詢國家代碼是CHN和NLD的城市名和ID
SELECT
id,
NAME
FROM
city
WHERE
countrycode IN ('CHN','NLD')
#4.is null
id = null 不成立
id isnull
###6.排序查詢
語法:
select 查詢列表
from 表
【where 篩選條件】
order by 排序列表 【asc|desc】
特色:
①asc是升序 desc是降序,若是不寫,默認升序
②支持單個字段,也支持多個字段、表達式、函數、別名
③order by子句通常放在查詢語句的最後,limit子句除外
案例1:查詢城市名字和id,按id降序
SELECT
id AS 序號,NAME AS 名字
FROM
city
ORDER BY
id DESC
案例2:按照城市名的字節長度排序【按函數排序】
SELECT
*,LENGTH(NAME)
FROM
city
ORDER BY LENGTH(NAME) DESC
案例3:按別名排序
案例4:先按照名字長度排序,再按id排序【按多個字段排序】
SELECT
*,LENGTH(NAME)
FROM
city
ORDER BY LENGTH(NAME) DESC,id ASC
###7.常見函數的學習
概念:相似java的方法
調用:select 函數名(參數列表) 【from 表】
分類:
1.單行函數
如 concat、length、ifnull等
2.分組函數
功能:作統計使用,又稱做統計函數、聚合函數、組函數
# 單行函數
#一.字符函數
#1.length 獲取參數值的字節個數
#2.concat 拼接字符串
#3.upper、lower 變大寫,變小寫
#4.substr 、substring 截取字符串
注意:索引從1開始
#一個參數:截取從指定索引到結尾
SELECT
SUBSTR('李莫愁愛上了陸湛遠',7)
輸出陸湛遠
#兩個參數:截取從指定索引指定長度
SELECT
SUBSTR('李莫愁愛上了陸湛遠',1,3)
輸出李莫愁
#5.instr 返回子串第一次出現的索引,若是找不到返回0
SELECT INSTR('楊不悔愛上了殷六俠','殷六俠')
輸出7
#6.trim
SELECT TRIM(' 周福利 ')
輸出:周福利
SELECT TRIM('a' FROM 'aaaaa周aaaa福aaaaa利aaaaa')
輸出:周aaaa福aaaaa利
#7.lpad 用指定的字符實現左填充指定長度
SELECT LPAD('周福裏',10,'*')
輸出:*******周福裏
#8.rpad 用指定的字符實現右填充指定長度
#9.replace 替換
SELECT REPLACE('周芷若周芷若周芷若張無忌愛上了周芷若周芷若','周芷若','趙敏')
輸出:趙敏趙敏趙敏張無忌愛上了趙敏趙敏
#2、數學函數
#1.round 四捨五入
先轉化爲絕對值,再四捨五入
SELECT ROUND(-1.51)
SELECT ROUND(-1.515,2)小數點後保存兩位
#2.ceil 向上取整
返回>=該參數的最小整數
#3.floor 向下取整
返回<=該參數的最大整數
#4.truncate 截斷
SELECT TRUNCATE(1.6999,1)
輸出:1.6
#5.mod 取餘
mod(a,b) : a-a/b*b;
#3、日期函數
#1.now 返回當前系統日期+時間
#2.curdate 返回當前系統日期,不包含時間
#3.curtime 返回當前時間,不含日期
#4.能夠獲取指定部分,年、月、日、小時、分鐘、秒
select year(now()) 年;
select year('1998-1-1') 年;
輸出1998
select month(now());
9
select monthname(now());
December
#5.str_to_date:將字符轉換爲指定類型的日期
select str_to_date('4-3 1992','%c-%d %Y')
輸出:1998-03-02
%Y 四位年份的年
%y 2位年份的年
%m 月份(01,02,...,11,12)
%c 月份(1,2,3.。。。,11,12)
%d 日(01,02.。。。)
%H 小時(24小時制)
%h 小時(12小時制)
%i 分鐘(00,01,02,....,59)
%s 秒(00,01,02,....,59)
#6.date_format將時間類型轉化爲字符串
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日')
輸出:2019年12月06日
#7.datediff( , )
查找兩個日期相差的時間
#4、其餘函數
version()查看版本
database()查看當前數據庫
user()查看當前用戶
#5、流程控制函數
#1.if函數: if else的效果
SELECT IF(10>5,'大','小')
輸出:大
#2.case函數的使用一: switch case的效果
語法:
case 要判斷的字段或表達式
when 常量1 then 要顯示的值1或語句1;
when 常量2 then 要顯示的值2或語句2;
....
else 要顯示的值n或語句n;
end
案例:
SELECT ID 序號, NAME 名字,
CASE id
WHEN 1 THEN 'test'
ELSE NAME
END AS 新姓名
FROM city
#3.case 函數的使用二: 相似於多重if
語法:
case
when 條件1 then 要顯示的值1或語句1;
when 條件2 then 要顯示的值2或語句2;
.。。
else 要顯示的值n或語句n
end
案例:
SELECT ID 序號, NAME 名字,
CASE
WHEN id<=10 THEN 'A'
WHEN id>10 AND id<=20 THEN 'B'
ELSE 'C'
END AS 新姓名
FROM city
#2、分組函數
/*
功能:用做統計使用,又稱聚合函數或統計函數或組函數
分類:sum求和、avg平均值、max最大值、min最小值、count計算個數
*/
#一、簡單的使用
SELECT SUM(id) FROM city
SELECT COUNT(id) FROM city
.....
#2.參數支持哪些類型
sum和avg只支持數值類型 不支持字符型 不支持日期類型
max和min值支持字符型、數字型、日期型
count任何類型都支持
#3.是否忽略null值
以上分組函數都忽略null值
#4.能夠和distinct搭配
#5.count函數的詳細介紹
SELECT COUNT(1) FROM city//顯示全部字段
SELECT COUNT(*) FROM city
#6. 和分組函數一同查詢的字段有限制
和分組函數一同查詢的字段要求是group by後的字段
###8.分組查詢
語法:
select 分組函數,列(要求出如今group by的後面)
from 表
【where 篩選條件】
group by 分組列表
【order by 子句】
特色:
①分組查詢中的篩選條件能夠分爲分組前查詢和分組後查詢
②分組查詢支持單個字段分組,也支持多個字段分組(中間用逗號隔開,順序可變)
③也能夠添加排序(放在最後)
案例1:查詢每一個國家的最大城市id
SELECT MAX(id) 最大id,`CountryCode`
FROM city
GROUP BY countrycode
ORDER BY 最大id
案例2:查詢每一個國家的城市數
SELECT COUNT(*),`CountryCode`
FROM city
GROUP BY countrycode
案例3:添加篩選條件
SELECT COUNT(*),`CountryCode`
FROM city
WHERE `CountryCode` ='chn'
GROUP BY countrycode
#添加複雜的篩選條件
案例:查詢每一個城市數大於50的國家
SELECT COUNT(*) 城市數,`CountryCode`
FROM city
GROUP BY countrycode
HAVING 城市數>50
因爲where只能跟在from後面。因此用了新的having
###9.鏈接查詢:
含義:又稱多表查詢,查詢的字段來自不一樣表時使用
分類:
按年代分類:
sql192標準 僅僅支持內鏈接:
sql199標準【推薦】支持內+外(左外+右外)+交叉鏈接
按功能分類:
內鏈接:
等值鏈接
非等值鏈接
自鏈接
外鏈接
左外鏈接
右外鏈接
自鏈接
交叉鏈接
#1、sql92標準
#1.等值鏈接
#1.案例:查詢城市名對應的國家名
SELECT city.`Name`,country.`Name`
FROM city,country
WHERE city.`CountryCode`=country.`Code`
#2.爲表起別名
#與給字段起別名一至
#縮短表名長度,提升效率
#起完別名後則查詢字段不能使用原來的表名限定
#3.兩個表的順序能夠調換
#4.能夠加篩選
#案例:
SELECT a.`Name`,b.`Name`
FROM city a,country b
WHERE a.`CountryCode`=b.`Code`
AND a.`ID`>10
#5.能夠分組
#6.能夠排序
#7.能夠實現三表鏈接
#2.非等值鏈接
#3.自鏈接
使用別名進行區分
#2、sql99語法
/*
語法:
select 查詢列表
from 表1 別名 【鏈接類型】
join 表1 別名
on 鏈接條件
【where 篩選條件】
【group by】
【order】
*/
#鏈接類型關鍵字:
內鏈接:inner
外鏈接:
左外 left 【outer】
右外 right 【outer】
全外 full 【outer】
交叉鏈接:cross
#(一)內鏈接
select 查詢列表
from 表1 別名
innet join 表2 別名
on 鏈接條件
#案例:
SELECT DISTINCT `CountryCode`,b.`Name`
FROM `city` a
INNER JOIN `country` b
ON a.`CountryCode`=b.`Code`
#(二)外鏈接
/*
應用場景:用於查詢一個表中有,另外一個表中沒有的記錄
特色:
1.外鏈接查詢結果爲主表中的全部記錄
若是從表中沒有和他匹配的值,則顯示null
若是又和他匹配的值,則顯示匹配的值
外鏈接查詢的結果等於=內鏈接結果加主表中沒有的記錄
2.左外鏈接,left join 左邊是主表
右外鏈接,right join 右邊是主表
3.左外和右外互換表的位置也能夠實現相同的效果
*/
#案例:
select b.name,bo.*
frome beauty b
left outer join boys bo
on b.id = bo.id
select b.name ,bo.*
frome boys bo
right outer join beauty b
on b.id = bo.id
#全外(msql不支持!)
select b.*,bo.*
from beauty b
full outer join boys b
on b.id = bo.id
#交叉鏈接
案例:
select b.*,bo.*
from beauty b
cross join boys bo
on b.id = bo.id
產生笛卡爾積
#sql92和sql99
功能:sql99功能較多
可讀性:sql99可讀性更高
###10.子查詢
/*
含義:
出如今其餘語句中的select語句,稱爲子查詢或內查詢
外部的查詢語句,成爲主查詢或外查詢
分類:
按子查詢出現的位置:
select後面
僅僅標量子查詢
from後面
支持表子查詢
where或having後面?
標量子查詢(單行)
列子查詢(多行)
行子查詢
exists後面(相關子查詢)
表子查詢
按結果集的行列數不一樣:
標量子查詢(結果集只有一行一列)
列子查詢(結果集只有一列多行)
行子查詢(結果集有一行多列)
表子查詢(結果集通常爲多行多列)
*/
#(一)where或having後面的子查詢
1.標量子查詢(單行子查詢)
2.列子查詢(多行子查詢)
3.行子查詢(多行多列)
#1、標量子查詢
#特色:
①子查詢都要放在小括號內
②子查詢通常放在條件的右側
③標量子查詢通常搭配着單行操做符使用
< > >= <=
列子查詢通常搭配多行操做符使用
in、any/some、all
④子查詢的執行要優先於主查詢
#非法使用標量子查詢
#案例:查詢誰的工資比Abel高?
#①查詢Abel的工資
select salary
from employee
where last_name = 'Able'
#②查詢員工的信息,知足salary>①的結果
select *
from employee
where salary > (
select salary
from employee
where last_name = 'Able'
)
#(二)列子查詢(多行子查詢)
關鍵字: IN any/some all
#案例:
select *
from employee
where asalry<all(
)
#(三)行子查詢(結果集一行多列或多行多列)
不經常使用
#2、select後面
/*
#裏面僅支持標量子查詢
*/
#3、將子查詢放在from後面
#4、exists後面(相關子查詢)
/*
語法:
exists(完整的查詢語句)
結果:
0或1
*/
###11.分頁查詢
/*
應用場景:
要顯示的數據一頁顯示不全,須要分頁提交sql請求
語法:
limit offset,size;
offset:要顯示條目的起始索引(索引從0開始)
size:要顯示的條目個數
*/
#案例:
查詢前五條員工信息
SELECT * FROM employees LIMIT 0,5;
#特色:
①limit語句放在查詢語句的最後
②公式
顯示的頁數是page,每頁條目數是size
select 查詢列表
from 表
limit (page -1)*size,size;
#應用場景:
要查詢的結果來自於多個表,多個表沒有直接關係,但查詢的信息相同
#注意事項:
①要求多條查詢語句的查詢列數是一致的
②查詢的每列類型和順序是一致的
③union關鍵字默認是去重的,若是使用union all會保留全部項
###12.聯合查詢
/*
union 將多條查詢語句的結果合併成一個結果
語法:
查詢語句1
union
查詢語句2
union
...
*/
#案例1:查詢部門編號>90或郵箱中包含a的員工信息
作法1:
select *
from employees
where email like '%a%' or department_id>90
作法2:
select *
from employees
where email like '%a%'
union
select *
from employees
where department_id >90
#案例2:查詢中國用戶男士的信息和外國用戶男士的信息
###13.DML語言
/*
數據操做語言:
插入:insert
修改:update
刪除:delete
*/
#1、插入語言:
#方式一:
/*
#語法:
insert into 表名(列名,....) values(值1,...)
#注意事項:
①插入值的類型要與列的類型一致
②不能夠爲null的列必須插入值,能夠爲null的列,寫null或直接不寫列
③列的順序能夠顛倒
④列和值的個數必須一致
⑤能夠省略列名,默認是全部列,並且列的順序和表中的順序一致
*/
#方式二:
/*
語法:
insert into 表名
set 列名=值,列名=值,....
*/
#兩種方式pk
①方式1支持多行輸入,方式二不支持
②方式1支持子查詢,方式二不支持
#2、修改語句
/*
1.修改單表中的記錄:
語法:
update 表名
set 列= 新值,...
where 篩選條件;
案例:
update beauty
set sex = 'a'
where name = '蘇德間'
2.修改多表中的記錄
語法:
update 表1 別名,
inner join 表2 別名
on 鏈接條件
set 列= 值...
where 篩選條件
#案例1:修改張無忌的女友的手機號爲112
UPDATE beauty b
INNER JOIN boys bo
ON b.`boyfriend_id` = bo.`id`
SET b.`phone` = '112'
WHERE bo.`boyName` = '張無忌'
#案例2:修改沒有男友的boyfriendid爲5
UPDATE beauty b
LEFT OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.`id`
SET b.`boyfriend_id` = 5
WHERE bo.`id` IS NULL;
*/
#3、刪除語句
/*
#方式一:delete
語法:
delete from 表名 where 篩選條件
多表刪除
#案例一:刪除手機號0結尾的
delete from beauty where phone like '%0'
#方式二:truncate
語法:truncate table 表名
#兩種方式pk
①delete能夠添加where條件,另外一個不能
②truncate刪除效率高一丟丟
③若是使用delete刪除全部後,再插入數據,自增加列從斷點開始
truncate刪除後自增加列從1開始
④truncate刪除沒有返回值,delete刪除有返回值
⑤truncate刪除不能回滾,delete能夠回滾
*/
###14.DDL語言
/*
數據定義語言
庫和表的管理
#1、庫的管理
建立、修改、刪除
#2、表的管理
建立、修改、刪除
建立:create
修改:alter
刪除:drop
*/
#1、庫的管理
#1.庫的建立
#語法:
create datebase 庫名;
#案例:
CREATE DATABASE books
#2.庫的修改(基本不修改,會致使數據丟失,不安全)
#更改庫的字符集
alter database books character set gbk
#3.庫的刪除
drop database if exists books
#2、表的管理
/*
alter table 表名 add|drop|modify|change column
*/
#1.表的建立
create table 表名(
列名 列的類型【(長度) 約束】,
....
)
#2.表的修改
#①修改列名
alter table book change column publishdate pubDate datetime
#②修改列的類型或約束
alter table book modify column pubdate timestamp
#③添加新列
alter table author add column annual double
#④刪除列
alter table author drop column annual
#⑤修改表名
alter table author rename to book_author
#3.表的刪除
drop table book_author;
#通用的寫法
drop database if exists 舊庫名;
create database 新庫名;
drop table if exists 舊錶名;
create table 新表名();
#4.表的複製
#1.僅僅賦值表的結構
CREATE TABLE copy LIKE book_author`copy`
#2.複製表的結構+數據(或部分數據)
CREATE TABLE copy2
SELECT * FROM book_author
【where】
只複製某些字段
CREATE TABLE copy3
SELECT id,au_name
FROM book_author
###15.常見的數據類型
/*
數值型:
整形:
小數:
定點數
浮點數
字符型:
較短的文本:char、varchar
較長的文本:text、blob(較長的二進制數據)
日期型:
*/
#1、整形
/*
分類:
tinyint、smallint mediumint int/integer、bigint
特色:
①若是不設置無符號,則默認有符號
②超出範圍默認插入臨界值,且會報異常
③若是不設置長度,會有默認長度
長度表明了顯示的最大寬度,若是不夠會用0填充,需搭配zerofill使用
*/
#1.如何設置有符號和無符號
unsigned 約束關鍵字
#2、小數
1.浮點型
float(M,D)
double(M,D)
2.定點型
dec(M,D)
decimal(M,D)
特色:
①M:整數部位+小數部位
D:小數部位
若是超過範圍,則插入臨界值
②M和D能夠省略
若是是decimal,則M默認是10,D默認是0
若是是float和double則會根據插入數值的精度確認精度
③定點型的精確度較高,若是對插入數值的精度要求較高可使用,如貨幣
#原則:
所選擇的類型越簡單越好,能保存數值的類型越小越好
#3、字符型
/*
較短的文本:
char
varchar
較長的文本:
text
blob
*/
特色:
#char(M)
#varchar(M)
char和varchar區別:carchar可變,char不可變
varchar省空間 可是char效率較高
例如性別,能夠用char
char的m能夠省略,默認1 ,varchar不能省略
#enum類型: 枚舉類型
案例:
create table season(
s1 ENUM('春','夏','秋','冬')
)
insert into season values ('春')
#set類型:
create table tab_set(
s1 set('a','b','c','d')
)
insert into tab_set values ('a')
insert into tab_set values ('a,b')
#binary和varbinary用於保存較短的二進制
#4、日期型
分類:
date 只保存日期
time 只保存時間
year 只保存年
datetime 日期+時間 受時區英雄
timestamp 日期+時間 不受時區影響
###16.常見的約束
/*
含義:一種限制,用於限制表中的數據爲了保證表中數據的準確性和可靠性
分類: 六大約束
NOT NULL:非空,用於保證該字段的值不能爲空
好比姓名、學號等
DEFAULT:默認,用於保證該字段有默認的值
好比性別
PRIMATY KEY:主鍵,用於保證該字段的值具有惟一性而且非空
好比學號、員工編號等
UNIQUE:惟一,用於保證該字段的值具備惟一性,能夠爲空
好比:座位號
CHECK:檢查約束【mysql不支持】
好比:年齡、性別
FOREIGN KEY:外鍵,用於限制兩個表的關係,用於保證該字段的值來自於主表的關聯列的值
在從表添加外鍵約束,用於引用主表中某列的值
好比:學生表的專業編號,員工表的部門編號
添加約束的時機:
1.建立表時
2.修改表時
約束的添加分類:
列級約束
六大約束語法上都支持,但外鍵約束沒有效果
表級約束
除了非空、默認,其餘的都支持
*/
#1、建立表時添加約束
#1.添加列級約束
語法:
直接在字段名和類型名後面追加約束
CREATE TABLE stuinfo(
id INT PRIMARY KEY, #主鍵
stuname VARCHAR(20) NOT NULL, #非空
gender CHAR(1) CHECK(gender='男' OR gender = '女'),#檢查(無效)
seat INT UNIQUE , #惟一
age INT DEFAULT 18 #默認
)
#2.添加表級約束
語法:
在各個字段的最下面
【CONSTRAINT 約束名】 約束類型(字段名)
取名能夠省略(中括號內的)
CREATE TABLE stuinfo(
id INT ,
stuname VARCHAR(20),
gender CHAR(1) ,
seat INT ,
age INT ,
magorid INT,
CONSTRAINT pk PRIMARY KEY(ID),
CONSTRAINT ck UNIQUE(seat),
CONSTRAINT fk_s_m FOREIGN KEY(magorid) REFERENCES magor(`m_id`)
)
#通用寫法:
外鍵約束用表級,其餘都用列級約束
#主鍵和惟一的對比:
保證惟一性 是否容許爲空 一個表中能夠有多少個 是否容許組合
主鍵 √ X 至多有一個 √(組合主鍵,不推薦)
惟一 √ √ 能夠有多個 √(不推薦)
#外鍵:
1.要求在從表設置外鍵的關係
2.從表的外鍵列的類型和主表的關聯列的類型一致
3.主表的關聯列必須是一個key(通常是主鍵或惟一鍵)
4.插入數據時,先插入主表,再插入從表
刪除數據時,先刪除從表,再刪除主表
#2、修改表時添加約束
/*
1.添加列級約束:
alter table 表名 modify column 字段名 字段類型 新約束
2.添加表級約束:
alter table 表名 add 【constraint 約束名】 約束類型(字段名)
*/
#1.添加非空、默認約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOTNULL
#2.添加主鍵、惟一
#①列級約束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY
#②表級約束
ALTER TABLE stuinfo ADD PRIMARY KEY(id)
#3.添加外鍵
ALTER TABLE stuinfo ADD CONSTRAINT fk_s_m FOREIGN KEY(majorid) REFRENCES major(id)
#3、修改表時刪除約束
基本與添加一致
#刪除惟一
alter table s drop index 約束名
#刪除外鍵
alter table s drop foreign key 約束名
###17.標識列
/*
又稱爲自增加列
含義:能夠不用手動的插入值,系統提供默認的序列值
特色:
①標識列不必定和主鍵搭配,但必定要和key搭配
②一個表中最多有一個標識列
③標識列的類型只能是數值型,通常是int
④標識列能夠經過
set auto_increment_increment= 3
設置步長
能夠經過設置第一個值的來決定開始數值
*/
#1、建立表時設置標識列
CREATE TABLE test1(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
)
#2、修改表時設置標識列
alter table s modify colunm id primary key auto_increment
###18.TCL
/*
Transaction Control Language 事務控制語言
sql支持insert,update,delete
事務:
一個或一組sql語句組成一個執行單元,這個執行單元要麼所有執行,要麼所有不執行
案例: 實時轉帳
張三非:1000
郭襄: 1000
update 表 set 張三非的餘額= 500 whrer name = ‘張三非’
update 表 set 郭襄的餘額 = 1500 where name = ‘郭襄’
#事務所具有的屬性/特色:(ACID)
1.原子性(atomiciy)
事務是一個不可分割的工做單位,要麼都發生,要麼都不發生
2.一致性(consistency)
事務必須使數據庫從一個一致性狀態變換到另外一個一致性的狀態
3.隔離性(isolation)
事務的隔離性是指一個事務的執行不能被其餘事務干擾,即一個事務的操做及
使用的數據對併發的其餘事務是隔離的,併發執行的各個事務之間不能相互干擾
4.持久性(durability)
指一個事務一旦被提交,他對數據庫中數據的改變是永久性的
#事務的建立
#隱式事務:事務沒有明顯的開啓和結束的標記
好比:insert update delete
#顯式事務:事務具備明顯的開啓和結束的標記
前提:必須先設置自動提交功能禁用
set autocommit = 0;
步驟1:開啓事務
set autocommit = 0;
start transaction;
步驟2:編寫事務中的sql語句(select insert update delete)
語句1;
語句2;
...
步驟3:結束事務
commit;提交事務
rollback;回滾事務
#併發事務
1.事務的併發問題是如何發生的?
多個事務同時操做同一個數據庫的相同數據時
2.併發的問題有那些?
髒讀:一個事務讀取了其餘事務還沒提交的數據,讀到的是其餘事務‘更新的事務’
不可重複讀:一個事務屢次讀取,結果不同
幻讀:一個事務讀取了其餘事務沒有提交的事務,讀到了其餘事務‘插入的事務’
3.如何解決併發問題?
設置隔離級別
#事務的隔離級別:
髒讀 幻讀 不可重複度
read uncommitted(讀未提交): √ √ √
read committed(讀已提交): x √ √
repeatable read(可重複讀): x x √
serializable(串行化): x x x
mysql中默認第三個隔離級別 repeatable read
orical中默認第二個隔離級別 read commited
查看隔離級別:
select @@tx_isolation;
設置隔離級別:
set session|global transaction isolation level 隔離級別;
savepoint 節點名; 設置保存點
配合rollback to 節點名; 使用。
*/
###19.視圖
/*
含義:虛擬表,他的數據來自表,經過執行時動態生成
意義:①重用sql語句
②簡化複雜的sql語句
③保護數據,提升安全性
#視圖與表
建立語法及關鍵字 是否實際佔用物理空間 使用
視圖 create table 佔用較小隻是保存了sql邏輯 通常只是用查詢
表 create view 是,保存了實際數據 增刪改查
*/
#案例:查詢J開頭的員工的姓名和部門名
SELECT first_name ,department_name
FROM employees a
INNER JOIN departments b
ON a.`department_id` = b.`department_id`
WHERE a.`first_name` LIKE 'J%'
創建視圖:
CREATE VIEW v1
AS
SELECT first_name ,department_name
FROM employees a
INNER JOIN departments b
ON a.`department_id` = b.`department_id`
從視圖中查詢:
SELECT * FROM v1
WHERE first_name LIKE 'J%'
#1、建立視圖
#語法:
create view 視圖名
as
查詢語句;
#
#2、視圖的修改
#方式一:
create or replace view 視圖名
as
查詢語句;
#方式二:
alter view 視圖名
as
查詢語句;
#3、刪除視圖
#語法:
drop view 視圖名,視圖名,....;
DROP VIEW v1,v2
#4、查看視圖
desc 視圖
show create view 視圖
#5、視圖的更新
#1.插入
insert into 視圖 values()
與表的插入相似
#2.修改
與表的更新相似
#3.修改
DELETE FROM v1
WHERE last_name = '展飛'
#具有如下特色的視圖是不容許更新的
1.包含 group by,distinct,分組函數,having,union ,union all
2.常量視圖
3.select中包含子查詢
4.join
5.from一個不能更新的視圖
6.where子句的子查詢引用了from子句中的表
###20.變量
/*
系統變量:
全局變量
會話變量
自定義變量
用戶變量
局部變量
*/
#1、系統變量
#說明:變量由系統提供,不是用戶定義,屬於服務器層面
#使用的語法:
1.查看全部的系統變量
show global|【session】 variables;
2.查看知足條件的部分系統變量
show global|【session】 variables like '%char%'
3.查看指定的某個系統變量的值
select @@ gloable|【session】.系統變量名; //跨鏈接有效
4.爲某個系統變量複製
set gloabal|【session】 系統變量名 = 值;
注意:若是是全局級別,須要加global
若是是會話級別,則須要加session
若是不寫,默認session
#一、全局變量
#做用域:服務器每次啓動將爲全部的全局變量賦初始值,修改針對於全部的鏈接都有效,
可是不能跨重啓(重啓會初始化)
#二、會話變量
#做用域:僅僅針對當前會話(鏈接)有效
#2、自定義變量
/*
說明:變量由用戶定義的,不是系統的
#使用步驟:
聲明
賦值
使用(查看、比較、運算)
*/
#1.用戶變量
#做用域:針對有當前會話(鏈接)有效的,同於會話變量的做用域
#應用:能夠放在begin end任何地方
#①聲明並初始化
賦值的操做符:= 或 :=
set @用戶變量名 = 值;
set @用戶變量名:=值;
select @用戶變量名 :=值;
#②賦值(更新用戶變量的值)
方式一:
set @用戶變量名 = 值;
set @用戶變量名:=值;
select @用戶變量名 :=值;
方式二:經過select 字段 into @變量名
select 字段 into @變量名
from 表;
#③使用(查看用戶變量的值)
select @用戶變量
#2.局部變量
#做用域:僅僅再定義在他的begin end 中有效
#應用:應用在begin end中的第一句話
#①聲明
declear 變量名 類型;
declear 變量名 類型 default 值;
#②賦值
方式一:
set 局部變量名 = 值;
set 局部變量名:=值;
select @局部變量名 :=值;
方式二:經過select 字段 into 變量名
select 字段 into 變量名
from 表;
#③使用
select 局部變量名;
#3.對比用戶變量和局部變量
做用域 定義和使用的位置 語法
用戶變量 當前會話 會話中的任何位置 必須加@符號,不用限定類型
局部變量 begin end中 只能在begin end中,且爲第一句 通常不用加@符號,須要限定類型
###21.存儲過程和函數
/*
#相似於java中的方法
#好處:
1.提升代碼的重用性
2.簡化操做
*/
#存儲過程
#含義:一組預先編譯好的sql語句的集合。
#好處:
1.提升代碼的重用性
2.簡化操做
3.減小了編譯次數和數據庫服務器的鏈接次數,提升效率
#1、建立語法
#語法:
create procedure 儲存過程名(參數列表)
begin
存儲過程體(一組合法的sql語句)
end
注意:
1.參數列表包含三部分
參數模式 參數名 參數類型
舉例 IN stuname VARCHAR(20)
參數模式:
IN:該參數能夠做爲輸入,也就是說該參數需掉用方法傳入值
OUT:該參數能夠做爲輸出,也就是該參數能夠做爲返回值
INOUT:該參數既能夠做爲輸入,又能夠做爲輸出,即該參數既能夠傳入值,也能夠返回值
2.若是存儲過程體僅僅只有一句話,begin end 能夠省略
存儲過程體中的每條sql語句的結尾必須加分號
存儲過程的結尾可使用delimiter從新設置
語法: delimiter 結束標記
案例: delimiter $
#2、調用語法
#語法:
call 存儲過程名(實參列表);
#1.空參列表
#案例:插入到admin表中五條記錄
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO admin (username,PASSWORD)
VALUES('j2','0000'),('j3','0000'),('j4','0000'),('j5','0000'),('j1','0000');
END $
調用:
CALL myp1()$
#2.建立帶in模式參數的存儲過程
#案例1:建立存儲過程實現 根據女神名,查詢對應的男神信息
DELIMITER $
CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
BEGIN
SELECT bo.*
FROM boys bo
RIGHT JOIN beauty b ON b.boyfriend_id = bo.id
WHERE b.name = beautyName;
END $
call myp2('關曉彤')$
#案例2:建立存儲過程實現,用戶是否登陸成功
DELIMITER $
CREATE PROCEDURE myp3 (IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
DECLARE result INT DEFAULT 0;
SELECT COUNT(*) INTO result
FROM admin a
WHERE a.username = username
AND a.password = PASSWORD;
SELECT IF(result>0,'成功','失敗');
END $
#三、建立帶out模式的存儲過程
#案例1:根據女神名,返回對應的男神名
DELIMITER $
CREATE PROCEDURE myp5(IN beautyName VARCHAR(20),OUT bName VARCHAR(20))
BEGIN
SELECT bo.boyName INTO bName
FROM boys bo
INNER JOIN beauty b ON b.boyfriend_id = bo.id
WHERE b.name = beautyName;
END$
調用:
DELIMITER $
CALL myp5('周芷若',@bName)$
SELECT @bName$
#4.建立帶inout模式參數的存儲過程
#案例1:傳入a和b兩個值,最終a和b都翻倍並返回
#2、刪除存儲過程
語法:drop procedure 存儲過程
#3、查看存儲過程的信息
show create procedure myp2;
#函數
#好處:
1.提升代碼的重用性
2.簡化操做
3.減小了編譯次數和數據庫服務器的鏈接次數,提升效率
#區別:
存儲過程:能夠有0個返回,也能夠有多個返回,適合作批量插入、批量更新
函數:有且僅有一個返回,適合作處理數據後返回一個結果
#1、建立語法
create function 函數名(參數列表) returns 返回類型
begin
函數體
end
/*
注意:
1.參數列表 包含兩部分:
參數名 參數類型
2.函數體:確定會有return語句,若是沒有會報錯
若是return語句沒有放在函數體的最後也不會報錯,可是不建議
3.函數體只有一句話,能夠省略begin end
4.使用delimiter語句做爲設置結束標記
*/
#2、調用語法
select 函數名(參數列表)
#1.無參有返回
#案例1:返回公司的員工個數
CREATE FUNCTION myf1()RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;
SELECT COUNT(*) INTO c
FROM employees; RETURN c;
END$
SELECT myf1()
#2.有參有返回
#案例:根據員工名,返回他的工資
#3、查看函數
show create function 函數名
#4、刪除函數
drop function 函數名
###流程控制結構/*順序結構:程序從上往下依次執行分支結構:程序能夠從兩條或多條路徑中選擇一條去執行循環結構:在知足必定條件的基礎上,重複執行一段代碼*/#1、分支結構#1.if函數功能:實現簡單的雙分支語法:select if(表達式1,表達式2,表達式3)執行順序:若是表達式一成立,則if函數返回表達式2的值,不然返回表達式3的值應用:任何地方#2.case結構狀況1:相似於java中的switch語句,通常用於實現等值判斷語法:case 變量|表達式|字段when 要判斷的值1 then 返回的值1或語句1;when 要判斷的值2 then 返回的值2或語句2;...else 要返回的值n或語句n;end case;狀況2:相似於java中的多重if語句,通常用於實現區間判斷語法:case when 要判斷的條件1 then 返回的值1或語句1;when 要判斷的條件2 then 返回的值2或語句2 ;...else 要返回的值n或語句n;end case;特色:①既能夠做爲表達式,嵌套在其餘語句中使用,begin end中或begin end後面能夠做爲獨立的語句去使用,只能放在begin end中②若是when中的值知足或條件成立,則執行對應的then後面的語句,並結束case若是都不知足,則執行else中的語句或值③else能夠省略,若是else省略而且全部when都不知足時,則返回null#案例:建立存儲過程,根據傳入成績,來顯示等級,若是傳入90-100 A 80-90B 60-80 C 其餘DCREATE PROCEDURE test_case(IN score INT) BEGIN CASE WHEN score>=90 AND score<=100 THEN SELECT 'A';WHEN score>=80 THEN SELECT 'B';WHEN score>=60 THEN SELECT 'C'; ELSE SELECT 'D'; END CASE; END$#3.if結構功能:實現多重分支語法:if 條件一 then 語句1;elseif 條件2 then 語句2;...【else 語句n;】end if;應用:在begin end中#案例:建立存儲過程,根據傳入成績,來顯示等級,若是傳入90-100 A 80-90B 60-80 C 其餘D#2、循環結構分類:while、loop、repeat循環控制:iterate相似於 continueleave 相似於break#1.while語法:【標籤:】while 循環條件 do 循環體;end while【標籤】;#2.loop語法:【標籤:】loop循環體;end loop 【標籤】;能夠用來模擬簡單的死循環#3.repeat語法:【標籤:】repeat循環體;until 循環結束的條件end repeat 【標籤】;#沒有添加循環空語句 #案例:批量插入,根據次數插入到admin表中多條記錄DELIMITER $CREATE PROCEDURE pro_while1(IN insertCount INT)BEGINDECLARE i INT DEFAULT 1;WHILE i<=insertCount DOINSERT INTO admin(username ,`password`) VALUE ('rose','6666');SET i = i +1;END WHILE;END$CALL pro_while1(100)$#添加一個leave語句#案例:和上一個相同,若是次數》20則中止DELIMITER $CREATE PROCEDURE pro_while1(IN insertCount INT)BEGINDECLARE i INT DEFAULT 1;a:WHILE i<=insertCount DOINSERT INTO admin(username ,`password`) VALUE (CONCAT('rose',i),'6666');IF i>=20 THEN LEAVE a;END IF; SET i = i +1;END WHILE a;END$CALL pro_while1(100)$