一:MySQL簡介與安裝
? ? MySQL是一種中型评架、易用的關系型數(shù)據(jù)庫管理系統(tǒng)(DBMS,Database Management System)诡壁。
? ? 安裝步驟:
? ? 第一步:? sudo apt-get install mysql-server
? ? 第二步:? sudo apt install mysql-client
? ? 第三步:? sudo apt install libmysqlclient-dev
? ? 進入MySQL環(huán)境:
? ? mysql -u root -p
二:MySQL常用操作命令
? ? 1. show databases;? ? ? # 顯示所有數(shù)據(jù)庫
? ? 2. use 數(shù)據(jù)庫名稱;? ? ? # 進入(使用)某個數(shù)據(jù)庫
? ? 3. show tables;? ? ? ? # 顯示當前數(shù)據(jù)庫中所有的表
? ? 4. desc 表名稱;? ? ? ? # 查看表的結構
三:基本SQL語句
? ? SQL:Structured Query Language深滚,結構化查詢語言惜浅,專門用來操作關系型數(shù)據(jù)庫的
? ? ? ? 語言。
? ? 1. 創(chuàng)建數(shù)據(jù)庫
? ? ? create database 數(shù)據(jù)庫名 [default character set 'utf8'];
? ? 2. 創(chuàng)建表
? ? ? create table 表名稱(
? ? ? ? ? 字段名? 字段數(shù)據(jù)類型? 約束,
? ? ? ? ? 字段名? 字段數(shù)據(jù)類型? 約束,
? ? ? ? ? ......
? ? ? ? ? 字段名? 字段數(shù)據(jù)類型? 約束
? ? ? );
? ? 3. 插入記錄
? ? ? 方式一:
? ? ? insert into 表名稱(字段名1,字段名2,...)values(值1,值2,...);
? ? ? 方式二:
? ? ? insert into 表名稱 values(值1,值2,...);
? ? ? 方式三:
? ? ? insert into 表名稱(字段名1,字段名2,...)values(值1,值2,...),(值1,值2,...),
? ? ? ? (值1,值2,...).....(值1,值2,...);
? ? 4. 修改記錄
? ? ? update 表名稱 set 字段名=修改值 [,字段名=修改值,...] [where 條件];
? ? 5. 刪除記錄
? ? ? delete from 表名稱 [where 條件];
? ? 6. 查詢記錄
? ? ? select 字段列表 from 表名稱 [where 條件];
? ? 7. 增加一個字段
? ? ? alter table 表名 add 新字段的名字? 字段屬性
? ? ? alter table students add sex char(10)
? ? 8. 刪除一個字段
? ? ? alter table 表名 change 老字段名 新字段名 字段屬性;
? ? ? 例如:
? ? ? alter table students change id id int(4) auto_increment;
? ? 9. 修改某個字段 --- 修改屬性
? ? ? alter table students change id id int(4);
? ? 10. 修改某個字段 --- 刪除主鍵
? ? ? ? alter table students drop primary key;
? ? 11. 修改某個字段 --- 添加主鍵
? ? ? ? alter table students add primary key(id);
? ? ? ? alter table students change id id int(4) primary key;
四:限制查詢、分頁查詢、排序查詢、分組查詢
? ? 1.限制查詢
? ? ? 第一種情況:查詢限定條數(shù)
? ? ? select 字段列表 from 表名稱 [where 條件] limit 最多記錄數(shù);
? ? ? 第二種情況:從指定偏移量查詢限定條數(shù)
? ? ? select 字段列表 from 表名稱 [where 條件] limit 偏移量,最多記錄數(shù);
? ? 2.分頁查詢
? ? ? 已知當前頁為currentPage,每頁最多顯示的記錄數(shù)為pageSize,則currentPage頁
? ? ? 顯示的表中的記錄為:
? ? ? select 字段列表 from 表名稱 [where 條件]
? ? ? ? limit (currentPage-1)*pageSize,pageSize;
? ? 3.排序查詢
? ? ? select 字段列表 from 表名稱 [where 條件] order by 字段名[desc] [,字段名...];
? ? 4.MySQL中的聚合函數(shù)
? ? ? A:? max(字段名)? 獲取某字段中的最大值
? ? ? B:? min(字段名)? 獲取某字段中的最小值
? ? ? C:? sum(字段名)? 計算某字段值的和
? ? ? D:? avg(字段名)? 計算某字段的平均值
? ? ? E:? count(字段名) 計算某字段值中不為null的記錄數(shù)
? ? ? ? ? count(*)? 計算表中的總記錄數(shù)
? ? 5.分組查詢
? ? ? select 字段列表 from 表名稱 [where 條件]
? ? ? ? ? group by 分組字段列表 [having 對分組后的篩選條件];
? ? ? 注意:select后的字段列表應該包含在group by后的分組字段列表中!
一:模糊查詢
? ? 模糊查詢中的兩個通配符:
? ? 1.? %? 代表任意多個任意字符
? ? 2.? _? 代表任意一個字符
? ? 模糊查詢的SQL語法:
? ? select 字段列表 from 表名稱 where 字段名 like 匹配條件;
二:外鍵(foreign key)
? ? 外鍵用來約束子表的記錄與父表對應腐缤。
? ? constraint 約束名 foreign key(用來關聯(lián)父表的字段)
? ? ? ? ? ? ? references 父表名(父表中用來關聯(lián)子表的字段,一般為主鍵);
三:多表查詢
? ? 1. 等值連接
? ? ? select 字段列表 from 表A,表B,... where 連接條件 [其他過濾條件];
? ? 2. 內(nèi)連接
? ? ? select 字段列表 from 表A inner join 表B on 連接條件 [其他過濾條件];
? ? 3. 外連接
? ? ? 左外連接:
? ? ? select 字段列表 from 表A left join 表B on 連接條件 [其他過濾條件];
? ? ? 注意:左外連接的查詢結果不但包括了符合連接條件的查詢記錄肛响,而且還包括了
? ? ? ? ? ? 左表中不符合連接條件的記錄岭粤。
? ? ? 右外連接:
? ? ? select 字段列表 from 表A right join 表B on 連接條件 [其他過濾條件];
? ? ? 注意:右外連接的查詢結果不但包括了符合連接條件的查詢記錄,而且還包括了
? ? ? ? ? ? 右表中不符合連接條件的記錄特笋。
例子1:(多表查詢)
1.使用“等值連接”查詢學生姓名剃浇、學生成績、學校名稱猎物。
? select student.name,student.score,school.schoolname?
? ? ? from school,student where student.school_id=school.schoolid;
2.使用“等值連接”查詢出“張紅”的學生姓名虎囚、學生成績、學校名稱蔫磨。
? select student.name,student.score,school.schoolname?
? ? ? from school,student where student.school_id=school.schoolid
? ? ? ? and student.name='張紅';
3.使用“內(nèi)連接”查詢學生姓名淘讥、學生成績、學校名稱堤如。
? select student.name,student.score,school.schoolname?
? ? ? from school inner join student on student.school_id=school.schoolid;
4.使用“內(nèi)連接”查詢出“張紅”的學生姓名蒲列、學生成績窒朋、學校名稱。
? select student.name,student.score,school.schoolname?
? ? ? from school inner join student on student.school_id=school.schoolid
? ? ? and student.name='張紅';
5.先插入一條學校記錄蝗岖,再使用“左外連接”查詢學生姓名侥猩、學生成績、學校名稱,
? 要求顯示所有學校的記錄抵赢。
? insert into school(schoolname,note)values('東北師范',null);
? select student.name,student.score,school.schoolname?
? ? ? from school left join student on student.school_id=school.schoolid;
例子2:(限制欺劳,分頁。铅鲤。划提。。)
1.創(chuàng)建一個名為mydb的數(shù)據(jù)庫
? create database mydb default character set 'utf8';
2.進入mydb
? use mydb;
13:55 2018/5/29
3.創(chuàng)建student表
? create table student(
? ? stuid? int? auto_increment primary key,
? ? name? varchar(20)? not null,
? ? age? ? int,
? ? score? float? ? not null,
? ? note? ? text
? );
4.向student表中插入一條記錄
? insert into student(name,age,score,note)values('風清揚',20,93.5,'風清揚獨孤九劍');
? 插入成功之后邢享,查詢表的所有記錄:
? select * from student;
? insert into student values(23,'令狐沖',18,65.5,'家住華山');
? insert into student(name,age,score)values('郭靖',25,62),('黃蓉',24,73.5),
? ('馬云',40,79.5);
5.把學生表中所有的記錄的成績score改為60分
? update student set score=60;
6.將姓名為“令狐沖”的記錄的成績改為75分
? update student set score=75 where name='令狐沖';
7.刪除學號為27的學生記錄
? delete from student where stuid=27;
8.查詢所有學生的姓名和成績腔剂,并以別名的形式顯示字段
? select name as 姓名,score as 成績 from student;
9.查詢出所有成績在85到95之間的學生記錄
? select * from student where score >=85 and score <= 95;
? 或者
? select * from student where score between 85 and 95;
10.查詢所有備注信息不為null的學生記錄
? select * from student where note is not null;
11.查詢學生表中的前三條記錄
? select * from student limit 3;
12.查詢成績大于等于70分的學生中,前兩條記錄
? select * from student where score >= 70 limit 2;
13.查詢學生表中第三條與第四條記錄
? select * from student limit 2,2;
14.假如每頁最多顯示2條記錄驼仪,查詢第三頁應該顯示的記錄
? select * from student limit 4,2;
15.按照成績從高到低掸犬,將學生排序
? select * from student order by score desc;
16.按照成績從高到低,將學生排序,如果成績相等則再按照年齡降序排序
? select * from student order by score desc,age desc;
===========================以下為分組查詢相應的SQL===========================
17.創(chuàng)建商品表product绪爸,并添加記錄
? create table product(
? ? ? proid? ? int? ? auto_increment? primary key,
? ? ? proname? varchar(20)? not null,
? ? ? price? ? float? not null,
? ? ? type? ? ? varchar(20)? not null,
? ? ? note? ? ? text
? );
? insert into product(proname,price,type,note)values('鍋巴',5,'零食',null),
? ? ('洗衣粉',8,'日用品',null),('可口可樂',12,'飲料','新品上市的Cola'),
? ? ('辣條',2,'零食',null),('臉盆',10,'日用品',null),('薯片',13,'零食',null),
? ? ('脈動',6,'飲料',null);
18.按照商品類型type對product表中的記錄進行分組湾碎,求出每一組的平均價格
? select type as 類型,avg(price) as 平均價格 from product group by type;
19.按照商品類型type對product表中的記錄進行分組,求出零食組的平均價格
? select type as 類型,avg(price) as 平均價格 from product
? ? group by type having type='零食';
例子三:(模糊查詢)
創(chuàng)建worker表
create table worker(
? work_id? int? auto_increment primary key,
? name? ? varchar(20),
? job? ? varchar(20),
? salary? float
);
insert into worker(name,job,salary)values('張二強','修車',5000),
? ('王小剛','美容',3500),('李剛','經(jīng)理',6000),('王娟','老板娘',7000);
1. 查詢所有姓王的工人
? select * from worker where name like '王%';
2. 查詢名字中帶有“剛”的工人
? select * from worker where name like '%剛%';
3. 查詢名字中第二個字是"剛"的工人
? select * from worker where name like '_剛%';
例子四:(外鍵)
學校表
create table school(
? schoolid? ? int? auto_increment primary key,
? schoolname? varchar(30)? not null,
? note? ? ? text
);
insert into school(schoolname,note)values('清華大學','清華大學很好')
? ,('北京大學','北大不錯'),('交大','交大也很好');
學生表
create table student(
? stuid? ? int? auto_increment primary key,
? name? ? varchar(20) not null,
? score? double not null,
? sex? ? varchar(10),
? school_id int,
? constraint fk_student foreign key(school_id) references school(schoolid)
? ? on delete cascade on update cascade
);
insert into student(name,score,sex,school_id)values('張三',92,'男',1),
? ? ('張三豐',96,'男',1),('李娟',88,'女',2),('張紅',86,'女',2),
? ? ('李芬',85,'女',3);
四:子查詢(嵌套查詢)
? ? 在外部查詢SQL語句中奠货,可以包含其他內(nèi)部查詢的語句介褥,這個內(nèi)部查詢(也叫嵌套查詢)
? ? 就是子查詢;子查詢需要使用括號括起來递惋;子查詢的結果一般作為外部查詢語句的條件柔滔。
? ? 子查詢經(jīng)常使用的關鍵字:
? ? 1. in
? ? ? 判斷某字段的值是否在子查詢結果集中
? ? 2. all
? ? ? 判斷某字段的值是否滿足操作符對子查詢結果集所有值的比較
? ? 3. any
? ? ? 判斷某字段的值是否滿足操作符對子查詢結果集任意一個值的比較
五:“一對多”與“多對多”關系表設計
? ? 1. “一對多”關系表設計:
? ? ? ? 在“多”的一方中,設置外鍵萍虽,關聯(lián)“一”的一方睛廊。(eg:學校表("一")與學生表("多"))
? ? 2. “多對多”關系表設計:
? ? ? ? “多對多”關系表的設計需要引入一個中間表,中間表負責維護“多對多”關系表杉编。
? ? ? ? 中間表至少需要包含兩個字段超全,這兩個字段分別用來關聯(lián)這兩個“多對多”的關系表。
? ? ? ? 通常會將這兩個字段設置成外鍵邓馒,關聯(lián)兩個“多”表的主鍵嘶朱。
? ? ? ? 可以通過將這兩個字段設置成聯(lián)合主鍵的方式,用來避免組合值重復光酣。?
六.配置遠程連接MySQL的權限
? 1.sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
? ? 對該文件進行編輯:注釋掉 bind-address = 127.0.0.1
? 2.進入MySQL環(huán)境,授予root用戶所有權限
? ? grant all on *.* to 'root'@'%' identified by '你自己MySQL的root用戶密碼'
? ? ? ? ? ? ? with grant option;
? 3.刷新權限
? ? flush privileges;
? 4.退出MySQL環(huán)境疏遏,并重啟mysql服務
? ? systemctl restart mysql