Day01回顧
一、MySQL的特色
一、關係型數據庫
二、跨平臺
三、支持多種編程語言
二、啓動鏈接
sudo /etc/init.d/mysql start | stop | restart | reload
mysql -hIP地址 -u用戶名 -p
MySQL中數據是以文件的形式存儲在數據庫目錄/var/lib/mysql
三、基本SQL命令
一、庫管理
一、show databases;
二、create database [if not exists] 庫名 character set utf8;
三、select database();
四、use 庫名;
五、show tables;
六、drop database 庫名;
二、表管理
一、create table [if not exists] 表名(
字段名 數據類型,
... );
二、show create table 表名;
三、desc 表名;
四、drop table 表1,表2;
三、表記錄的管理
一、insert into 表名(字段1,...) values(值1),(值2);
二、select 字段1,字段2... from 表名 [where 條件];
四、更改默認字符集
一、sudo -i
二、cd /etc/mysql/mysql.conf.d/
三、cp mysqld.cnf mysqld.cnf.bak
四、vi mysqld.cnf
[mysqld]
character_set_server = utf8
五、/etc/init.d/mysql restart
六、exit
五、數據類型
一、數值類型
一、整型
一、int(4字節)
二、tinyint(1字節)
默認有符號:signed
無符號 :tinyint unsigned
二、浮點型
一、float(m,n) # 最多7個有效位
二、decimal(m,n) # 整數部分和小數部分分開存儲
三、注意
一、浮點型插入整數時,自動補全小數位位數
二、小數位若是多於指定位數,對指定位下一位四捨五入
二、字符類型
一、char :浪費存儲空間,性能高
二、varchar :節省存儲空間,性能低
三、text / longtext / blob / longblob
四、字符類型寬度和數值類型寬度區別
一、數值類型寬度爲顯示寬度,僅用於select查詢顯示,和存儲無關,zerofill
二、字符類型寬度超過則沒法存儲
三、枚舉類型
一、enum(值1,值2)
二、set(值1,值2)
# 插入記錄:"mysql,python,study"
四、日期時間類型
*******************************************************************************************************************************************************
Day02筆記
一、數據類型
一、數值類型
二、字符類型
三、枚舉類型
四、日期時間類型
一、date :"YYYY-MM-DD"
二、datetime :"YYYY-MM-DD HH:MM:SS"
三、timestamp :"YYYY-MM-DD HH:MM:SS"
四、time :"HH:MM:SS"
五、注意
datetime :不給值默認返回 NULL
timestamp :不給值默認返回系統當前時間
六、示例
一、建立一張表,用戶充值表
create table t2(
id int,
username varchar(20),
password varchar(20),
money int,
birthday date,
cztime timestamp
)character set utf8;
二、插入記錄
insert into t2 values
(1,"用戶1","123456",500,"1995-05-20","2018-08-30 09:40:30");
insert into t2 values
(2,"用戶2","123456",600,"1992-02-20",now());
二、日期時間函數
一、now() 返回服務器當前時間
二、curdate() 當前日期
三、date("1999-09-09 09:09:09") 提取 年月日
四、time("...") 提取 時分秒
五、year("...") 提取 年
六、練習
一、查找2018年8月30日用戶充值的詳細信息
select * from t2 where date(cztime)="2018-08-30";
二、查找2018年8月份全部用戶充值的信息
select * from t2 where
date(cztime)>="2018-07-01" and date(cztime)<="2018-07-31";
三、查找2018年08月30日 08:00-10:00之間用戶充值信息
select * from t2 where
cztime>="2018-08-30 08:00:00" and cztime<="2018-08-30 10:00:00";
三、日期時間運算
一、語法格式
select * from 表名
where 字段名 運算符(now()-interval 時間間隔單位);
時間間隔單位:
2 day | 3 hour | 1 minute | 2 year | 3 month
二、示例
一、查詢1天之內的充值記錄
select * from t2 where
cztime>=(now()-interval 1 day);
二、查詢1年之前的充值記錄
select * from t2 where
cztime<(now()-interval 1 year);
三、查詢1天之前、3天之內的充值記錄
select * from t2 where
cztime>=(now()-interval 3 day) and
cztime<=(now()-interval 1 day);
四、表字段操做
一、語法 :alter table 表名 ...;
二、添加字段(add)
alter table 表名 add 字段名 數據類型;
alter table 表名 add 字段名 數據類型 first;
alter table 表名 add 字段名 數據類型 after 字段名;
三、刪除字段(drop)
alter table 表名 drop 字段名;
四、修改字段數據類型(modify)
alter table 表名 modify 字段名 新數據類型;
## 會受到表中已有數據的限制
五、修改表名(rename)
alter table 表名 rename 新表名;
六、修改字段名(change)
alter table 表名 change 原字段名 新字段名 數據類型;
alter table new_t3 change name username char(15);
七、練習
一、在 db2 庫中建立表 stutab ,字段有3個:
name、age、phnumber
use db2;
create table stutab(
name char(20),
age tinyint,
phnumber bigint
);
二、在表中第一列添加一個 id 字段
alter table studab add id int first;
三、把 phnumber 的數據類型改成 char(11)
alter table studab modify phnumber char(11);
四、在表中最後一列添加一個字段 address
alter table studab add address varchar(30);
五、刪除表中的 age 字段
alter table stutab drop age;python
五、表記錄操做mysql
一、刪除表記錄(delete)
一、delete from 表名 where 條件;
二、注意
必定要加where條件,不加where條件所有刪除表記錄
二、更新表記錄(update)
一、update 表名 set 字段1=值1,字段2=值2 where 條件;
二、注意
必定要加where條件,不加where條件所有更新表記錄sql
六、運算符操做
一、數值比較&&字符比較&&邏輯比較
一、數值比較 := != > >= < <=
二、字符比較 := !=
三、邏輯比較 :
一、and :兩個或者多個條件同時成立
二、or :有1個條件知足便可
where country="蜀國" or country="魏國";
四、練習
一、查找攻擊力高於150的英雄的名字和攻擊值
select name,gongji from sanguo
where gongji>150;
二、將趙雲的攻擊力設置爲360,防護力設置爲88,名字改成趙子龍
update sanguo set gongji=360,fangyu=88,name="趙子龍" where name="趙雲";
三、將吳國英雄中攻擊值爲110的英雄的攻擊值改成100,防護力改成60
update sanguo set gongji=100,fangyu=60
where country="吳國" and gongji=110;
四、查找蜀國和魏國的英雄信息
select * from sanguo where
country="蜀國" or country="魏國";
五、找出攻擊力高於200的蜀國英雄的名字、攻擊值和國家
select name,gongji,country from sanguo
where
gongji>200 and country="蜀國";
二、範圍內比較
一、between 值1 and 值2
二、in(值1,值2)
三、not in(值1,值2)
四、練習
一、查找攻擊值100-200之間的蜀國英雄信息
select * from sanguo
where
(gongji between 100 and 200) and country="蜀國";
二、查找蜀國和吳國之外的國家的女英雄信息
select * from sanguo
where country not in("蜀國","吳國") and sex="女";
三、查找id爲一、3或5的蜀國英雄 和 貂蟬的信息
select * from sanguo
where
(id in(1,3,5) and country="蜀國") or name="貂蟬";
三、匹配空 和 非空
一、空 :is null
二、非空 :is not null
三、練習
一、查找姓名爲 NULL 的蜀國男英雄信息
select * from sanguo
where
name is NULL and country="蜀國" and sex="男";
二、查找姓名爲 "" 的英雄信息
select * from sanguo where name="";
三、在全部蜀國英雄中查找攻擊力大於150的而且名字不爲NULL的英雄的姓名、攻擊值和國家
select name,gongji,country from sanguo
where
country="蜀國" and gongji>150 and name is not NULL;
四、查找魏蜀兩國英雄中攻擊力小於200而且防護力小於80的英雄信息
select * from sanguo
where
country in("魏國","蜀國") and gongji<200 and fangyu<80;
四、注意
一、NULL :空值,只能用is、is not去匹配
二、"" :空字符串,只能用 =、!= 去匹配
四、模糊查詢(like)
一、where 字段名 like 表達式
二、表達式
一、_ :匹配單個字符
二、% :匹配0到多個字符
三、練習
# name中有2個字符以上的
select name from sanguo where name like "_%_";
# 匹配全部,但不包括NULL
select name from sanguo where name like "%";
# 匹配名字爲3個字符
select name from sanguo where name like "___";
# 匹配姓趙的英雄
select name from sanguo where name like "趙%";
七、SQL高級查詢
一、總結
三、select ...聚合函數 from 表名
一、where ...
二、group by ...
四、having ...
五、order by ...
六、limit ...;
二、order by :給查詢結果排序
一、order by 字段名 ASC/DESC
二、ASC(默認) :升序
DESC :降序
三、練習
一、將全部英雄按防護值從高到低排序
select * from sanguo order by fangyu DESC;
二、將蜀國英雄按攻擊值從高到低排序
select * from sanguo
where country="蜀國" order by gongji DESC;
三、將魏蜀兩國英雄中名字爲3個字的,按防護值升序排序
select * from sanguo where
country in("魏國","蜀國") and name like "___"
order by fangyu;數據庫
select * from sanguo where
(country="蜀國" or country="魏國") and name like "___" order by fangyu;編程
select * from sanguo where
(country="蜀國" and name like "___") or
(country="魏國" and name like "___")
order by fangyu;
三、limit (永遠放在SQL命令的最後寫)
一、顯示查詢記錄的條數
二、用法
limit n; --> 顯示 n 條記錄
limit m,n; --> 從第 m+1 條記錄開始,顯示 n 條
limit 2,3 : 顯示第三、四、5三條記錄
三、練習
一、在蜀國英雄中,查找防護值倒數第2名到倒數第4名的英雄的姓名、防護值和國家
select name,fangyu,country from sanguo
where country="蜀國"
order by fangyu ASC
limit 1,3;
二、在全部蜀國名字不爲NULL的英雄中,查找攻擊值前3名的英雄的姓名、攻擊值和國家
select name,gongji,country from sanguo
where
country="蜀國" and name is not NULL
order by gongji DESC
limit 3;
四、分頁
每頁顯示5條記錄,顯示第4頁的內容
每頁顯示n條記錄,顯示第m頁的內容服務器
第1頁 :limit (1-1)*5,5 # 1 2 3 4 5
第2頁 :limit (2-1)*5,5 # 6 7 8 9 10
第3頁 :limit (3-1)*5,5 # 11 12 13 14 15
...
第m頁 :limit (m-1)*n,n
四、聚合函數
一、分類
avg(字段名) : 求該字段的平均值
sum(字段名) : 求和
max(字段名) : 最大值
min(字段名) : 最小值
count(字段名) : 統計該字段記錄的個數
二、練習
一、全部英雄中攻擊力最大值
select max(gongji) from sanguo;
二、統計id、name兩個字段分別有多少條記錄
select count(id),count(name) from sanguo;
五、group by : 給查詢的結果進行分組
一、查詢表中都有哪些國家
select country from sanguo group by country;
二、計算每一個國家的平均攻擊力
select country,avg(gongji) from sanguo
group by country;
先分組 再聚合 再去重
蜀國
蜀國
蜀國 200 蜀國
魏國
魏國 200 魏國
吳國 100 吳國
三、注意
一、select以後的字段名若是沒有在group by以後出現,則必需要對該字段進行聚合處理(聚合函數)
四、練習
一、查找全部國家中英雄數量最多的前2名的國家名稱和英雄數量(count())
select country,count(id) as number from sanguo
group by country
order by number DESC
limit 2;
六、having語句
一、做用 :對查詢結果進行進一步的篩選
二、練習
一、找出平均攻擊力大於105的國家的前2名,顯示國家名和平均攻擊力
一、計算每一個國家的平均攻擊力
二、找到平均攻擊力 > 105 的
select country,avg(gongji) as average from sanguo
group by country
having average>105
order by average DESC
limit 2;
三、注意
一、having語句一般和group by語句聯合使用,過濾由group by語句返回的記錄集
二、where只能操做表中實際存在字段,having語句可操做由聚合函數生成的顯示列編程語言
七、表字段、表記錄操做函數
表字段(alter table 表名) 表記錄
增: add insert into 表名 ..
刪: drop delete from 表名 ..
改: modify update 表名 set ...
查: desc 表名; select * from 表名 ..性能