day13 MySQL 及數據庫相關

Author:相忠良
Email: ugoood@163.com
起始於:May 16, 2018
最後更新日期:May 26, 2018mysql

聲明:本筆記依據傳智播客方立勳老師 Java Web 的授課視頻內容記錄而成,中間加入了本身的理解。本筆記目的是強化本身學習所用。如有疏漏或不當之處,請在評論區指出。謝謝。
涉及的圖片,文檔寫完後,一次性更新。sql

day13 MySQL 及數據庫相關

1. MySQL 的安裝

參照MySQL安裝圖解,下載後,把rar改成doc便可。https://files.cnblogs.com/files/ZhongliangXiang/MySQL%E5%AE%89%E8%A3%85%E5%9B%BE%E8%A7%A3.rar數據庫

2. 數據庫的建立細節

練習下面內容便可:服務器

mysql管理員的用戶名和密碼:root  root

建立一個名稱爲mydb1的數據庫
create database mydb1;
show databases;

建立一個使用utf-8字符集的mydb2數據庫。
create database mydb2 character set utf8;

建立一個使用utf-8字符集,並帶校對規則的mydb3數據庫。
create database mydb3 character set utf8 collate utf8_general_ci;

查看前面建立的mydb2數據庫的定義信息
show create database mydb2;

刪除前面建立的mydb1數據庫
drop database mydb1;

查看服務器中的數據庫,並把其中某一個庫的字符集修改成gb2312;
alter database mydb2 character set gb2312;
show create database mydb2;

演示恢復和備份
create database tt;
use tt;
create table a
(
    name varchar(20)
);
insert into a(name) values('aaaa');
select * from a;
-----看到a表有數據

對tt做備份操做,啓動一個window命令行窗口,執行以下命令
mysqldump -uroot -p tt>c:\tt.sql



演示恢復
1.先刪除庫
drop database tt;

2.恢復tt庫(1)
  2.1  爲恢復庫,要先建立庫  create database tt;
  2.2  再恢復tt庫
    use tt;
    source c:\tt.sql        (source:能夠執行一個 sql腳本)


3.恢復tt庫(2)
  2.1  爲恢復庫,要先建立庫  create database tt;
  2.2  恢復庫   mysql -uroot -proot tt<c:\1.sql;   (window命令)

3. 建立表的細節

1

建立一個員工表
use mydb2;
create table employee
(
    id int,
    name varchar(40),
    sex varchar(4),
    birthday date,
    entry_date date,
    job varchar(40),
    salary decimal(8,2),
    resume text
);

show tables;  查看庫的全部表
show create table employee;   查看錶的建立細節
desc employee;     看錶結構


在上面員工表的基本上增長一個image列。
alter table employee add image blob;

修改job列,使其長度爲60。
alter table employee modify job varchar(60);

刪除sex列
alter table employee drop sex;

表名改成user。
rename table employee to user;

修改表的字符集爲utf-8
alter table user character set utf8;

列名name修改成username
alter table user change column name username varchar(40);

刪除表
drop table user;

4. 增刪改語句

使用insert語句向表中插入三個員工的信息。
rename table user to employee;
insert into employee(id,username,birthday,entry_date,job,salary,resume) values(1,'aaa','1980-09-09','1980-09-09','bbb',90,'aaaaa');
select * from employee;

插入數據的細節1
insert into employee values(1,'aaa','1980-09-09','1980-09-09','bbb',90,'aaaaa');

插入數據的細節2
insert into employee values('1','aaa','1980-09-09','1980-09-09','bbb','90','aaaaa');
插入數據的時候都用單引號引發來,省的數據報錯,若是ID引發來的話,mysql會自動轉換類型的。

插入數據的細節3(插入中文)
    要告訴mysql客戶端採用gb2312編碼
    show variables like 'chara%';
    set character_set_client=gb2312;
    insert into employee(id,username) values('3','張三');

    要想查看時不亂碼
    show variables like 'chara%';
    set character_set_results=gb2312;
    select * from employee;

將全部員工薪水修改成5000元。
update employee set salary=5000;

