1. 程式人生 > >mysql 的基本操作

mysql 的基本操作

---恢復內容開始---

mysql是一個數據庫,太多的也不想說了,什麼公司的什麼年代建立的,跟我沒關係,會用就完了,怎麼安裝自行百度吧。

1初識mysql語句

操作資料夾(庫)

create database db1 charset utf8;

檢視當前建立的資料庫;show create database db1;

檢視所有的資料庫;show databases;

alter database db1  charset gbk;

drop database db1;

操作檔案(表)

切換資料夾;(進入資料夾)use db1;

檢視當前所在的資料夾;select database();

create table t1(id int,name char);

檢視當前的這張t1表;show create table t1;

檢視所有的表;show tables;

查看錶的詳細資訊;desc t1;

modify修改的意思; alter table t1 modify name char(6);

改變name為答謝的NAME;alter table t1 change name NAME char(7);

刪除表;drop table t1;

操作檔案內容(記錄)

插入一條資料,規定id,name資料

insert t1(id,name) valuse(1,‘名字’),(2,“名字”);

 

select id from db1。t1;

select id,name from db1.t1;

select * from db1。t1;

update db1.t1 set name=“新名字”;

update db1.t1 set name=‘新名字’ where id = 2;

delete from t1;

delect from t1 where id = 2;

2庫的操作

1建立資料庫

create database 資料庫名 charset utf8;

資料庫命名規則:基本上跟python或者js的命名規則一樣

可以由字母,數字,下劃線,@,#,¥,

區分大小寫

唯一性

不能使用關鍵字 create select

不能單獨使用數字

最長128位

 

2資料庫相關操作

檢視資料庫;show databases;

檢視當前庫;show create database db1;

檢視所在的庫;select database();

選擇資料庫;use 資料庫名

刪除資料庫;drop database 資料庫名;

修改資料庫;alter database db1 charset utf8;

3表的操作

1,建立資料庫

create database db2 charset utf8;

2,使用資料庫

use db2;

3,建立表

create table 表名(欄位名1 型別[(寬度)約束條件],

。。。。

);

create table a1(

  id int,

  name varchar(50),

  age int(3)

);

4,插入表的記錄

insert into a1 values

(1,‘名字’,18),

。。。

5,查詢表的資料和結構

(1)查詢a1表中的儲存資料

select * from a1;

(2)查詢a1表的結構

desc a1;

(3)查看錶的詳細結構

show create table a1\G;

6,複製表

(1)新建立一個數據庫db3

create database db3 charset utf8;

(2)使用db3

use db3;

(3)複製db2.a1的表結構和記錄

複製表的操作(即複製了表結構,又複製了記錄)

create table b1 select * from db2.a1;

4資料型別

mysql常用的資料型別包括

1,數字:

整數:tinyint int bigint

小數:

  float:在位數比較短的情況下不精準

  double:在位數比較長的情況下不精準

  decimal:(如果用小數,推薦使用decimal)

    精準

    內部原理是以字串形式去存

2,字串:

char(10):簡單粗暴,浪費空間,存取速度快

    root存成root000000

varchar:jingz,節省空間,存取速度慢

sql優化:建立表時,定長的型別往前放,變長的往後放

            性別      地址,或詳細資訊

255個字元,超了就把檔案路徑存放到資料庫中。

  比如圖片,視訊等找一個檔案伺服器,資料庫中只存路徑或url。

3,時間型別:

最常用:datetime

4,列舉型別與集合型別

enum和set

整數型別:tinyint smallint mediumlnt int bigint

作用儲存年齡,等級,id,各種號碼等

========================================
        tinyint[(m)] [unsigned] [zerofill]

            小整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號:
                -128 ~ 127
            無符號:
~ 255

            PS: MySQL中無布林值,使用tinyint(1)構造。



========================================
        int[(m)][unsigned][zerofill]

            整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號:
                    -2147483648 ~ 2147483647
            無符號:
~ 4294967295



========================================
        bigint[(m)][unsigned][zerofill]
            大整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號:
                    -9223372036854775808 ~ 9223372036854775807
            無符號:
 ~  18446744073709551615

以上重點在於有符號,可以有負數

驗證1:有符號和無符號tinyint

============有符號tinyint==============
# 建立資料庫db4
create database db4 charset utf8;

# 切換到當前db4資料庫
mysql> use db4;

# 建立t1 規定x欄位為tinyint資料型別(預設是有符號的)
mysql> create table t1(x tinyint);

