MySQL學習筆記:基本資料型別與查詢操作
#客戶端將資料儲存到資料庫伺服器上的過程
1、連線到伺服器 mysql -u xxx -p xxx
2、選擇一個庫 use xxx
3、建立表或者修改表
4、斷開與資料庫伺服器的連線 exit; | quit; | \q
#mysql的資料型別
#數值型別(有符號和無符號)
1、整形
bigint 極大整形
0-2**64-1
int 大整形(4個位元組) 2^32-1 = 42億多
smallint 小整形(2個位元組)
0-65535
tinyint 微笑整形(1個位元組)
預設signed:-128 到 127
unsigned:0 到 2^8-1=255
2、浮點型
float(4位元組,最多顯示7個有效位)
用法:float(m,n) m為十進位制下總位數 n為十進位制下小數位位數
float(5,2)範圍是 -999.99到999.99
插入時,自動補全小數位,多出來的小數位會四捨五入
當有效數字位多於7位時,顯示時,只顯示準確的前七位,其他都是亂的
double(8位元組,最多顯示15個有效位)
用法:double(m,n) m為十進位制下總位數 n為十進位制下小數位位數
decimal(佔M+2個位元組,最多顯示28個有效位)
用法:decimal(M,D)
多用decimal和float,用double的很少
#字元型別
1、char(定長)
寬度取值範圍:1-255;即字串最長為255個字元
不給定寬度時為1
2、varchar(變長)
寬度取值範圍:1-65535,沒有預設寬度,必須指定
char是定長字串,不足定長的部分會被空格補齊,但是效能高
varchar是邊長字串,節省空間,但是效能低
#列舉型別
欄位值只能在列舉的範圍內取選擇
1、enum單選(最多有65536個不同的值)
欄位名 enum(值1,值2 ......)
2、set多選(最多有64個不同的值)
欄位名 set(值1,值2 ......)
比如:
create table t6(
name char(15),
sex enum("boy","girl","secret"),
hobby set("girl","boy","MySQL","Python","C++","PHP"));
#enum和set只能列舉字串型別
insert into t6 values( "Lucy","secret","C++,PHP");
#set多選時,用雙引號括住,中間直接填值
#日期時間型別
1、year年份,插入YYYY
2、date日期,插入YYYYMMDD
3、time時間,插入HHMMSS
4、datatime日期與時間,插入YYYYMMDDHHMMSS
5、timestamp日期時間,插入YYYYMMDDHHMMSS
注意:
插入記錄時datatime不給值,預設返回NULL
timestamp不給值,預設返回系統當前時間
#查詢表
1、and且
2、or或
3、is null空, is not null非空
注意:
空值NULL必須用is 或者is not 去匹配
""空字串必須用 = 或者 != 匹配
4、範圍內比較
between A and B
in (A,B,C ...)
not in (A,B,C ...)
5、模糊比較
欄位名 like 表示式
_ 匹配單個字元
% 匹配0到多個字元
比如
select * from table1 where name like "___"
匹配名字長度為3的童鞋
select * from talbe1 where name like "趙%"
匹配姓趙的童鞋
select * from table1 where name like "__%"
匹配名字至少有兩個字元的童鞋
#SQL查詢執行順序
3、select ...聚合函式 from ...
1、where
2、group by
4、having
5、order by
6、limit
#order by語句
作用:給查詢的結果進行排序
方式:升序,降序
ACS(預設):升序
DESC:降序
語法:order by 欄位名 排序方式
#limit永遠放在最後寫
limit n 顯示幾條記錄
limit m,n m表示從第幾條記錄開始顯示,n表示顯示幾條
#聚合函式
分類:
avg(欄位名):求平均值
sum(欄位名):求欄位的和
max(欄位名):求欄位的最大值
min(欄位名):求欄位的最小值
count(欄位名):統計該欄位記錄個數
比如,顯示成績最大值
select max(score) as "highest score" from table8;
顯示成績平均值
select avg(score) as "average score" from table8;
顯示成績高於100的學生人數
select count(*) from table8 where score>=100
#group by 分類
該過程是先按照欄位給所有資料分組,然後再計算其他要求的資料
比如:select country from t8 group by country
查詢都有哪些國家
注意:
1、group by之後的欄位名必須是select之後的欄位名
2、如果select之後的欄位名和group之後的欄位名不一致,必須進行聚合處理,否則必須因為結果行數不一樣而出錯
示例:查詢所有國家中英雄數量最多的前兩名的國家名稱和英雄數量
select country,count(*) as Num from table8 group by country order by Num
示例:找出平均攻擊力大於105的國家的前兩名,顯示國家名和平均攻擊力
select country,avg(damage) from table8 group by country having avg(damage)>105 limit 2
注意:
1、having語句通常與group by語句聯合使用,用於過濾由group by語句返回的記錄集
2、where的優先順序高於group,只能對分組之前的結果進行篩選;having優先順序低於group,用於對group之後的結果進行分組
#distinct(不重複的)
作用:不顯示欄位的重複值
示例:select distinct country from sanguo;
如果select country,name from sanguo; 則當且僅當country和name都相同時才能去重
#查詢表時做數學運算
運算子:+、-、*、/、%
示例:select id,name,score * 10 from table8;
#約束:為了保證資料的完整性、一致性、有效性的規則,可以限制無效資料插入到資料表中
#預設約束
作用:插入記錄時,如果不給該欄位賦值,則使用預設值
格式:欄位名 資料型別 default值
#非空約束
作用:不允許該欄位的值有NULL記錄
格式:欄位名 資料型別 not null
#表記錄的修改
delete from table_name where 條件;
不加where將表記錄全部刪除
update table_name set 欄位名=值1, where 條件
#索引:對資料庫表中的一列或者多列進行排序的結構(MySQL中是BTREE)
優點:防止多次遍歷資料庫記錄,加快檢索速度(相當於對索引排序後進行二分,MySQL中最多分三層)
缺點:進行增加、修改、刪除時,索引也需要動態維護,降低了資料的變更速度;需要佔用物理空間
#普通索引(index):
規則:
1、一個表中可以有多個index欄位
2、欄位的值可以有重複、且可以為NULL值
3、經常把做查詢條件的欄位設定為index欄位
4、index欄位的key標誌時MUL
建立普通索引:
1、建立表的時候建立索引欄位
index(欄位名1),index(欄位名2)......
2、向已存在的表中建立索引欄位
create index 索引名 on table(欄位名);
#檢視普通索引
1、desc 表明; 檢視key標誌為MUL即可
2、show index from table
#刪除普通索引
drop index 索引名 on table_name
只能一個一個刪除
#小知識點
在MySQL中呼叫bash命令
system bash命令
#唯一索引(unique)規則
一個表中可以有多個unique欄位
unique欄位的值不允許重複,但是可以為空
unique的key值是UNI
#建立唯一索引
1、在建立表時建立
create table t1(
id int default 0,
name char(20) unique);
2、也是在建立表時建立,和建立普通索引差不多
create table t1(
id int default 0,
name char(30),
unique(id),
unique(name));
3、在已存在的表中建立
create unique index name_ on t1(name);
#檢視唯一索引
1、desc
2、show index from t1\G;
#刪除唯一索引
drop index name from t2;
#主鍵(primary key)
1、一個表中只能由一個主鍵欄位
2、對應欄位的值不允許重複,且不能為空值
3、KEY標誌位PRI
4、一般把表中唯一能夠表示一條記錄的欄位設定為主鍵欄位
#建立主鍵
1、在建立表時建立,和unique一樣
create table t3(
id int primary key,
name char(20)
);
create table t3(
id int,
name char(20),
primary key(id)
);
2、在已存在的表上加入
alter table t2 add primary key(name);
#刪除主鍵
alter table t2 drop primary key;
#複合主鍵的概念
#自增長屬性
作用:通常和主鍵一起配合使用
#建立表時建立自增長屬性
欄位名 資料型別 primary key auto_increment
#使用
插入記錄時,不會動態維護,但會保證表內id不一樣
根據實驗,可能有一個變數在記錄表中自增屬性的最大值,然後每次插入預設時,用最大值+1
#向已存在表中新增自增長屬性
alter table table_name modify 欄位名 資料型別 primary key auto_increment
#刪除帶自增長屬性的主鍵
先刪除自增長屬性,但是該欄位還是主鍵:alter table t3 modify 欄位名 資料型別;