MySQL學習入門總結(很是重要)

MySQL數據庫學習總結

——一、數據庫概述
一、MySQL數據庫屬於一種開源的關係型數據庫,屬於Oracle公司;
二、MySQL數據庫的登陸與退出
(1)MySQL能夠在命令行工具shell的方式登陸(MySQL自帶命令行工具和cmd(mysql -h 127.0.0.1 -u root -p 而後輸入密碼)都可登陸)
(2)MySQL的退出:exit;quit;\q;三種推出的方式
三、MySQL修改提示符:MySQL默認的提示符爲mysql>,能夠經過prompt 所修改提示符來進行修改
四、MySQL數據庫語句語法:
(1)關鍵字和函數大寫;
(2)其餘通常小寫;
(3)語句以分號結尾
五、常見的數據庫語句:
(1)建立數據庫:create database test;(全語句:CREATE DATABASE IF NOT EXISTS t2 CHARACTER SET gbk;)
(2)查看當前的數據庫:show databases;
(3)修改數據庫:ALTER DATABASE T2 CHARACTER SET utf8;(數據庫修改編碼方式)
(4)刪除數據庫:DROP DATABASE IF EXISTS T1;
(5)超級用戶:root;默認的端口號:3306

——二、數據庫的數據類型和數據表操做
一、MySQL的數據類型主要有:整型int、浮點型float、字符串型和時間日期型
二、MySQL字符串類型的數據中ENUM("value1","value2"...)用來選擇其中一個,而SET("value1","value2"...)用來選擇其中數字的排列組合,更多,並不是一個
三、數據表的行稱爲記錄,而列稱之爲字段
四、USE是用來打開數據庫的操做方法:USE DATABASE名稱,以後可使用SELECT DATABASE();來進行查看咱們打開的數據庫是否爲咱們需打開的數據庫
五、建立一個數據表,裏面的細節列名稱和數據類型(unsigned是指無符號位,從0開始):
mysql> CREATE TABLE tb1(
-> username varchar(20),
-> age tinyint unsigned,
-> salary float(8,2) unsigned
-> );
Query OK, 0 rows affected (0.04 sec)
六、查看數據表格:show tables;(查看當前數據庫裏面包含的數據表);show tables from database-1;(查看database-1數據庫裏面包含的數據表)
七、查看當前所處的數據庫:select database();
八、查看數據表的結構,即展現數據表格的列屬性組成:show columns from tablename;
九、數據表格記錄的插入與查找:
(1)插入:兩種方式:所有插入與部分插入
insert tb1 values("TOM","25","257863.25",...);
insert tb1(username,salary) values("JONE","2304050.21")
(2)查找:
select * from tablename #展現整個表格的內容
十、數據表字段特徵的屬性定義:NULL 字段值能夠爲空,NOT NULL 字符段禁止爲空
create table tb2(username varchar(20) not null,age tinyint null);
十一、爲了防止記錄的重複性,主鍵約束primary key和auto_increment自動編碼方式,主鍵能夠保證不能夠出現重複的值,而且一個數據表只能擁有一個主鍵,屬性爲not null
十二、自動編號auto_increment必須和逐主鍵約束primary key一塊兒使用,可是主鍵約束不必定和自動編號使用
(1)CREATE TABLE tb3(id smallint unsigned auto_increment primary key,username varchar(20) not null);
(2)CREATE TABLE tb4(id smallint unsigned primary key,username varchar(20) not null);
1三、惟一約束unique key :能夠保證記錄的惟一性,和主鍵約束相似,不過兩者也有區別:
(1)一個數據表能夠包含多個惟一約束,可是隻能擁有一個主鍵約束;
(2)惟一約束能夠爲空null,主鍵約束不能夠爲空爲not null;
(3)兩者建立索引的方式也不同
1四、默認約束default:在寫入記錄時,若是沒有明確的字段,系統賦值默認值
create table tb6(
-> id smallint unsigned auto_increment primary key,
-> username varchar(20) not null unique key,
-> sex ENUM("boy","girl","no") default "no");
1五、對於無符號數的字段,在屬性規定時須要加上unsignedphp

