JavaWeb-14 MySQL
SQL
一、SQL簡介
SQL:Structured Query Language的縮寫
中文名稱:結構化查詢語言
作用:是一種定義、操作、管理關係數據庫的句法。大多數關係型數據庫都支持。
結構化查詢語言的工業標準由ANSI(美國國家標準學會,ISO的成員之一)維護。
二、常用數據庫
1、Oracle、DB2、Informix、Sybase、SQL Server、ProstgreSQ面向對象數據庫、MySQL、Access、SQLite(手機使用)等,數據庫的模型有這幾類:層次模型、網狀模型、關係模型(大部分數據庫)。
2、如何安裝MySQL?
3、數據庫服務器、數據庫和表的關係:
所謂安裝數據庫服務器,只是在機器上裝了一個數據庫管理程序,這個管理程序可以管理多個數據庫,一般開發人員會針對每一個應用創建一個數據庫。
爲保存應用中實體的數據,一般會在數據庫創建多個表,以保存程序中實體的數據。
數據庫服務器、數據庫和表的關係如圖所示:
Client(SQL語句)(今天的關鍵)---->MySQL(Server)---->操作數據庫、數據庫的表
三、創建數據庫
1、DDL數據定義語言:Data Definition Language
作用:用於描述數據庫中要存儲的現實世界實體的語言。即創建數據庫和表的結構。
常用關鍵字:CREATE ALTER DROP TRUNCATE
2、登錄MySQL:
指令:mysql -u root -p
3、創建數據庫:
指令:create database 數據庫名;
例如:create database day14;
創建數據庫時指定字符集:
指令:create database day14 character set gbk;
4、查看服務器上所有的數據庫:
指令:show databases;
5、查看創建數據庫的代碼:
指令:show create database 數據庫名;
實例:show create database day14;
6、 修改某個數據庫的編碼
指令:alter database 數據庫名 character set 字符編碼;
實例:alter database day14 character set utf8;
7、刪除數據庫
指令:drop database 數據庫名;
實例:drop database day14;
8、使用某個數據庫
指令:use 數據庫名;
四、在數據庫中新建表
表結構的引入:爲什麼要用表結構?建表:(雖然表裏不是java代碼,但是java程序員需要想辦法存進表裏:
一個類中有多少個屬性:對應表中多少列,一個類中有多少個對象,對應到表裏就有多少行----->框架(系統架構師設計的來限制程序員編程的框架))。
1、建表
指令:
create table 表名(
字段名 數據類型,
字段名 數據類型
);
實例:
create table Employee(
id int,
name varchar(20),
gender char(4),
birthday datetime,
entry_date datetime,
job varchar(100),
salary float(10,2),
resume text
);
char 與 varchar的區別:固定與可變(效率不一樣)
2、顯示當前數據下所有的數據表:
指令:show tables;
3、查看創建表的代碼
指令:show create table 表名;
實例:show create table employee;
4、查看錶的明細,以列表的形式顯示出結果
指令:desc 表名;/describe表名;
實例:desc employee;/describe employee;
五、修改表的列
1、添加一列
指令:alter table 表名 add 列名 類型;
實例:在上面員工表的基本上增加一個image列:alter table employee add image blob;
2、修改某列的數據類型
指令:alter table 表名 modify 列名 新的數據類型;
實例:修改job列,使其長度爲60:alter table employee modify job varchar(60);
3、刪除某列:
指令:alter table 表名 drop 列名;
實例:刪除image列:alter table employee drop image;
4、修改表名:
指令:rename table 舊錶名 to 新表名;
實例:表名改爲user:rename table employee to user;
5、修改表的字符集:
指令:alter table 表名 character set 字符集編碼
實例:修改表的字符集爲gbk:alter table user character set gbk;
6、修改列名
指令:alter table 表名 change column 舊列名 新列名 數據類型;
實例:列名name修改爲username
alter table user change column name username varchar(100);
7、刪除表結構
指令:drop table 表名;
實例:drop table user;
六、CRUD操作:
DML數據操縱語言:Data Manipulation Language
作用:用於向數據庫表中插入、刪除、修改數據。
常用關鍵字:INSERT UPDATE DELETE
DQL數據查詢語言(簡單的):Data Query Language
作用:查詢數據。
常用關鍵字:SELECT
1、插入:
指令:insert into 表名[(列名,列名)] values(值1,值2);
實例:字符和日期型數據應包含在單引號中:insert into employee (id,name,sex,birthday,salary,entry_date,resume) values(1,'cgx','男','1982-10-1',10000,'2000-10-1','服務業幹得不錯');
在輸入命令之前:爲了讓服務器顯示時和客戶端輸入時不會出現亂碼現象,我們可以對服務器進行設置,操作如下:
2、刪除數據:
指令:delete from 表名 【where條件】
實例:delete from employee where name='cgx';
實例2: delete from employee;//清除表中所有記錄
實例3: truncate table employee;//清除表中所有記錄
區別:
a.truncate table 刪除數據效率更高(先摧毀整個表結構,再重建表)
b.delete 刪除所有記錄時,一條一條往後刪除
c.truncate table只能刪除所有
d.delete可以選擇性的刪除部分記錄
3、更新
指令:update 表名 set 列名=值,列名2=值2 where 條件;
實例:update employee set name='阿嬌',gender='女' where name='aj';
4、查詢:(重點!!)
用*代表所有列
distinct可以消除重複數據
order by 如果指定了多個排序字段,優先按第一個字段排,如果第一個字段取值相同時,才考慮第二個字段排序
指令: select 列名 [as] 改列名,列名 from 表名 where 條件 order by 排序字段 (ASC(默認值) | DESC)
實例:查詢表中所有學生的信息:select * from student;
實例:查詢表中所有學生的姓名和對應的英語成績:select name,english from student;
實例:過濾表中重複數據:select distinct english,name from student;
實例:在所有學生數學分數上加10分特長分:select math as 原來的數學成績,math+10 as 現在數學成績 from student;
實例:統計每個學生的總分:select chinese+math+english 總分 from student;
實例:使用別名表示學生分數:select name 姓名,math 數學, chinese 語文, english 英語 from student;
實例:查詢姓名趙六的學生成績:select name 姓名,math 數學, chinese 語文, english 英語 from student where name='趙六';
實例:查詢英語成績大於70分的同學:select * from student where english>70;
實例:查詢總分大於200分的所有同學:select *, chinese+math+english 總分 from student where ( chinese+math+english)>200;
實例:查詢英語分數在 70-90之間的同學:select * from student where english between 70 and 90;
實例:查詢數學分數爲67,89,87的同學:select * from student where math in(67,89,87);
實例:查詢所有姓李的學生成績:select * from student where name like '李%';
實例:查詢數學分>80,語文分>80的同學:select * from student where math>80 and chinese>80;
實例:對數學成績排序後輸出:select * from student order by math,chinese asc ;
實例:對總分排序後輸出,然後再按從高到低的順序輸出:select *, chinese+math+english from student order by chinese+math+english desc;
實例:對姓李的學生成績排序輸出:select * from student where name like '李%' order by chinese+math+english desc;
七、多表操作
實例:
create table student(
id int primary key auto_increment,
name varchar(20) unique not null,
chinese float,
english float,
math float
);
實例:
insert into student(id,chinese,english,math) values(1,89,78,90);
insert into student(id,chinese,english,math) values(4,67,98,56);
insert into student(id,name,chinese,english,math) values(3,'王五',87,78,77);
insert into student(id,name,chinese,english,math) values(4,'李一',88,98,90);
insert into student(id,name,chinese,english,math) values(5,'李來財',82,84,67);
insert into student(id,name,chinese,english,math) values(6,'張進寶',55,85,45);
insert into student(id,name,chinese,english,math) values(7,'黃蓉',75,65,30);
1、實體完整性約束:
規定表的一行(即每一條記錄)在表中是唯一的實體。實體完整性通過表的主鍵(primary key)來實現。
主鍵的特性:唯一性,非空性
2、域完整性約束:保證某個字段符合要求
not null
unique:唯一 (對於null值無效)
3、參照完整性約束
外鍵
建表時添加外鍵:constraint 外鍵名 foreign key(外鍵字段名) references 主鍵表(主鍵字段)
先建表再添加外鍵:alter table 表名 constarint FK_employee_dept_id foreign key(dept_id) references departement(id)
表與表之間的關係:
一對一 (一個人只能有一個身份證號碼)
實例1:按照外鍵關聯+唯一約束
create table PERSON(
ID int primary key,
NAME varchar(100)
);
create table ID_CARD(
ID int primary key,
NUM varchar(20),
PERSON_ID int unique,
constraint PERSON_ID_FK foreign key(PERSON_ID) references PERSON(ID)
);
insert into person(id,name)values(1,'wyj');
insert into ID_CARD(id,num,person_id)values(1,3701,1);
實例2:按照主鍵關聯
create table PERSON(
ID int primary key,
NAME varchar(100)
);
create table ID_CARD(
ID int primary key,
NUM varchar(20),
constraint PERSON_ID_FK foreign key(ID) references PERSON(ID)
);
insert into person(id,name)values(1,'wyj');
insert into ID_CARD(id,num)values(1,3701);
一對多(一個老師可以教多個學生,一個學生只能讓一個老師教) (開發中用的最多)
實例:
create table DEPARTMENT(
ID int primary key,
NAME varchar(100) not null
);
create table EMPLOYEE(
ID int primary key,
NAME varchar(100),
DEPT_ID int
);
alter table EMPLOYEE add constraint FK_employee_dept_id foreign key(dept_id) references department(id);
insert into department(id,name,)values(1,'開發部');
insert into department(id,name,)values(2,'銷售部');
insert into employee(id,name,dept_id)values(1,'A',1);
insert into employee(id,name,dept_id)values(2,'B',1);
insert into employee(id,name,dept_id)values(3,'C',2);
多對多 (一個老師可以教多個學生,一個學生也可以被多個老師教)
用中間表來描述關係:
聯合主鍵:primary key(字段1,字段2)
實例:
create table TEACHER(
ID int primary key,
NAME varchar(100)
);
create table STUDENT(
ID int primary key,
NAME varchar(100)
);
create table TEACHER_STUDENT(
T_ID int,
S_ID int,
primary key(T_ID,S_ID),
constraint T_ID_FK foreign key(T_ID) references TEACHER(ID),
constraint S_ID_FK foreign key(S_ID) references STUDENT(ID)
);
insert into student(id,name)values(1,'徐航');
insert into student(id,name)values(2,'張成');
insert into teacher(id,name)values(1,'laobi');
insert into teacher(id,name)values(2,'wyj');
insert into teacher_student(t_id,s_id)values(1,1);
insert into teacher_student(t_id,s_id)values(1,2);
insert into teacher_student(t_id,s_id)values(2,1);
insert into teacher_student(t_id,s_id)values(2,2);
4、連接查詢:
4.1、交叉連接(cross join):不帶on子句,返回連接表中所有數據行的笛卡兒積。
select * from A cross join B;(顯式交叉連接)
select * from A ,B; (隱式交叉連接)
實例:
select * from department cross join employee;
select * from department,employee;
4.2、內連接(inner join):返回連接表中符合連接條件及查詢條件的數據行。
select * from A inner join B on (連接條件) where 條件
示例:
查詢陳冠希的所有訂單
查詢開發部的A的資料
select * from department A inner join employee B on (A.id=B.id) where A.name='開發部';
查詢所有人的包括所在部門的所有資料:
select * from department A inner join employee B on (A.id=B.dept_id)
4.3、外連接:分爲左外連接(left out join)、右外連接(right outer join)。與內連接不同的是,外連接不僅返回連接表中符合連接條件及查詢條件的數據行,也返回左表(左外連接時)或右表(右外連接時)中僅符合查詢條件但不符合連接條件的數據行。
select * from A left join B on (連接條件) where條件
特點:左表中能連接上右表的記錄顯示出來,還會將左表中連接不上的其它所有記錄也顯示出來
示例:
select * from department left join employee on (department.id=employee.dept_id);
select * from A right join B on (連接條件) where 條件
特點:將右表中的記錄都要保留下來
示例:
select * from department right join employee on (department.id=employee.dept_id);
4.4、子查詢
指令:select * from 表名 where 字段名 in (select 字段名 from 表名 where條件); (放在外面的查詢叫父查詢,放在內部的查詢叫子查詢)
子查詢可以出現在select ,from ,where部分。
實例:查詢屬於開發部的員工信息:
select * from employee where dept_id in (select id from department where name='開發部');
4.5、聯合查詢
select * from A
union
select * from B
將A表中的記錄與B表中的記錄合併在一起,並消除重複記錄
select * from student where math>80
union
select * from student where name='胡八';
4.6、報表查詢
指令:select * from 表名 where 條件 group by 分組字段 having(分組後的條件)
注意:having 是跟着group by一起出現的
聚合函數:
count():統計個數
sum():求和
avg():求平均值
max()最大值
min()最小值
實例:
統計一個班級共有多少學生?
select count(*) from student;
實例:
統計數學成績大於等於90的學生有多少個?
select count(*) from student where math>=90;
實例:
統計總分大於250的人數有多少?
select count(*) from student where (math+chinese+english)>250;
實例:
求一個班級數學平均分?
select avg(math) from student;
實例:
求一個班級總分平均分:
select avg(math+chinese+english) from student;
select sum(math+chinese+english)/count(*) from student;
實例:
求班級最高分和最低分:
select max(math+chinese+english) 最高分,min(math+chinese+english) 最低分 from student;
實例:
報表查詢每個學生的總分成績:
select sum(math+english+chinese) from student group by name;
實例:
報表查詢每一科成績大於60分的每一個學生的總分成績:
select sum(math+english+chinese),name from student group by name having(avg(math+chinese+english)>60);
八、數據備份與還原
1、數據庫備份:
WINDOWS命令行:
mysqldump -h localhost -u root -p[也可以加密碼] day14>d:/day14.sql
2、還原
a.WINDOWS命令
mysql -u root -psorry 數據庫名(要事先存在)<test.sql(sql文件所在位置)
實例:mysql -u root -p day14<d:\day14.sql
b.MYSQL命令
1.確保數據庫存在
create database day14;
2.source sql文件所有位置
source d:/mysql.sql;
實例:source d:\day14.sql;
資料下載