前言
關于mysql的安裝和理論知識可以自行百度搜索,為方便書寫本篇采用圖片方式展示,若需要可視化工具可以自行下載,
以下是本篇文章正文內容,下面案例可供參考
一、SQL操作基礎部分
操作資料庫
創建、查看、修改、洗掉資料庫
創建:字符集和字符集校對規則可以省略,
create database 資料庫名稱 character set 字符集 collate 字符集校對規則

查看:
查看資料庫服務器中所有的資料庫:show databases;

查看某個資料庫的定義資訊:show create database 資料庫名稱;

修改:
alter database 資料庫名稱 character set 字符集 collate 校對規則;

洗掉:
drop database 資料庫名稱;

其他操作:
切換資料庫: use 資料庫名稱;
查看當前正在使用的資料庫:select database();

操作表
要想操作表首先要了解一些基礎知識,在下列給出,
創建、查看、修改、洗掉表
創建:
create table 表名稱 (欄位名稱 欄位型別(長度) 約束 ,欄位名稱 欄位型別(長度) 約束…);
那么這個欄位型別有哪些呢?看下表
| java的型別 | mysql的型別 |
|---|---|
| byte/short/int/long | tinyint/smallint/int/bigint |
| float | float |
| double | double |
| boolean true和false辨別 | bit 使用0和1來辨別 |
| char/String | char和varchar型別 |
| Date | date/time/datetime/timestamp |
| File | BLOB/TEXT |
char和varchar的區別:
char代表是固定長度的字符或字串,
定義型別char(8),向這個欄位存入字串hello,那么資料庫使用三個空格將其補全,
varchar代表的是可變長度的字串,
定義型別varchar(8),向這個欄位存入字串hello,那么存入到資料庫的就是hello,
datetime和timestamp區別
datetime就是既有日期又有時間的日期型別,如果沒有向這個欄位中存值,資料庫使用null存入到資料庫中
timestamp也是既有日期又有時間的日期型別,如果沒有向這個欄位中存值,資料庫使用當前的系統時間存入到資料庫中,
那么這個約束有哪些呢?
約束:
約束作用:保證資料的完整性,
單表約束分類:
主鍵約束: primary key主鍵約束默認就是唯一非空的
唯一約束:unique
非空約束:not null
了解上述知識后,在doc中運行代碼,(筆者調了一下doc視窗顏色,不用在意)
create table user(
id int primary key auto_increment,
username varchar(20) unique,
password varchar(20) not null,
age int,
birthday date
);

查看:
查看某個資料庫下的所有的表 : show tables;

查看某個表的結構資訊 : desc 表名;

洗掉:
drop table 表名;

修改:
添加列
alter table 表名 add 列名 型別(長度) 約束;

修改列型別,長度和約束
alter table 表名 modify 列名 型別(長度) 約束;

洗掉列
alter table 表名 drop 列名;

修改列名稱
alter table 表名 change 舊列名 新列名 型別(長度) 約束;

修改表名
rename table 表名 to 新的表名;

修改表的字符集
alter table 表名 character set 字符集;

操作表的記錄
添加、修改、洗掉、查看記錄
添加:
向表中插入某些列: insert into 表名(列名1,列名2,列名3…) values (值1,值2值3…)
向表中插入所有列: insert into 表名 values (值1,值2,值3…)

注意事項:
值的型別與資料庫中表列的型別一致,
值的順序與資料庫中表列的順序一致,
值的最大長度不能超過列設定最大長度,
值的型別是字串或者是日期型別,使用單引號引起來,
如果插入中文記錄錯誤,則很大可能是字符集不一致導致,可以用 show variables like ‘%character%’; 查看字符集,若是客戶端為utf8則去mysql的安裝路徑修改.ini組態檔,改成gbk即可,具體可查看百度,
修改:
update 表名 set 列名=值 , 列名=值 [where條件];