——三、數據庫的約束和相關操做(列操做)
一、show create table province;能夠用來展現新建立表格的引擎類型和基本信息內容
二、外鍵約束主要是爲了創建起來父表和子表之間的關係,必須爲innoDB的存儲引擎,主要有惟一約束,主鍵約束,外鍵約束,not null等
三、另外對於父表和子表之間的參照列必須具備類似的屬性(數字則相同,字符串則類似),具備外鍵約束的是字表,參照的父表
四、外鍵列和參照列必須建立索引,若是不建立,MySQL將要自動建立
五、顯示數據表的索引語句:show indexes from tablename\G(表格形式展現)
六、外鍵約束的參照操做:CASCADE、SET NULL、RESTRIC、NO ACTION等
create table users1(
-> id smallint unsigned primary key auto_increment,
-> username varchar(10) not null,
-> pid smallint unsigned,
-> foreign key(pid) references province(id) on delete cascade);
七、外鍵約束在操做數目的多少角度上能夠劃分爲列級約束(1個列)和表級約束(多個列)
八、not null 和default約束不存在表級約束,惟一,主鍵和外鍵約束既有表及約束,也有列級約束
九、數據表添加列操做語句
alter table users1 add age tinyint unsigned not null default 10;(默認往最後添加)
alter table users1 add password varchar(30) not null after username;(after在某一列以後添加)
alter table users1 add truename varchar(10) not null first;(first在數據表第一列添加)
十、添加多列不能指定添加的位置,只能夠添加子最後面
十一、數據表刪除列語句:
alter table users1 drop truename;(單列刪除)
alter table users1 drop id,drop age;(多列刪除)
十二、添加約束:
alter table users2 add constraint pk_users2_id primary key (id);添加主鍵約束
alter table users2 add unique(username);添加惟一約束
alter table users2 add foreign key(pid) references province(id);添加外鍵約束
alter table users2 alter age set default 15;添加默認約束
alter table users2 alter age drop default;刪除默認約束
1三、刪除約束:
alter table users2 drop primary key;刪除主鍵約束
alter table users2 drop index username;刪除惟一約束
alter table users2 drop foreign key users2_ibfk_1;刪除外鍵約束使用約束名稱便可
alter table users2 drop index pid;刪除外鍵約束須要注意還要刪除索引
1四、修改列定義(change和modify都可,change更加全面)
(1)修改列的位置先後-modify
alter table users2 modify id smallint unsigned not null first;把某一列放在前面
alter table users2 modify id smallint unsigned not null after username;把某一列放在username列以後
(2)修改列的屬性定義,數據類型等-modify
alter table users2 modify id tinyint unsigned not null first;修改列屬性定義,數據類型等,從大類型到小類型注意必定要防止數據丟失
(3)修改列名稱-change
alter table users2 change pid p_id tinyint unsigned not null;
15.修改數據表的名稱:
(1)alter table users2 rename users3;
(2)rename table users3 to users2;mysql