將姓名爲’bbb’的員工薪水修改成3000元。
update employee set salary=3000 where username='bbb';

將姓名爲’bbb的員工薪水修改成4000元,job改成ccc。
update employee set salary=4000,job='ccc' where username='bbb';

將bbb的薪水在原有基礎上增長1000元。
update employee set salary=salary+1000 where username='bbb';

更新要注意的問題
update employee set username='ccc',salary=9000,birthday='1980-09-09',.....................
update  where id=1;
這個地方忘記寫where,後果是很嚴重的。

刪除表中名稱爲’zs’的記錄。
delete from employee where username='bbb';

刪除表中全部記錄。
delete from employee;

使用truncate刪除表中記錄。
truncate table employee;

5. 查詢語句

試驗所需材料:
建立1個 student.sql 文件,並寫入以下內容:數據結構

create table student(
    id int,
    name char(20),
    chinese float,
    english float,
    math float
);

insert into student(id,name,chinese,english,math) values(1,'張小明',89,78,90);
insert into student(id,name,chinese,english,math) values(2,'李進',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,65);
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);

將該文件導入某數據庫,如:數據庫設計

use tt
source e:\student.sql

處理mysql客戶端輸入和顯示時的亂碼問題,下面代碼在mysql客戶端執行:函數

要告訴mysql客戶端採用gb2312編碼
show variables like 'chara%';
set character_set_client=gb2312;

要想查看時不亂碼
show variables like 'chara%';
set character_set_results=gb2312;

上述準備工做做完後,進行下面的查詢練習:學習

查詢表中全部學生的信息。
select * from student;

查詢表中全部學生的姓名和對應的英語成績。
select name,english from student;

過濾表中重複的英語數據。
select distinct english from student;

在全部學生總分上加10分特長分。
select name,(chinese+english+math)+10 from student;

統計每一個學生的總分。
select name,(chinese+english+math) from student;

使用別名表示學生分數。
select name as 姓名,(chinese+english+math)+10 as 總分 from student;
select name 姓名,(chinese+english+math)+10  總分 from student;

查詢姓名爲王五的學生成績
select * from student where name='王五';

查詢英語成績大於90分的同窗
select * from student where english>'90';

查詢總分大於200分的全部同窗
select name from student where (chinese+english+math)>200;

查詢英語分數在 80-90之間的同窗。
select name from student where english>80 and english<90;
select name from student where english between 80 and 90;  == select name from student where english>=80 and english<=90;

查詢數學分數爲89,90,91的同窗。
select * from student where math in(89,90,91);

查詢全部姓李的學生成績。
select * from student where name like '李%';
select * from student where name like '李_';


查詢數學分>80,語文分>80的同窗。
select * from student where math>80 and chinese>80;

對數學成績排序後輸出。
select name,math from student order by math;

對總分排序後輸出,而後再按從高到低的順序輸出
select name 姓名,(chinese+english+math) 總分 from student order by (chinese+english+math) desc;
select name 姓名,(chinese+english+math) 總分 from student order by 總分 desc;

對姓李的學生成績排序輸出
select * from student where name like '李%' order by (chinese+english+math) desc;

統計一個班級共有多少學生?
select count(name) from student;
select count(*) from student;

統計數學成績大於90的學生有多少個?
select count(*) from student where math>80;

統計總分大於250的人數有多少?
select count(*) from student where (chinese+english+math)>250;

關於 count的函數的細節 (count只統有值的行)


統計一個班級數學總成績?
select sum(math) from student;

統計一個班級語文、英語、數學各科的總成績
select sum(chinese),sum(english),sum(math) from student;

統計一個班級語文、英語、數學的成績總和
select sum(chinese+english+math) from student;

統計一個班級語文成績平均分
select sum(chinese)/count(*) from student;

統計一個班級語文成績平均分
select avg(chinese) from student;

求一個班級總分平均分
select avg(chinese+math+english) from student;

求班級最高分和最低分
select max(chinese+math+english),min(chinese+math+english) from student;

對訂單表中商品歸類後,顯示每一類商品的總價
select product,sum(price) from orders group by product;

