mysql基礎 -- DDl DML DQL 總結

SQL是什麼?

結構化查詢語言(SQL)是用於關係數據庫管理和數據操作的標準計算機語言。SQL用於查詢,插入,更新和修改數據。

註釋

單行註釋:-- 註釋內容
多行註釋:/* 註釋內容 */

SQL分類

SQL語言共分爲四大類:
1.數據查詢語言DDL 用來定義數據庫對象:數據庫,表,列。
2.數據操縱語言DML 用於對數據庫當中的表進行增刪改
3.數據定義語言DQL 用於查詢數據庫當中表的記錄。
4.數據控制語言DCL 用於定義數據庫的權限(授權),安全級別,用戶。

注意: SQL語句是不缺分大小寫的。 但是實際使用中,要麼純大寫、要麼純小寫。

DDL操作數據庫,表

操作庫

C create : 創建
-- 創建數據庫
CREATE DATABASE IF NOT EXISTS 數據庫名;
R retrieve : 查詢
-- 查詢所有數據庫
SHOW DATABASES;

-- 查看數據庫字符集
SHOW CREATE DATABASE 數據庫名;

--設置數據庫字符集
CREATE DATABASE IF NOT EXISTS 數據庫名 CHARACTER SET 字符集名;
U updata:修改
--設置數據庫字符集
ALTER DATABASE IF NOT EXISTS 數據庫名 CHARACTER SET 字符集名;

D delete:刪除

-- 刪除數據庫
drop database 數據庫名;

--判斷數據庫是否存在,存在刪除
drop database if exists 數據庫名;

#####使用數據庫

-- 查詢正在使用數據庫
select database();

--使用數據庫
use 數據庫名稱;

操作表

在數據庫的表中,常見的數據類型:

類型 描述
int 整型,存儲整數
double 浮點型,存儲小數
double(4,3): 這個小數最多隻有4位,且有三位是小數部分
char 字符串,在使用的時候需要定義長度
char(5): 每個數據佔用固定的長度5
varchar 字符串,在使用的時候需要定義長度
varchar(5): 長度可動態調整的,這裏的5只是一個上限
text 字符串,在使用的時候不需要指定長度
blob 字節類型
date 日期類型,格式是 yyyy-MM-dd
time 時間類型,格式是 hh:mm:ss
timestamp 時間戳,格式是 yyyy-MM-dd hh:mm:ss,會自動賦值
datetime 時間類型,格式是 yyyy-MM-dd hh:mm:ss
C create : 創建
create table if not exists 表名(
列名1 數據類型1
.....
)
注意:
最後一列不加逗號
data:日期 年月日 yyyy-MM-dd
datatime:日期 年月日時分秒 yyyy-MM-dd HH:mm:ss
R retrieve : 查詢
--查表
show tables;
--查表結構
desc 表名;
U updata:修改
--修改表名
alter table 表名 rename to 新表名;

-- 修改表的字符集
alter table if not exists 表名 character set 字符集名;

--添加一列
alter table 表名 add 列名 數據類型;

--修改列名稱 類型
alter table 表名 change 列名 新列名 新數據類型;

alter table 表名 modify 列名 新數據類型;

-- 刪除列
alter table 表名 drop 列名;
D delete:刪除
drop table 表名;
drop table if exists 表名;

DML:增刪改

數據類型
類型 描述
int 整型,存儲整數
double 浮點型,存儲小數
double(4,3): 這個小數最多隻有4位,且有三位是小數部分
char 字符串,在使用的時候需要定義長度
char(5): 每個數據佔用固定的長度5
varchar 字符串,在使用的時候需要定義長度
varchar(5): 長度可動態調整的,這裏的5只是一個上限
text 字符串,在使用的時候不需要指定長度
blob 字節類型
date 日期類型,格式是 yyyy-MM-dd
time 時間類型,格式是 hh:mm:ss
timestamp 時間戳,格式是 yyyy-MM-dd hh:mm:ss,會自動賦值
datetime 時間類型,格式是 yyyy-MM-dd hh:mm:ss
INSERT 插入
insert into 表 (列名1,列名2,列名3...) values (1,2,3...)//向表中插入某些列
INSERT INTO users(id,name,sex,age) VALUES (NULL, 'jak', 'F', 33);

insert into 表 values (1,2,3...);		//向表中插入所有列
INSERT INTO users VALUES (NULL, 'jak', 'F', 33);


注意:

列名數與values後面的值的個數相等
列的順序與插入的值的順序一致
列名的類型與插入的值要一致
插入值的時候不能超過最大長度
值如果是字符串或者日期需要加引號’’