注意:
1.值的型別與列的型別一致,
2.值的最大長度不能超過列設定的最大長度,
3.字串型別和日期型別添加單引號,
洗掉:
delete from 表名 [where條件];

注意:
1.洗掉表的記錄,指的是洗掉表中的一行記錄,
2.洗掉如果沒有條件,默認是洗掉表中的所有記錄,
拓展:
洗掉表中的記錄有兩種做法:
delete from user; 洗掉所有記錄,屬于DML陳述句,原理是一條記錄一條記錄洗掉,事務可以作用在DML陳述句上的,可以用 rollback 陳述句回滾;
truncate table user; 洗掉所有記錄,屬擴DDL陳述句,將表洗掉,然后重新創建一個結構一樣的表,事務不能控制DDL的,
查看:
查詢前先創建表,并且添加資料,
例如:
create table exam(
id int primary key auto_increment,
name varchar(20),
english int,
chinese int,
math int
);
insert into exam values (null,'張三',84,74,91);
insert into exam values (null,'李四',93,71,81);
insert into exam values (null,'王五',75,54,71);
insert into exam values (null,'趙六',42,94,81);
insert into exam values (null,'田七',81,71,51);
insert into exam values (null,'熊二',81,71,51);
如下圖:

基本語法:
select [distinct] * 列名 from 表 [條件];
例子1:查詢學生總成績(as 為起別名的意思)

條件查詢:
<, >,>= , <= ,<> ,=
like : 模糊查詢
in : 范圍查詢
條件關聯: and , or ,note
例子2:查詢名字叫李四或者英語成績大于80分的

例子3:查詢姓 李 的學生資訊(%和 _都是占位符,%代表任意個,_代表一個字符)

例子4:查詢英語成績為84,91,42的學生資訊

例子5:排序語文成績升序,如果語文成績相同就英語成績降序排

分組統計查詢:
聚合函式:sum()
例子6:統計學生所有成績總和,
有兩種寫法:
select sum(english + chinese + math) from exam; //一種橫向相加再求和
select sum(english) + sum(chinese) + sum(math) from exam; //一種豎向求和再相加,推薦使用這一種,

這兩種乍一看沒什么區別,實際上有個很小的細節,若當實際有資料為null的時候,注意橫向相加時,null加上任意資料都為null,所以不會加上資料有null的那一行,
那么怎么修改呢,只需要添加一個ifnull()的判斷就可以了,把資料為null的地方當成0就可以了,
select sum(ifnull(english,0)+ifnull(chinese,0)+ifnull(math,0)) from exam;
count()、avg()
例子7:統計英語成績不等于81的學生個數,

獲取語文成績平均值

max()、min()
例子8:獲取英語的最大值和數學的最小值

分組查詢:
重新創建表,如下:
create table orderitem(
id int primary key auto_increment,
product varchar(20),
price double
);
insert into orderitem values (null,'電視機',4900);
insert into orderitem values (null,'電視機',3499);
insert into orderitem values (null,'吹風機',5999);
insert into orderitem values (null,'吹風機',2669);
insert into orderitem values (null,'電腦',1319);
insert into orderitem values (null,'電腦',1249);
insert into orderitem values (null,'手機',999);
例子:查詢每個種類的訂單數量和銷售價格總和

例子:按商品名稱統計,統計每類商品花費的總金額在5000元以上的商品