查詢購買了幾類商品,而且每類總價大於100的商品
select product from orders group by product having sum(price)>100;

6. mysql 表的約束

2

3

定義主鍵約束(每個表必須有一個主鍵列)
create table student
(
    id int  primary key,
    name varchar(40)
);

定義主鍵自動增加
create table student
(
    id int  primary key auto_increment,
    name varchar(40)
);

定義惟一約束
drop table student;
create table student
(
    id int primary key auto_increment,
    name varchar(40) unique
);

定義非空約束
drop table student;
create table student
(
    id int primary key auto_increment,
    name varchar(40) unique not null
);

定義外鍵約束
create table husband
(
    id int primary key,
    name varchar(40)
);

create table wife
(
    id int primary key,
    name varchar(40),
    husband_id int,
    constraint husband_id_FK foreign key(husband_id) references husband(id)
);

7. 數據庫表的設計

從應用程序創建對象後,需將 複雜對象 存入數據庫的這種迫切需求開始,理解本節內容。
複雜對象: 就是對該象中的屬性,存放着其餘類型對象。後面的列子中對象多數均爲複雜對象。簡單對象的話,直接用 mysql 建表存儲就完事了。編碼

7.1 1對多或多對1關係的設計

數據庫表的 1:n 或 n:1 的設計原則:命令行

  1. 先無論對象間的關係,直接設計本對象的基本屬性;
  2. 多的那一方,再增長外鍵。

示例場景,以下圖:
4

創建表的sql語句:

一對多或多對一的對象存到數據庫時,表的設計方案
部門和員工
create table department
(
    id int primary key,
    name varchar(40)
);

create table employee
(
    id int primary key,
    name varchar(40),
    salary decimal(8,2),
    department_id int,
    constraint department_id_FK foreign key(department_id) references department(id)
);

7.2 多對多關係的設計

多對多關係的話,就需創建一箇中間表。

示例場景,以下圖:
5

創建表的sql語句:

多對多對象的表的設計(老師和學生)
create table teacher
(
    id int primary key,
    name varchar(40),
    salary decimal(8,2)
);

create table student
(
    id int primary key,
    name varchar(40)
);

create table teacher_student
(
    teacher_id int,
    student_id int,
    primary key(teacher_id,student_id),
    constraint teacher_id_FK foreign key(teacher_id) references teacher(id),
    constraint student_id_FK foreign key(student_id) references student(id)
);

不過, teacher_student 表中的主鍵是值得商榷的。一般應該單獨創建 id 主鍵列,而不建議用雙列作主鍵。

7.3 1對1關係的設計

1對1案例,人和身份證。 1對1通常是有 主從關係 的。

人爲主,身份證爲從。既人能夠沒身份證,但身份證不能沒有人與之對應。

示例場景,以下圖:
身份證外鍵列不只要加外鍵約束,還要加惟一性約束和非空約束,保證了1:1的關係。下圖也表達了1:1關係中的一種主從關係特性。
6

上圖中,把身份證表的id列設爲主鍵約束和外鍵約束,剛好表達了身份證外鍵列還要加惟一性和非空這兩種約束,故不必單獨設計1個列爲外鍵約束列了。

創建表的sql語句:

一對一的對象的數據庫設計
create table person
(
    id int primary key,
    name varchar(40)
);

create table idcard
(
    id int primary key,
    city varchar(40),
    constraint id_FK foreign key(id) references person(id)
);

8. 自關聯對象的數據庫設計

案例:家族管理系統
每一個人都有1個爸爸,有好多孩子。 爸爸,孩子,包括你,都是 Person 對象。
7

創建表的sql語句:

自鏈接的表
create table person
(
    id int primary key,
    name varchar(40),
    parent_id int,
    constraint parent_id_FK foreign key(parent_id) references person(id)
);

設計一個無限制分類的表:
8

該表理論上可存無限制分類,實際操做中涉及到遞歸,遞歸有層數限制,故實際中該表沒法實現無限制分類。需用數據結構中的二叉樹來實現。

相關文章
相關標籤/搜索