UPDATE 更新
update 表名 set 字段名=,字段名=... where 條件;
UPDATE users set name='lisea' where id = 1;
注意:

列名的類型與修改的值要一致
修改值的時候不能超過最大長度
值如果是字符串或者日期要加’’
DELETE 刪除
delete from 表名 [where 條件];
DELETE FROM users WHERE id = 1;
delete from 表名; //刪除表的全部數據

# 1. 刪除表中的數據(刪除表中全部的數據)
delete from t_student;
# 2. 刪除所有數據
#    其實並不是刪除表中的所有數據,這個語句的執行邏輯:
#    2.1. 記錄當前表中的字段信息
#    2.2. 刪除這張表
#    2.3. 按照記錄的字段信息,重新創建一張一模一樣的表
#    這個刪除效率,是要比delete from 表,高
truncate t_student;
# 3. 刪除指定條件的數據
delete from t_student where name='xiaoming';
delete from t_student where gender not in('male', 'female');
delete from t_student where score is null;

實戰演練

DQL查詢

從表中查詢數據
在這裏插入圖片描述

1,查詢所有:select * from 表名 where 條件;
2,不能重複查詢:select distinct 列名 from 表名 where 條件;
3,連接查詢: select concat(列名1,列名2) from 表名;
4,列起別名: select 列名 as 顯示列名 from 表名;
5,模糊查詢: select * from 表名 where 列名 like ‘%字符串%;
6,升序與降序:select * from 表名 order by 字段名 ASC(升序默認);
select * from 表名 order by 字段名 DESC(降序)
7,聚合函數:
select count() from 表名
select sum(列名) from 表名
select avg列名) from 表名
select max(列名) from 表名
select min(列名) from 表名
8,分組查詢
select * from 表名 group by 列名
select * from 表名 group by 列名 HAVING count(*)>number

新建一張表

create table t_score(name varchar(5), java int, mysql int, linux int, hadoop int);

向表中插入數據

insert into t_score values
('張三丰', 59, 62, 70, 65),
('張無忌', 89, 76, 78, 76),
('張翠山', 87, 87, 68, 89),
('殷素素', 98, 89, 78, 67),
('郭靖', 55, 58, 60, 76),
('掃地僧', 99, 99, 99, 99),
('韋小寶', 87, 56, 87, 57),
('貂蟬', 88, 67, 53, 56);
基礎查詢

[select 列名 from 表]

select name from t_score;
select name, java, hadoop from t_score;
查詢所有列

可以使用*替代列

select * from t_score;
條件查詢

條件查詢在查詢的時候將條件放在where後面,where後條件的關鍵字有:

描述
= (等於)
< (小於)
> (大於)
!= (不等於)
<> (不等於)
<= (小於等於)
>= (大於等於)
and (表示所有條件都必須滿足)
or (表示所有條件中有一個滿足就可以)
is null (爲空)
is not null (不爲空)
between … and… (表示從指定開始的值到結束的值,包含開始值和結束值)
in(set) 查找多個符合條件的內容。使用集合表示,多個值之間用逗號
not(set) 查找多個不符合條件的內容。
#    查詢所有java不及格的學生姓名和全部的成績
select * from t_score where java < 60;
#    查詢所有的java不及格,並且mysql也不及格的全部信息
select * from t_score where java < 60 and mysql < 60;
#    查詢所有的java成績在8090之間的學生信息
select * from t_score where java between 80 and 90;
#    查詢java成績和mysql成績差值大於10分的所有學生信息
select * from t_score where mysql - java > 10 or java - mysql > 10;
#	查詢hadoop成績爲空的學生信息
SELECT * FROM t_score WHERE hadoop IS NULL;
#	查詢hadoop成績爲不爲空的學生信息
SELECT * FROM t_score WHERE hadoop IS NOT NULL;
模糊查詢 like
#    _: 通配符,匹配任意的字符,只能匹配一位
#    %: 通配符,匹配任意的字符,可以匹配多位
#    可以根據指定的條件,查詢表中的相似的數據。

#    查詢成績表中所有姓張的學生信息
select * from t_score where name like '張%';

#    查詢成績表中所有姓張的,並且名字長度是3的學生信息
select * from t_score where name like '張__';

#    查詢所有的mysql成績是個位數的學生信息
select * from t_score where mysql like '_';

#    查詢所有的hadoop成績大於90分的學生信息
select * from t_score where hadoop like '9_';

查詢所有的linux成績尾數爲8的學生信息
select * from t_score where linux like '%8';
字段控制
查詢結果去重
#      關鍵字distinct,使用distinct修飾的字段,會進行去重
#      但是,distinct只能放在緊跟在select後面的位置,不能寫在其他字段之後
#      distinct後面如果有多個字段,會根據多個字段去重:每一個字段的值都相同,纔會認爲是重複的值