——四、數據表的記錄操做(行操做)
一、insert插入操做
(1)第一種方法 insert values方法
insert user values(NULL,"john","456",45,"0");插入時,須要注意對於默認的字段或者自動編碼的字段能夠輸入null或者default都可
insert user values(default,"mary","4yjy6",15,1);
insert user values(default,"my","4y6",default,1);對於默認值的字段,能夠直接輸入default設置爲默認值
insert user values(default,"my","4y6",default,1),(null,"yanjd",md5("123"),default,1);插入多個紀錄語句,md5是指輸出某一個字段的哈希
insert tb1(username,salary) values("JONE","2304050.21");部分值插入
(2)第二種方式 insert set 方法
insert user set username="ben",passward="456",age=12,sex=1;
(3)第三種方法 insert select語句
經過查詢的結果寫入數據表
二、updata數據表的更新-單表操做
update user set age=age+5;直接更新某一列的值
update user set age=age-id,sex=0;直接更新多列的值
update user set age=age+10 where id%2=0;條件更新語句
三、delete刪除操做-單表操做
delete from user where id=6;刪除id=6這個記錄,即整行刪除
四、查詢表達式select語句
select id,username from user;查找數據表中的某幾列數據
select * from user;查找全部的列數據
select user.id,user.username from user;區別多個數據表中相同的字段列數據
select id as userid,username as uname from user;能夠修改輸出字段名稱
五、where語句進行條件的判斷
delete from user where password="22";
六、groupby函數主要對查詢結果進行分組(默認進行升序)
select sex from user group by sex(列名);
select age from user group by age desc;(降序排列)
七、having語句喲關於條件的指定
select sex from user group by sex having count(id)>2;聚合函數不須要在前面select
select sex,age from user group by age having age>30;普通狀況須要在前面指定查找
八、order by函數用於對於查詢結果進行排序操做(asc/desc升降序,默認asc升序)
select * from user order by id;默認按照id升序排列
select * from user order by id desc;按照id降序排列
select * from user order by age,id desc;按照age升排列age相同時按照id降序排列
九、limit語句限制返回結果(抽取某一些行操做)
select * from user limit 2; 取前兩行數據
select * from user limit 2,2 取第三行開始的後兩行數據
select * from user order by id desc limit 2,2; 按照id降序排列以後進行取第三行以後的2行數據
十、字表插入語句insert select語句
insert test(username) select username from user where age>=10;
在test表格的username中插入從user表中查到的age>=10的記錄的usernameweb


——五、MySQL子查詢與鏈接
一、set names gbk: 設置客戶端的顯示形式爲gbk(若是以前設置是utf-8編碼則顯示出來文字不能識別)
二、子查詢指嵌套在查詢內部,必須在圓括號裏使用,返回值是一個標量、一行也開始是一個數據表
三、子查詢是指在另外一個查詢裏面的select子句
四、在進行數據表的寫入時,默認是不容許寫入漢字的,所以須要修改一下編碼格式:
show full columns from phplamp; 檢查數據表全部字段的狀態
alter table phplamp change address address varchar(100) character set utf8 collate utf8_unicode_ci not null; 修改成utf8編碼格式
set names gbk;將客戶端修改成gbk來顯示數據字段
五、子查詢語句:
select avg(goods_price)from tdb_goods;求取某一列的平均值
select round(avg(goods_price),2) from tdb_goods;求取某一列的平均值,保留兩位小數
select goods_id,goods_name,goods_price from tdb_goods where goods_price>=5636.36;查找價格大於平均值的商品的id,name和price
select goods_id,goods_name,goods_price from tdb_goods where goods_price>=(select round(avg(goods_price),2) from tdb_goods);子查詢方式
select goods_price from tdb_goods where goods_cate="超級本"; 選擇輸出超極本筆記本的價格
select * from tdb_goods where goods_cate="超級本"\G;列顯示超極本筆記本的基本信息
六、一些子查詢關鍵字any/some/all/not in/in/
select goods_id,goods_name,goods_price from tdb_goods where goods_price>=any(select goods_price from tdb_goods where goods_cate="超級本");若是子查詢返回並不是一列多個值時須要添加any,all,some
select goods_id,goods_name,goods_price from tdb_goods where goods_price=any/some(select goods_price from tdb_goods where goods_cate="超級本");大於等於,小於等於可使用any和all,可是等於只能夠用some/any
select goods_id,goods_name,goods_price from tdb_goods where goods_price not in(select goods_price from tdb_goods where goods_cate="超級本")\G;not in和!=all是等效的
select goods_cate from tdb_goods group by goods_cate;使用group by函數進行結果的分類統計
insert tdb_goods_cate(cate_name) select goods_cate from tdb_goods group by goods_cate; insert-select語句查詢
七、多表更新函數
多步更新:
update tdb_goods inner join tdb_goods_cate on goods_cate=cate_name set goods_cate =cate_id; 內鏈接更新方式,多步更新—創鍵表-經過insert-select寫入記錄-表的更新
一步更新方式:crested select函數:
create table tdb_goods_band(
-> band_id smallint unsigned primary key auto_increment,
-> brand_name varchar(50)character set utf8 collate utf8_unicode_ci not null) 編碼方式爲utf8漢字可輸入型
-> select brand_name from tdb_goods group by brand_name;
更新結束以後咱們須要將數據列的名稱和屬性一塊兒修改:
alter table tdb_goods
-> change goods_cate cate_id smallint unsigned not null,
-> change brand_name brand_id smallint unsigned not null;
將字符型修改成數字型,縮小佔用空間
八、多表鏈接
內鏈接:只顯示兩個表符合鏈接條件的記錄
select goods_id,goods_name,cate_name from tdb_goods inner join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
左外鏈接:顯示左邊所有記錄以及右邊符合條件的記錄
select goods_id,goods_name,cate_name from tdb_goods left join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
右外鏈接:鏈接右表的所有記錄以及左表符合條件的記錄
select goods_id,goods_name,cate_name from tdb_goods right join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
多個表之間的鏈接(和兩個錶鏈接是類似的)
select goods_id,goods_name,cate_name,brand_name,goods_price from tdb_goods as g inner join tdb_goods_cate as c on g.cate_id=c.cate_id inner join tdb_goods_band as b on g.brand_id=b.band_id;
九、無線級分類表的設計(子結構鏈接)
CREATE TABLE tdb_goods_types(
type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
type_name VARCHAR(20) character set utf8 collate utf8_unicode_ci not null,
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
);
自身鏈接方式-相互嵌套
select s.type_id,s.type_name,count(p.type_name) from tdb_goods_types as s left join tdb_goods_types as p on s.parent_id=p.type_id;左表爲子表
select p.type_id,p.type_name,count(s.type_name) from tdb_goods_types as p left join tdb_goods_types as s on s.parent_id=p.type_id group by p.type_name order by p.type_id;右表爲父表
十、多表刪除
(1)記錄重複合併操做:
select goods_id,goods_name from tdb_goods group by goods_name; 以goods_name做爲重複合併的字段
(2)多表刪除-對照刪除
delete t1 from tdb_goods as t1 left join (select goods_id,goods_name from tdb_goods group by goods_name having count(goods_name)>=2) as t2 on t1.goods_name=t2.goods_name where t1.goods_id>t2.goods_id;sql