# 驗證,插入-1這個數
mysql>   insert into t1 values(-1);

# 查詢 表記錄,查詢成功(證明預設是有符號型別)
mysql> select * from t1;
+------+
| x    |
+------+
| -1 |
+------+

#執行如下操作,會發現報錯。因為有符號範圍在(-128,127)
mysql>   insert into t1 values(-129),(128);
ERROR 1264 (22003): Out of range value for column 'x' at row 1


============無符號tinyint==============
# 建立表時定義記錄的字元為無符號型別(0,255) ,使用unsigned
mysql> create table t2(x tinyint unsigned);

# 報錯,超出範圍
mysql>   insert into t2 values(-129);
ERROR 1264 (22003): Out of range value for column 'x' at row 1

# 插入成功
mysql>   insert into t2 values(255);
Query OK, 1 row affected (0.00 sec)

以上重點在於帶符號的有負數,無符號的不帶負數,儲存資料一樣多,也就是不帶符號的正數存的多

驗證2:int型別後面的儲存是顯示寬度,而不是儲存寬度

mysql> create table t3(id int(1) unsigned);

#插入255555記錄也是可以的
mysql> insert into t3 values(255555);

mysql> select * from t3;
+--------+
| id     |
+--------+
| 255555 |
+--------+
ps:以上操作還不能夠驗證,再來一張表驗證用zerofill 用0填充

# zerofill 用0填充
mysql> create table t4(id int(5) unsigned zerofill);


mysql> insert into t4 value(1);
Query OK, 1 row affected (0.00 sec)

#插入的記錄是1,但是顯示的寬度是00001
mysql> select * from t4;
+-------+
| id    |
+-------+
| 00001 |
+-------+
row in set (0.00 sec)

以上重點是存在資料庫中的和看到的不一樣,資料庫中會預設加0

浮點型

定點數型別:dec等同於decimal

浮點型別:float double

作用:儲存薪資、身高、體重等

-------------------------FLOAT-------------------
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
#引數解釋:單精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30

#有符號:
           -3.402823466E+38 to -1.175494351E-38,
           1.175494351E-38 to 3.402823466E+38

#無符號:
           1.175494351E-38 to 3.402823466E+38
#精確度: 
           **** 隨著小數的增多,精度變得不準確 ****


 -------------------------DOUBLE-----------------------
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

#引數解釋: 雙精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30

#有符號:
           -1.7976931348623157E+308 to -2.2250738585072014E-308
           2.2250738585072014E-308 to 1.7976931348623157E+308

#無符號:
           2.2250738585072014E-308 to 1.7976931348623157E+308

#精確度:
           ****隨著小數的增多,精度比float要高,但也會變得不準確 ****

======================================
--------------------DECIMAL------------------------
decimal[(m[,d])] [unsigned] [zerofill]

#引數解釋:準確的小數值,M是整數部分總個數(負號不算),D是小數點後個數。 M最大值為65,D最大值為30。


#精確度:
           **** 隨著小數的增多,精度始終準確 ****
           對於精確數值計算時需要用此型別
           decaimal能夠儲存精確值的原因在於其內部按照字串儲存。

以上重點就是說越長越不準確

日期型別

date time datetime timestamp year

作用:儲存使用者註冊時間,文章釋出時間,員工入職時間,出生日期等

語法:
        YEAR
            YYYY(1901/2155)

        DATE
            YYYY-MM-DD(1000-01-01/9999-12-31)

        TIME
            HH:MM:SS('-838:59:59'/'838:59:59')

        DATETIME

            YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)

        TIMESTAMP

            YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)

列舉和集合

列舉enum 單選 只能在給定的範圍內選一個值,如性別 

集合set 多選 在給定的範圍內可以選擇一個或一個以上的值(愛好1,愛好2.。。。)

mysql> create table consumer(
    -> id int,
    -> name varchar(50),
    -> sex enum('male','female','other'),
    -> level enum('vip1','vip2','vip3','vip4'),#在指定範圍內,多選一
    -> fav set('play','music','read','study') #在指定範圍內,多選多
    -> );
Query OK, 0 rows affected (0.03 sec)


mysql> insert into consumer values
    -> (1,'趙雲','male','vip2','read,study'),
    -> (2,'趙雲2','other','vip4','play');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from consumer;
