一.mysql:數據庫軟件
2.1 卸載:
1.停止服務
Win+R-->services.msc-->mysql-->右擊-->停止服務
2.卸載 win+r-->appwiz.cpl-->mysql-->右擊-->卸載
3.手動刪除目錄
* 找到myql的安裝目錄”D:\Program Files\MySQL\MySQL Server 5.5” 下的my.ini (mysql的配置文件),
在在這個文件中 找到datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/",找到datadir對應的
文件夾(尋找過程中放開隱藏文件屬性),將mysql文件夾刪除
* 刪除mysql的安裝目錄
2.2 安裝
詳見安裝文檔
2.3訪問:
進入: Win+R-->cmd-->mysql -u root -p-->root-->enter
退出: exit--exit
2.4 如何修改root密碼
在my.ini的文件做末尾加入 skip-grant-tables
重啓mysql服務,這時的mysql不需要密碼即可登錄數據庫
然後進入mysql
mysql>use mysql;
mysql>更新 user set password=password('新密碼') WHERE User='root';
mysql>flush privileges;
運行之後最後去掉my.ini中的skip-grant-tables,重啓mysqld即可。
2.5 my.ini文件
2.6 各種錯誤參考安裝報錯文檔
二.SQL:Structured Query Language 結構化查詢語言
3.1 概念:
用於操作關係型數據庫的一門語言,它定義了一種操作關係型數據庫的規範
3.2 SQL分類
DDL(*)(Data Definition Language):數據定義語言,用來定義數據庫對象:庫、表、列等;
DML(***)(Data Manipulation Language):數據操作語言,用來定義數據庫記錄(數據);
DCL(Data Control Language):數據控制語言,用來定義訪問權限和安全級別;
DQL(*****)(Data Query Language):數據查詢語言,用來查詢記錄(數據)。
3.3 DDL:操作數據庫和數據表,表中的列
3.3.1 操作數據庫
c: create 創建
* create database 數據庫名稱;
r: read 查詢
* show databases; //查詢所有的數據庫名稱
* show create database 數據庫名稱;//查詢創建的數據庫的詳細信息
u: update 修改
* 修改數據庫的編碼
alter database 數據庫名稱 character set 字符集名稱;//修改數據庫編碼
d: delete 刪除
* drop database 數據庫名稱;//刪除數據庫
3.3.2 操作表:
3.3.2.1 C:創建表
* 數據類型:
int:整型
double:浮點型,例如double(5,2)表示最多5位,其中必須有2位小數,即最大值爲999.99;
char:固定長度字符串類型; char(5) "aa"
varchar:可變長度字符串類型; varchar(5) "aa"
text:字符串類型;
blob:字節類型;
date:日期類型,格式爲:yyyy-MM-dd;
time:時間類型,格式爲:hh:mm:ss
timestamp:時間戳類型 yyyy-MM-dd hh:mm:ss
* 創建表語法:
create table 表名(
列名1 數據類型,
列名2 數據類型,
列名3 數據類型,
...
);
create table stu(
id int,
name varchar(20),
age int,
gender varchar(6)
);
* 每一個字段需要使用逗號(,)隔開。 最後一個字段後 不能加 逗號(,)
* 要想創建表,需要進入數據庫 use 數據庫名稱;
* 向倉庫的表中插入數據
insert into stu values(2,'mary','male',18,'AA is a good student!','1990-02-23 12:34:44');
insert into stu values(3,'lucy','male',18,'BB is a good student!','1990-02-23 12:34:44');
insert into stu values(4,'lily','female',18,'CC is a good student!','1990-02-23 12:34:44');
insert into stu values(5,'smith','male',18,'DD is a good student!','1990-02-23 12:34:44');
insert into stu values(6,'piter','female',18,'EE is a good student!','1990-02-23 12:34:44');
insert into stu values(7,'jack','female',18,'FF is a good student!','1990-02-23 12:34:44');
* 中文插入亂碼的解決方案,執行以下命令
set character_set_client=gbk;
set character_set_results=gbk;
* 查看stu表中的所有數據
select * from stu;
* 完整性約束:保證數據的正確性和完整性
• 非空約束:not null
• 唯一約束:unique
• 主鍵約束:primary key 非空且唯一。一張表只能有一個主鍵
• 主鍵自增長:auto_increment 應該給值null
• 外鍵約束:foreign key
• 外鍵關聯的必須是另一張表的主鍵
• 外鍵和主鍵之間數據類型必須一致
* 表與表的關係:
* 一對一:如果是一對一的關係,外鍵在兩張表加上都可
* 一對多(多對一):一對多或多對一,外鍵應該添加在多的一方
* 多對多:多對多的關係,需要使用中間表來關聯兩張表。中間表的兩個字段都是外鍵
Eg: Create table test(id int ,name varchar(30), FOREIGN KEY (id) REFERENCES tb_tea(id) );
3.3.2.2. R:查詢表
* show tables; //查詢該庫下的所有表名
* desc 表名; // 查詢表的詳細信息
3.3.2.3.:U修改:
* 修改表中的列(字段):
1. 添加列:給stu表添加classname列:
ALTER TABLE stu ADD (classname varchar(100));
2. 修改列類型:修改stu表的gender列類型爲CHAR(2):
ALTER TABLE stu MODIFY gender CHAR(2);
3. 修改列名:修改stu表的gender列名爲sex:
ALTER TABLE stu change gender sex CHAR(2);
4.刪除列:刪除stu表的classname列:
ALTER TABLE stu DROP classname;
* 修改表的名稱
alter table stu rename student;
3.3.2.4.: D:刪除表
* drop table 表名;//刪除表 表沒有了,表上的數據自然也沒有了
3.4 DML: 操作表中的數據 (增、刪、改)
3.4.1 查詢:
select * from stu;
3.4.2 增:添加數據
向表中插入一行數據(所有列上的數據都插入)
insert into stu values(7,'jack','female',18,'FF is a good student!','1990-02-23 12:34:44');
向表中插入一行數據(部分列上的數據都插入)
insert into stu(stuNum,stuName,stuSex,stuAge) values(7,'jack','female',18);
一次插入多行數據
insert into stu values
(2,'mary','male',18,'AA is a good student!','1990-02-23 12:34:44'),
(3,'lucy','male',18,'BB is a good student!','1990-02-23 12:34:44'),
(4,'lily','female',18,'CC is a good student!','1990-02-23 12:34:44'),
(5,'smith','male',18,'DD is a good student!','1990-02-23 12:34:44'),
(6,'piter','female',18,'EE is a good student!','1990-02-23 12:34:44'),
(7,'jack','female',18,'FF is a good student!','1990-02-23 12:34:44');
3.4.3 刪除數據
刪除部分數據
delete from stu where stuNum>=6;
delete from tbName [where 條件];
刪除全部數據
delete from stu; //刪除表中的全部數據
truncate stu; //截斷表中的數據 效率高
3.4.4 改:修改表中的數據
* update 表名 set 字段名稱1=值1, 字段名稱2=值2... [where 條件];
* update stu set stuAge=20; //更新所有人的年紀爲20
* update stu set stuAge=20 where stuNum=5; //更新學號爲5的學生的年齡
* update stu set stuName='jack' ,stuSex='female', stuAge=19 , stuSelf='jack is a good student' where stuNum=5;
修改學號爲5的學生的姓名爲jack,性別爲female,年齡爲19,自我簡介爲”jack is a good student”
3.5 DQL:查詢表中的數據
3.5.1 語法:
select 字段名1 ,字段名2,..... From 表名 where [條件];
3.5.2 條件查詢:
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;
IN(set);
IS NULL;
AND;
OR;
NOT;
導入初始化語句 Init_Stu.sql
-- select 字段名1,字段名2 .... FROM tableName where [條件];
-- 查詢所有的學生信息 查詢所有列
SELECT * FROM stu; -- 效率比較低
SELECT stuId,stuNum,stuName,stuSex,stuAge,stuQQ,stuAddr,stuSkillScore,stuQualityScore FROM stu; --相對上條語句效率高
-- 查詢所有的學生的學號和姓名 查詢部分列
SELECT stuNum,stuName FROM stu;
-- 查詢所有男生的信息 1個限制條件
SELECT stuId,stuNum,stuName,stuSex,stuAge,stuQQ,stuAddr,stuSkillScore,stuQualityScore FROM stu WHERE stuSex='男';
-- 查詢所有19歲男生的學號和姓名 2個限制條件 = and
SELECT stuNum,stuName FROM stu WHERE stuSex='男' AND stuAge=19;
-- 查詢所有大於19歲男生的全部信息 2個限制條件 > &&
SELECT * FROM stu WHERE stuAge>19 AND stuSex='男';
-- 查詢所有大於20歲或小於19歲同學的學號和姓名 or
SELECT stuNum,stuName FROM stu WHERE stuAge>20 OR stuAge<19;
-- 查詢所有大於等於18歲同時小於等於21歲同學的學號和姓名 >= <= between and
SELECT stuNum,stuName FROM stu WHERE stuAge>=18 AND stuAge<=21;
SELECT stuNum,stuName FROM stu WHERE stuAge BETWEEN 18 AND 21;
-- 查詢所有18歲的男生的全部信息或者年齡小於22歲的女生的全部信息 || ()
SELECT * FROM stu WHERE (stuAge=18 AND stuSex='男' ) OR ( stuAge < 22 AND stuSex='女' ) ;
-- 查詢不是19歲學生的信息 !
SELECT * FROM stu WHERE stuAge !=19;
-- 查詢18歲,20歲,22歲的所有男同學的姓名和性別 in
SELECT stuName,stuSex FROM stu WHERE stuSex='男' AND (stuAge =18 OR stuAge = 20 OR stuAge =22);
SELECT stuName,stuSex FROM stu WHERE stuSex='男' AND stuAge IN(18,20,22);
-- 查詢家鄉不明確的學生的信息
-- select * from stu where stuAddr = null; -- 包含null值的查詢,我們不用=
SELECT * FROM stu WHERE stuAddr IS NULL;
3.5.3 模糊查詢:
* like
* 通配符:
_:任意單個字符
%:任意多個字符
-- 查詢姓"張"的學生的所有信息
SELECT * FROM stu WHERE stuName LIKE '張%';
-- 查詢所有河北的學生
SELECT * FROM stu WHERE stuAddr LIKE '河北%';
-- 查詢名字中包含a字符的學生的所有信息
SELECT * FROM stu WHERE stuName LIKE '%a%';
-- 查詢QQ號碼中包含5的所有學生的姓名和性別
SELECT stuName,stuSex FROM stu WHERE stuQQ LIKE '%5%';
-- 查詢姓名2個字符,結尾爲"明"的學生的所有信息
SELECT * FROM stu WHERE stuName LIKE '_明';
3.5.4字段控制
* null參與的運算,結果還爲空
* 使用ifnull解決
ifnull(字段名稱,0):判斷字段是否爲null 如果爲null 就替換爲0
* 別名: as(也可以不用,使用空格)
* 去除重複記錄:DISTINCT
-- 查詢所有學生的學號,姓名,性別,年齡,技能分,綜合素質分,總成績
SELECT stuNum,stuName,stuSex,stuAge,stuSkillScore,stuQualityScore,(stuSkillScore + IFNULL(stuQualityScore,0)) FROM stu;
-- 查詢所有學生的學號,姓名,性別,年齡 要求顯示結果集中的列名爲中文 列的別名
SELECT stuNum AS 學號,stuName 姓名,stuSex 性別,stuAge 年齡,stuSkillScore 技能分,stuQualityScore 綜合素質分,(stuSkillScore + IFNULL(stuQualityScore,0)) 總成績 FROM stu;
-- 查詢所有學生的家鄉分佈,去除多餘選項
SELECT DISTINCT stuAddr FROM stu;
-- 查詢所有學生的學號,姓名,性別,年齡,技能分,綜合素質分,總成績 表的別名
SELECT s.stuNum,s.stuName,s.stuSex,s.stuAge,stuSkillScore,stuQualityScore,(stuSkillScore + IFNULL(stuQualityScore,0)) FROM stu s;
3.5.5 排序:
* order by 字段名稱 排序方式
* 排序方式:
* asc :默認值,升序
* desc:降序
* 聚合函數
聚合函數是用來做縱向運算的函數:
COUNT():統計指定列不爲NULL的記錄行數;
MAX():計算指定列的最大值,如果指定列是字符串類型,那麼使用字符串排序運算;
MIN():計算指定列的最小值,如果指定列是字符串類型,那麼使用字符串排序運算;
SUM():計算指定列的數值和,如果指定列類型不是數值類型,那麼計算結果爲0;
AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果爲0;
-- 查詢學生的全部信息,以技能分降序排列 單條件排序
SELECT * FROM stu ORDER BY stuSkillScore DESC;
-- 查詢學生的全部信息,以技能分降序排列,技能分相同的條件下,以綜合素質分降序排序 多條件排序
SELECT * FROM stu ORDER BY stuSkillScore DESC ,stuQualityScore DESC ;
-- 查詢學生的人數
SELECT COUNT(*) FROM stu; -- 效率低
SELECT COUNT(stuId) FROM stu; -- 效率高
-- 查詢學生的平均年齡,最大年齡,最小年齡
SELECT AVG(stuAge) 平均年齡 ,MAX(stuAge) 最大年齡 ,MIN(stuAge) 最小年齡 FROM stu;
3.5.6 分組查詢
* group by 字段
* 注意:在查詢的字段中,建議只寫分組字段和聚合函數
* 分組之後的條件篩選:having
* where 和 having 區別?
where 在分組前對數據進行過濾
having 在分組後進行過濾
-- 查看男生和女生的人數 單條件分組
SELECT stuSex,COUNT(*) FROM stu GROUP BY stuSex
-- 查看不同年齡段男生和女生的人數 多條件分組
SELECT stuAge , stuSex,COUNT(stuId) FROM stu GROUP BY stuAge , stuSex;
-- 查看2015JavaEE學科男生和女生的人數 條件過濾之後再進行分組
SELECT stuSex,COUNT(stuId) FROM stu WHERE stuNum LIKE '2015JavaEE%' GROUP BY stuSex;
-- 學習人數大於3個學員集中在哪些年齡 分組之後進行過濾
SELECT stuAge,COUNT(stuId) AS num FROM stu GROUP BY stuAge HAVING num>3;
3.5.7. 時間日期函數
* 獲得當前日期+時間(date + time)函數:now()
* MySQL 獲得當前時間戳函數:current_timestamp()
* 獲取指定時間的年份,月份 year() month()
3.5.8 union all
3.5.7多表查詢
* 笛卡爾積:
DROP TABLE xx;
DROP TABLE yy;
CREATE TABLE XX( aa INT, bb INT);
CREATE TABLE YY( cc INT, dd INT );
INSERT INTO XX VALUE(1,1),(2,2);
INSERT INTO YY VALUE(3,3),(4,4);
SELECT * FROM XX;
SELECT * FROM YY;
SELECT * FROM xx,yy; --SQL 92語法
SELECT * FROM xx JOIN yy; --SQL 99語法
* 內連接:等值連接 =
DELETE FROM xx;
DELETE FROM yy;
INSERT INTO XX VALUE(1,1),(2,2);
INSERT INTO yy VALUE(1,1),(3,3);
SELECT * FROM xx JOIN yy ON xx.aa=yy.cc;
* 外連接
* 左外連接
* 右外連接
SELECT * FROM XX LEFT JOIN YY ON xx.aa=yy.cc;
SELECT * FROM XX RIGHT JOIN YY ON xx.aa=yy.cc;
* 自連接
查詢員工的姓名,職務以及上司的姓名.
SELECT e1.empName,e1.empSelf,e2.empName FROM emp e1 JOIN emp e2 ON e1.bossId=e2.empNum;
總結:我們開發的時候一般能夠按照需求正確的建立好各種表即可,更改表結構的機率不是很多.重點是對數據的操作.
所以咱們今天的重點就是:
* 創建倉庫
* 創建表(正確的使用各種約束,正確的創建具有關聯關係的表)
* 表中數據增刪改查操作
* 多表查詢是今天的重難點