——六、數據庫運算符和函數
一、字符函數:
(1)concat:字符鏈接
select concat("mysql","imooc");
+-------------------------+
| concat("mysql","imooc") |
+-------------------------+
| mysqlimooc |
+-------------------------+
(2)concat_ws()函數
select concat_ws("|","mysql","imooc");
+--------------------------------+
| concat_ws("|","mysql","imooc") |
+--------------------------------+
| mysql|imooc |
+--------------------------------+
(3)format函數:數字格式化函數
select format(1256.452,2);
+--------------------+
| format(1256.452,2) |
+--------------------+
| 1,256.45 |
+--------------------+
(4)lower(字母)函數:字母小寫化;upper(字母):字母大寫
(5)left("mysql",2)和right()函數:獲取左側2位字符和和右側字符
(6)length()函數:獲取字符串的長度
(7)select ltrim/rtrim/trim(" mysql "):刪除字符串前面/右面/先後都刪的空格
+--------------------+
| ltrim(" mysql ") |
+--------------------+
| mysql |
+--------------------+
(8)trim()函數其餘功能:
select trim(leading "?" from "??mysql??");刪除前面的問號)
select trim(trailing "?" from "??mysql??");刪除後面的問號
select trim(both "?" from "??mysql??");刪除先後的全部的問號
+-------------------------------------+
| trim(trailing "?" from "??mysql??") |
+-------------------------------------+
| ??mysql |
+-------------------------------------+
(9)select replace("??mys??ql??","?","");替換函數
+-------------------------------+
| replace("??mys??ql??","?","") |
+-------------------------------+
| mysql |
+-------------------------------+
(10)select substring("mysql",2,1);字符截取函數:從第2位截取,截取1位
+------------------------+
| substring("mysql",2,1) |
+------------------------+
| y |
+------------------------+
(11)not like/like 函數:模式匹配函數:%表明任意一個字符,_表明任意一個字符
若是要匹配一個字符中是否含有某一個字母可用:
select * from test where first_name like "%o%":找到含有o字母的記錄
若是是找含有%時須要注意,比較特殊:
select * from test where first_name like "%1%%" escape "1";
二、數值運算符函數
(1)+-x/等四則運算函數
(2)ceil(23.2):進1取整
(3)floor(23.2):舍一取整
(4)3 div 4:整數除法
(5)5 mod 3取餘數
(6) select power(2,10)冪運算
(7)round(3.25)四捨五入函數
(8)select truncate(125.89,2);數字截取函數,截取到小數點後2位
三、比較運算符和函數
(1) select 15 between 1 and 20;數字15在1和20之間嗎?
(2) select 10 in(5,10,15,20);查看10是否在這個括號裏面
(3) select 0 is null;查看0是否爲空
四、日期時間函數:
(1)select now();展現當前時間
(2)select curdate 展現當前日期
(3)select curtime 展現當前時間
(4)select dataadd 展現時間的增長和減小
select date_add("2014-3-12",interval 365 day);在2014年3月12日增長365天
select date_add("2014-3-12",interval 5 month)在2014年3月12日增長5個月
(5)select datediff("2013-3-12","2017-2-23");查詢兩個日期相差幾天()
(6)select date_format("2014-3-12","%m/%d/%Y");進行日期格式的轉換
+-------------------------------------+
| date_format("2014-3-12","%m/%d/%Y") |
+-------------------------------------+
| 03/12/2014 |
+-------------------------------------+
五、信息函數:
(1)select connection_id();返回鏈接ID
(2)select database();返回當前數據庫;
(3)select user();返回當前用戶
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
(4) select version();返回當前的版本
+------------+
| version() |
+------------+
| 5.6.47-log |
+------------+
(5)select last_insert_id()返回最後寫入的記錄號,多條寫入時只輸出第一個寫入記錄時的id
六、聚合函數
(1)select AVG(id)from test 求其id平均值
(2)select count(id)form test 求取id的數目
(3)max()最大值
(4)min()最小值
(5)sum()求和函數
七、加密函數
MD5:加密函數-爲web頁面作準備
select md5("admin");
+----------------------------------+
| md5("admin") |
+----------------------------------+
| 21232f297a57a5a743894a0e4a801fc3 |
+----------------------------------+
password:密碼計算函數:修改密碼set password=password("yjy2020")
select password("admin");
+-------------------------------------------+
| password("admin") |
+-------------------------------------------+
| *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+-------------------------------------------+shell