+------+---------+-------+-------+------------+
| id   | name    | sex   | level | fav        |
+------+---------+-------+-------+------------+
|    1 | 趙雲    | male  | vip2  | read,study |
|    2 | 趙雲2   | other | vip4  | play       |
+------+---------+-------+-------+------------+
rows in set (0.00 sec)

5完整性約束

主要有這幾種

標識該欄位為該表的主鍵,可以唯一的標識記錄 ;primary key(pk) 

標識該欄位位該表的外來鍵 ;foreign key(fk)

not null ;標識該欄位不能為空

unique key(uk);標識該欄位的值是唯一的

auto——increment ; 標識該欄位的值自動增長(整數型別,而且為主鍵)

default ; 為該欄位設定預設值

 

unsigned 無符號

zerofill 使用0填充

 

#1. 是否允許為空,預設NULL,可設定NOT NULL,欄位不允許為空,必須賦值
#2. 欄位是否有預設值,缺少的預設值是NULL,如果插入記錄時不給欄位賦值,此欄位使用預設值
sex enum('male','female') not null default 'male'

#必須為正值(無符號) 不允許為空 預設是20
age int unsigned NOT NULL default 20 
# 3. 是否是key
主鍵 primary key
外來鍵 foreign key
索引 (index,unique...)

 

not null 與 default

是否可空,null表示空,非字串

not null   不可以   null  可以

預設值,建立列時可以指定預設值,當插入資料時如果未主動設定,則自動新增預設值

create table tb1(

  nid int not null defalut 2,

  num int not null

);

unique不同的,mysql中稱為單列唯一

create table departm(

  id int unique,                 建表的時候就寫裡面

  name char(10) unique         

);

聯合唯一,只要兩列記錄,有一列不同,既符合聯合唯一的約束

create table services(

  id int,

  ip char

  port int

  unique(id)

  unique(IP,port)

);

primary key一般寫在id裡 唯一且不為空

auto_increm約束的欄位為自動增長,約束的欄位必須同時被key約束

foreign key 讓兩張表有關聯

6外來鍵的變種 三種關係

如何找出兩張表之間的關係

因為有了foreign key的約束,使得兩張表形成了三種關係

一對多,多對多,多對一

找出兩張表的關係

 

分析步驟:
#1、先站在左表的角度去找
是否左表的多條記錄可以對應右表的一條記錄,如果是,則證明左表的一個欄位foreign key 右表一個欄位(通常是id)

#2、再站在右表的角度去找
是否右表的多條記錄可以對應左表的一條記錄,如果是,則證明右表的一個欄位foreign key 左表一個欄位(通常是id)

#3、總結:
#多對一:
如果只有步驟1成立,則是左表多對一右表
如果只有步驟2成立,則是右表多對一左表

#多對多
如果步驟1和2同時成立,則證明這兩張表時一個雙向的多對一,即多對多,需要定義一個這兩張表的關係表來專門存放二者的關係

#一對一:
如果1和2都不成立,而是左表的一條記錄唯一對應右表的一條記錄,反之亦然。這種情況很簡單,就是在左表foreign key右表的基礎上,將左表的外來鍵欄位設定成unique即可

 

7資料的增刪改查

插入資料 insert

更新資料 update

刪除資料 delete

插入資料

一、插入資料 INSERT
1. 插入完整資料(順序插入)
    語法一:
    INSERT INTO 表名(欄位1,欄位2,欄位3…欄位n) VALUES(值1,值2,值3…值n);

    語法二:
    INSERT INTO 表名 VALUES (值1,值2,值3…值n);

2. 指定欄位插入資料
    語法:
    INSERT INTO 表名(欄位1,欄位2,欄位3…) VALUES (值1,值2,值3…);

3. 插入多條記錄
    語法:
    INSERT INTO 表名 VALUES
        (值1,值2,值3…值n),
        (值1,值2,值3…值n),
        (值1,值2,值3…值n);

 4. 插入查詢結果
    語法:
    INSERT INTO 表名(欄位1,欄位2,欄位3…欄位n) 
                    SELECT (欄位1,欄位2,欄位3…欄位n) FROM 表2
                    WHERE …;

二、更新資料UPDATE
語法:
    UPDATE 表名 SET
        欄位1=值1,
        欄位2=值2,
        WHERE CONDITION;

示例:
    UPDATE mysql.user SET password=password(‘123’) 
        where user=’root’ and host=’localhost’;
三、刪除資料DELETE
語法:
    DELETE FROM 表名 
        WHERE CONITION;