#      查詢所有人的所有hadoop成績,查詢結果按照成績去重
select distinct hadoop from t_score;
給列起別名
# 其實,這個查詢,還是從t_score表中按照指定的鍵來查詢數據,
# 只不過,將查詢到的數據,在查詢結果虛擬機表中的字段重新命名

select name as '姓名', java as 'Java成績', mysql, linux, hadoop from t_score;

#      as 關鍵字可以省略
select name '姓名' from t_score;
列之間的計算
#      需求:查詢表中的所有人的所有成績和總成績
select *, java+mysql+linux+hadoop as '總成績' from t_score;

#      列之間的相加註意事項: NULL值和任意的值相加,結果都是NULL。

#      ifnull(,): 如果指定列的值是NULL,則按照指定的值處理
select *, java+mysql+ifnull(linux,0)+hadoop as '總成績' from t_score;
查詢結果排序:

將查詢的結果,按照一定的大小關係進行排列。

#    在查詢語句的最後方,添加 order by 列
#    order by 默認是按照指定的列進行升序排序,如果需要降序,則在最後添加一個 desc
#		(注:升序排序,也可以在字段後面添加一個asc)
select *, java+mysql+ifnull(linux,0)+hadoop as '總成績' from t_score order by java asc;
#    如果有多個排序依據,直接用逗號在後面拼接字段即可
select *, java+mysql+ifnull(linux,0)+hadoop as '總成績' from t_score order by hadoop, linux;
#    需求:按照總成績做降序
select *, java+mysql+ifnull(linux,0)+hadoop as '總成績' from t_score order by java+mysql+ifnull(linux,0)+hadoop desc;
聚合函數

在查詢到的所有的結果中,可以使用聚合函數,對某些數據進行一些操作。

- 描述
count() 計算數量,但是不會計算NULL。
sum() 計算總和
avg() 計算平均值
max() 計算最大值
min() 計算最小值
# 重點: 聚合函數,是作用於列。是做縱向計算的。

# 需求1: 統計這張表中有多少學生
select count(linux) from t_score;
# 需求2: 統計有多少人的MySQL成績及格
select count(mysql) from t_score where mysql > 60;
# 需求3: 計算linux成績的總和
select sum(linux) from t_score;
# 需求4: 計算hadoop成績的平均值
select avg(hadoop) from t_score;
# 需求5: 計算Java成績的最高分和最低分
select max(java), min(java) from t_score;
查詢分組
# 可以將查詢的結果,按照某一個字段進行分組,當這個字段的值相同的時候,這些數據視爲一個分組。
# 給t_score表添加一個字段 group 
alter table t_score add `group` int;

# 需求1: 查詢每一個分組中有多少人
select `group`, count(`name`) from t_score group by `group`;

# 需求2: 查詢每一個分組的java平均值
select `group`, avg(java) from t_score group by `group`;

# 關於where: 可以使用where子句,對要查詢的數據進行過濾。
# 注意事項: where必須要放在分組之前。其實分組,是對where保留下來的數據進行分組的。
# 需求3: 查詢第二組有多少人
select `group`, count(`name`) from t_score where `group` = 2 group by `group`;

# 需求4: 計算每一個分組中,分別有多少人的java不及格
select `group`, count(`name`) from t_score where java < 60 group by `group`;

# 需求5: 計算每一個分組的人數、java平均成績和linux總成績
select `group`, count(`name`), avg(java), sum(linux) from t_score group by `group`;
having
#和where是比較相似的。都是做的條件過濾。
#having和where的區別:
#	1. where要寫到分組之前,過濾是發生在分組前的。having要寫在分組之後,對分組後的數據進行過濾的。
#    2. where子句中不允許使用聚合函數。having後是可以使用聚合函數的。

# 需求: 查詢所有的java平均分小於80分的分組id和java平均分
select `group`, avg(java) from t_score group by `group` having avg(java) < 80;
分頁
#    可以將查詢到的數據分成若干頁。
#    limit
#    limit需要兩個參數:
#    第一個參數,代表從第幾個數據開始查詢
#    第二個參數,代表每一頁要查詢多少個數據
	select * from t_score limit 3, 2;

#    分頁,可以分爲真分頁和假分頁。
#    真分頁: 從數據庫中查詢數據的時候,將數據分段讀取。又叫做物理分頁。
#    假分頁: 直接從數據庫中查詢到所有的數據,在程序中進行邏輯處理。又叫做邏輯分頁。
#    假分頁優點: 效率高。
#    假分頁缺點: 如果數據量過大,會出現內存溢出。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章