——七、自定義函數
一、自定義函數不必定含有參數,可是必定含有返回值
二、MySQL函數的參數不能超過1024個參數
三、調整時間格式:select date_format(now(),"%Y年%m月%d日 %H點%i分%s秒");
+-------------------------------------------------+
| date_format(now(),"%Y年%m月%d日 %H點%i分%s秒") |
+-------------------------------------------------+
| 2020年04月03日 11點31分54秒 |
+-------------------------------------------------+
四、建立時間格式轉換函數,不含有參數:
create function f1() returns varchar(30) character set utf8 collate utf8_unicode_ci
-> return date_format(now(),"%Y年%m月%d日 %H點%i分%s秒");
調用這個函數:
select f2();
+------------------------------+
| f2() |
+------------------------------+
| 2020年04月03日 11點36分39秒 |
+------------------------------+
五、建立帶有參數的自定義函數
create function f3(num1 smallint unsigned,num2 smallint unsigned)
-> returns float(10,2) unsigned
-> return (num1+num2)/2;
調用這個函數
select f3(21,21)
六、建立具備複合結構函數體的自定義函數
結尾標誌修改:delimiter//將結尾標誌符號改成//
建立複合型帶參數的自定義函數
delimiter//
create function adduser(username varchar(20))
-> returns int unsigned
-> begin
-> insert test(username)values (username);
-> return last_insert_id();
-> end
-> //數據庫