示例:
    DELETE FROM mysql.user 
        WHERE password=’’;

查又分為單表查詢和多表查詢

一、單表查詢的語法
   SELECT 欄位1,欄位2... FROM 表名
                  WHERE 條件
                  GROUP BY field
                  HAVING 篩選
                  ORDER BY field
                  LIMIT 限制條數
二、關鍵字的執行優先順序(重點)

重點中的重點:關鍵字的執行優先順序
from
where
group by
having
select
distinct
order by
limit

1.找到表:from

2.拿著where指定的約束條件,去檔案/表中取出一條條記錄

3.將取出的一條條記錄進行分組group by,如果沒有group by,則整體作為一組

4.將分組的結果進行having過濾

5.執行select

6.去重

7.將結果按條件排序:order by

8.限制結果的顯示條數

(1)where約束

where子句中可以使用
1.比較運算子:>、<、>=、<=、<>、!=
2.between 80 and 100 :值在80到100之間
3.in(10,20,30)值是10或20或30
4.like 'xiaomagepattern': pattern可以是%或者_。%小時任意多字元,_表示一個字元
5.邏輯運算子:在多個條件直接可以使用邏輯運算子 and or not

關鍵字like模糊查詢   像

select * from 表 where 欄位 like ‘jin%’;只要該欄位以jin開頭不管後面什麼,都拿出來

萬用字元‘_‘  

select * from 表 where 欄位 like ‘ale_’;以ale開頭後面只有一位的

(2)group by 分組查詢

#1、首先明確一點:分組發生在where之後,即分組是基於where之後得到的記錄而進行的

#2、分組指的是:將所有記錄按照某個相同欄位進行歸類,比如針對員工資訊表的職位分組,或者按照性別進行分組等

#3、為何要分組呢?
    取每個部門的最高工資
    取每個部門的員工數
    取男人數和女人數

小竅門:‘每’這個字後面的欄位,就是我們分組的依據

#4、大前提:
    可以按照任意欄位分組,但是分組完畢後,比如group by post,只能檢視post欄位,如果想檢視組內資訊,需要藉助於聚合函式

繼續驗證通過group by分組之後,只能檢視當前欄位,如果想檢視組內資訊,需要藉助於聚合函式

 select * from emp group by post;# 報錯
 select post from employee group by post;

(3)聚合函式

max()求最大值     ------min

avg()求平均值

sum()求和

count()求總個數

#強調:聚合函式聚合的是組的內容,若是沒有分組,則預設一組
# 每個部門有多少個員工
select post,count(id) from employee group by post;
# 每個部門的最高薪水
select post,max(salary) from employee group by post;
# 每個部門的最低薪水
select post,min(salary) from employee group by post;
# 每個部門的平均薪水
select post,avg(salary) from employee group by post;

(4)having過濾

HAVING與WHERE不一樣的地方在於

#!!!執行優先順序從高到低:where > group by > having 
#1. Where 發生在分組group by之前,因而Where中可以有任意欄位,但是絕對不能使用聚合函式。

#2. Having發生在分組group by之後,因而Having中可以使用分組的欄位,無法直接取到其他欄位,可以使用聚合函式

以上重點就是having更精確

(5)limit限制查詢的記錄數:

示例:
    SELECT * FROM employee ORDER BY salary DESC 
     LIMIT 3;                    #預設初始位置為0 

    SELECT * FROM employee ORDER BY salary DESC
        LIMIT 0,5; #從第0開始,即先查詢出第一條,然後包含這一條在內往後查5條

    SELECT * FROM employee ORDER BY salary DESC
        LIMIT 5,5; #從第5開始,即先查詢出第6條,然後包含這一條在內往後查5條

desc倒序排序 從大到小

acs正序排序 從小到大

多表查詢

多表連線查詢

1,多表連線查詢

語法

SELECT 欄位列表
    FROM 表1 INNER|LEFT|RIGHT JOIN 表2
    ON 表1.欄位 = 表2.欄位;

連線所有

先寫個左連線中間加個union all 再寫個右連線

2,符合條件查詢

select employee.id,employee.name,employee.age,department.name from employee,department
    where employee.dep_id = department.id
    and age > 25
    order by age asc;

3,子查詢

子查詢是將一個查詢語句巢狀在另一個查詢語句中。

內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件。

子查詢中可以包含in,not in,any,all,exists,not exists等關鍵字

可以包含比較運算子=,!=,>,<等