注意:where的子句后面不能跟著聚合函式,如果需要使用帶有聚合函式的條件過源(分組后條件過濾)需要使用一個關鍵字having
二、MYSQL的進階操作
重置MYSQL密碼
停止mysql服務——》開啟一個cmd(跳過權限認證),輸入mysqld --skip-grant-tables——》再開啟一個cmd (不要關了之前的)這個時候登錄mysql不需要密碼——》在這個mysql中修改密碼,輸入use mysql;
update user set password = password(‘新的密碼’) where user = ‘root’;
——》然后在任務管理器結束mysqld的行程——》重新啟動mysql服務,OK完成,
資料庫備份和還原
備份資料庫:在cmd管理員輸入 mysqldump -u root -p 資料庫名 >D:/資料庫名.sql
還原資料庫:
第一種:先在mysql中創建資料庫名字可以一樣,然后再打開cmd管理員輸入mysql -u root -p 創建的資料庫名稱<D:/備份的資料庫名稱.sql
第二種:先在mysql中創建資料庫,然后輸入 use 剛剛創建的資料庫,輸入 source D:/備份資料庫名字.sql
多表
設計:外鍵約束
首先先創建兩個表如下:
create table dept(
did int primary key auto_increment,
dname varchar(20)
) ;
insert into dept values (null,'市場部');
insert into dept values (null,'人事部');
insert into dept values (null,'教研部');
create table employee(
eid int primary key auto_increment,
ename varchar(20),
salary double,
birthday date,
sex varchar(10),
dno int
);
insert into employee values (null,'張三',8000,'1988-09-01','男',3);
insert into employee values (null,'李四', 9000,'1988-09-01','男',1);
insert into employee values (null,'王五', 6000,'1988-09-01','男',2);
insert into employee values (null, '趙六',10000,'1988-09-01','男',3);
insert into employee values (null,'孫七',10000,'1988-09-01','男',1);
在員工表上添加外鍵,設定外鍵為非空

對于表之間外鍵的關系有下列3種情況:
一對一關系:
一對一關系是最好理解的一種關系,在資料庫建表的時候可以將人表的主鍵放置與身份證表里面,也可以將身份證表的主鍵放置于人表里面,即假設任一張表是一對多的情況即可,
一對多關系:
班級是一端,學生是多端,那么學生表里面應該放置班級表里面的主鍵,即建立外鍵指向班級的主鍵,(在多的一端建立外鍵)
多對多關系:
對于多對多關系,需要轉換成1對多關系,那么就需要一張中間表來轉換,這張中間表里面需要存放學生表里面的主鍵和課程表里面的主鍵,建立外鍵各自指向所對應的表,此時學生與中間表示1對多關系,課程與中間表是1對多關系,學生與課程是多對多關系,
查詢
創建如下資料庫:
create table classes(
cid int primary key auto_increment,
cname varchar(20),
cum int
);
insert into classes values(null,'01班',20);
insert into classes values(null,'02班',30);
insert into classes values(null,'03班',32);
insert into classes values(null,'04班',41);
create table course(
cid int primary key auto_increment,
cname varchar(20)
);
insert into course values (null,'Java');
insert into course values (null,'PHP');
insert into course values (null,'C++');
create table student(
sid int primary key auto_increment,
sname varchar(20),
sex varchar(10),
birthday date,
con int,
foreign key (con) references course (cid)
);
insert into student values (null,'張三','男','1990-09-23',1);
insert into student values (null,'李四','女','1991-11-28',1);
insert into student values (null,'王五','男','1992-10-14',1);
insert into student values (null,'趙六','女','1990-12-17',2);
insert into student values (null,'田七','男','1993-07-04',2);
insert into student values (null,'張吳','男','1991-04-04',2);
insert into student values (null,'張老七','女','1990-01-21',3);
insert into student values (null,'王老四','女','1992-05-03',3);
insert into student values (null,'李流','男','1994-01-09',3);
create table stu_cour(
scid int primary key auto_increment,
sno int,
cno int,
score int,
foreign key (sno) references student (sid),
foreign key (cno) references course (cid)
);
insert into stu_cour values(null,1,1,85);
insert into stu_cour values(null,1,3,75);
insert into stu_cour values(null,2,2,60);
insert into stu_cour values(null,2,3,67);
insert into stu_cour values(null,3,1,89);
insert into stu_cour values(null,3,2,72);
insert into stu_cour values(null,4,1,54);
insert into stu_cour values(null,4,3,77);
insert into stu_cour values(null,5,1,56);
insert into stu_cour values(null,5,2,68);
insert into stu_cour values(null,5,3,73);
insert into stu_cour values(null,6,1,82);
insert into stu_cour values(null,6,5,96);
insert into stu_cour values(null,7,1,100);
insert into stu_cour values(null,7,3,99);
insert into stu_cour values(null,8,3,89);
insert into stu_cour values(null,9,1,97);
insert into stu_cour values(null,9,2,100);
連接查詢:
交叉連接:cross join
交叉連接:查詢到的是兩個表的笛卡爾積,
語法:
select * from 表1 , 表2;
select * from 表1 cross join 表2 ;

