JavaWeb-14 (MySQL)

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;    
資料下載
發佈了81 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章