——八、MySQL存儲過程
一、MySQL執行語句過程:SQL語句—>MySQL引擎—>語法分析—>編譯爲可識別命令—>執行命令—>輸出返回值—>客戶端
二、存儲過程是一種預編譯,將結果存儲在內存中,只有在第一次時會分析和執行,在以後直接調用相應的結果便可,效率更快,而且能夠返回多個值
三、存儲過程的優勢:
(1)加強了SQL語句的功能和靈活性
(2)實現較快的執行速度
(3)減小網絡流量
四、建立不帶參數的存儲過程:
create procedure sp1() select version();
call sp1;調用存儲過程(不帶參數)
call sp1();調用存儲過程(不帶參數)
+------------+
| version() |
+------------+
| 5.6.47-log |
+------------+
五、建立帶有in類型參數的存儲過程,不沒有返回過程:
create procedure removeuserbyid(in id int unsigned)
-> begin
-> delete from user where id=id;注意id傳入參數和表中字段不能相同,否則將刪除全部記錄,而非原本id記錄
-> end
-> //
以上方式不正確,下面是正確方式
delimiter //
create procedure remove(in id1 int unsigned)
-> begin
-> delete from test1 where id=id1;
-> end
-> //
call remove(2) 刪除id爲2的記錄
六、建立帶有in和out的存儲過程,帶返回變量,其中返回變量可使用用@num能夠表示
delimiter //
create procedure remove1(in pid int unsigned,out usernum int unsigned)
-> begin
-> delete from test1 where id =pid;
-> select count(id) from test1 into usernum;
-> end
-> //
刪除id記錄以後,返回剩餘數據表記錄總數
call remove1(2,@nums)//
select @nums
七、begin end 之間的變量屬於局部變量,而set @i=7稱之爲用戶變量
八、select row_count();是指輸出影響的記錄數
九、建立多個out參數的存儲過程
delimi//
create procedure remove2(in age1 smallint unsigned ,out deletenum smallint unsigned ,out usercounts smallint unsigned)
-> begin
-> delete from test1 where age=age1;
-> select row_count() into deletenum;
-> select count(id) from test1 into usercounts;
-> end
-> //
call remove2(22,@i,@j)// 調用存儲過程
select @i,@j// 輸出多個out返回值
十、存儲過程和自定義函數的區別
(1)存儲過程功能更加複雜一些,而函數針對性更強
(2)存儲過程能夠返回多個值,而函數只能夠有一個返回值
(3)存儲過程通常獨立來執行,而函數能夠做爲其餘SQL語句組成部分來出現
十一、存儲過程修改不了過程體,如要修改,則先刪除再從新建立安全

——九、存儲引擎簡介
一、查看一個數據表的存儲引擎通常使用show create table test來進行查看,裏面顯示出來ENGINE=InnoDB,代表其存儲引擎是InnoDB
二、MySQL將數據以不一樣的技術將數據存儲在文件或者內存中,這種技術稱之爲存儲引擎
三、MySQL支持的存儲引擎主要有如下五種:MyISAM/InnoDB/Memory/CSV/Archive
四、處理方式1:併發控制處理:共享鎖(讀操做)和排他鎖(寫操做)
五、鎖顆粒:表鎖(開銷最小鎖策略)和行鎖(開銷最大鎖策略)
六、處理方式2:事務:事務用於保證數據庫的完整性
事務的特性:原子性、一致性、隔離性和持久性
七、索引和外鍵都可保證數據的相關性、一致性和特性性
八、不一樣存儲引擎的特色是不同的
九、InnoDB存儲引擎存儲限制爲64TB,支持事務安全和索引,支持行鎖和外鍵,不支持數據壓縮
十、CSV不支持索引,是一種文本形式的存儲方式,黑洞引擎通常寫入的數據會消逝,通常用於數據複製過程當中的中繼
十一、通常使用最多的是InnoDB(適用於事務處理較多和使用外鍵的狀況)和MyISAM引擎(適用於事務處理很少的狀況)
十二、設置存儲引擎的方法:
(1) 建立數據表的時候設置引擎方式:
create table t1(
-> sa varchar(20))
-> ENGINE=MyISAM;
(2)在MySQ配置文件裏面修改
(3)修改存儲引擎方法:
alter table t1 engine=innodb;網絡

——十、MySQL圖形化管理方式
一、MySQL的圖像化管理方式主要有如下幾種:MySQL workbench CE、Navicat以及PHPMyadmin
二、最多見的最經常使用的仍是Navicat for MySQL的圖形管理方式併發

相關文章
相關標籤/搜索