內連接:inner join (inner是可以省略的)
顯示內連接:在SQL中顯示的呼叫 inner join 關鍵
字,
語法 :select * from表 1 inner join表 2 on 關聯條件;
隱式內連接:在SQL中沒有呼叫inner join關鍵字
語法: select * from 表1 , 表2 where 關聯條件;

外連接: outer join(outer)可以省略的
左外連接:
語法: select * from 表 1 left outer join 表2 on 關聯條件;
右外連接
語法: select * from 表1 right outer join 表2 on 關聯條件;

即可以左外連接可以查詢到沒有學生的班級,右外連接可以查詢到沒有班級的學生,看具體陳述句而定,
區別:

子查詢 :
一個查詢陳述句條件需要依賴另一個查詢陳述句的結果,
帶 in 的子查詢:
例子:查詢學生出生在91年之后的資訊:

帶exists查詢:如果學生有出生于91年之后則輸出前面查詢的陳述句

帶any的子查詢:大于任意一個(any等效于找出子查詢的最小值)下圖例子:any找出的大于任意一個即大于最小的即可也就是1,所以cid輸出大于1的了

帶all 的子查詢:與any相反,大于所有的下圖例子,all找出的大于所有的即大于最大的即可也就是3,所以cid輸出大于3的了,

事務
事務:指的是邏輯上的一組操作,組成這組操作的各個邏輯單元,要么全都成功,要么全都失敗,
例子:建個表
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
insert into account values (null,'小張',10000);
insert into account values (null,'小鳳',10000);
開啟事務:start transaction;

事務回滾至事務開始狀態:roll back;
事務提交:commit;
特性
原子性:事務的不可分割,組成事務的各個邏輯單元不可分割,
一致性:事務執行的前后,資料完整性保持一致,
隔離性:事務執行不應該受到其他事務的干擾,
持久性:事務一旦結束,資料持久化到資料庫中,
事務隔離級別
隔離性:一個事務的執行,不應該受到其他事務的干擾,如果不考慮隔離性〈一個事務執行受到其他的事務的干擾),引發一些安全問題,主要體現在讀取資料上:
臟讀:一個事務讀到了另一個事務未提交的資料,導致查詢結果不一致
不可重復讀:一個事務讀到了另一個事務已經提交的update 的資料,導致多次查詢結果不一致,
虛讀/幻讀:一個事務讀到了另一個事務已經提交的 insert的資料,導致多次查詢結果不一致,
設定事務的隔離級別:
read uncommitted : 臟讀,不可重復讀,虛讀都有可能發生
read committed : 避免臟讀,但是不可重復讀和虛讀是有可能發生
repeatable read︰避免臟讀和不可重復讀,但是虛讀有可能發生,
serializable : 避免臟讀,不可重復讀,虛讀,別的視窗事務執行完之后才會執行當前視窗事務,
可以開啟兩個視窗,同時開啟事務進行操作,
set session transaction isolation level 隔離級別; //設定事務隔離級別
select @@tx_isolation; //查看當前隔離級別
總結
以上就是今天要講的內容,本文僅僅簡單介紹了mysql的簡單使用,進階版高級版會在后續發出,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/207050.html
標籤:java
上一篇:Redis(設計與實作):---發布與訂閱之查看訂閱資訊(PUBSUB CHANNELS/NUMSUB/NUMPAT命令)
下一篇:SQL陳述句實作水仙花數求取
