02 . Mysql基礎操做及增刪改查

Mysql基礎操做及增刪改查mysql

1、SQL語句的注意事項

  1. 每條SQL語句結束時要以;作爲結束符,也可使用\G以文本模式輸出.(除了use命令)
  2. SQL語句的關鍵字不區分大小寫(除了庫名字和表名字)
  3. 當你須要補全大部分庫和表名使用#
  4. 當你不須要一條語句輸出的結果以\c結束
  5. 當你想要退出數據庫時,可使用\q或者是exit,ctrl+d
  6. 咱們能夠在命令行執行sql語句,要經過mysql -e參數

mysql -e "show databases \G" 顯示到shell上sql

  1. 若是須要獲取SQL語句的幫助能夠用help命令

如:help create
若是須要進一步獲取幫助,能夠繼續使用help命令
如:help create databaseshell

2、系統數據庫

系統數據庫
information_schema: 虛擬庫,存放在內存中,主要存儲了系統中的一些數據庫對象信息,如用戶表信息,列信息,權限信息,字符信息等.
performance_schema: 主要存儲數據庫服務器的性能參數
mysql: 受權庫,主要存儲系統用戶的權限信息
test: 公共庫,任何人都能訪問,Mysql數據庫自動建立的測試數據庫
sys: 系統的元數據信息,方便DBA發現數據庫的不少信息,爲解決性能瓶頸體用了巨大幫助數據庫

3、數據庫相關操做

3.1 語法
create database 數據庫名 character set = 'utf8' collate=utf8_general_ci;    
    數據庫命名規則:
        1>能夠由字母,數字,下劃線,@,#,$
        2>區分大小寫
        3>惟一性
        4>不能使用關鍵字如create select
        5>不能單獨使用數字
        6>最長128位
3.2 關於字符集
# 數據表裏存放什麼樣的數據就選取相應的字符集: 簡體中文的字符集是gb2312和gbk: utf8是國際通用字符集
show character set;                           # 查看Mysql支持的字符集
show collation;                               # 查看字符集的排序規則,utfs-generic支持大多數的排序規則
create database db character set = 'utf8mb4' collate=utf8_general_ci; 
# 建立數據庫設置字符編碼和字符集的排序規則
show create database db\G;                                   # 查看db數據庫字符編碼
alter database db character set = latin1                     # 修改數據庫的字符編碼
use 庫名;                                                    # 切換數據庫
show databases;                                              # 查看全部的庫
drop database                                                # 刪除數據庫
4、 Mysql數據類型

Mysql常見的數據類型安全

在Mysql數據庫管理系統中,能夠經過存儲引擎來決定表的類型,同時,Mysql數據庫管理系統也提供了數據類型決定表存儲數據的類型,數值類型越大對於內存的消耗越多,合適的數據類型在必定程度上能增長數據庫的效率.服務器

Mysql數據庫管理系統提供的數據類型框架

  1. 整數類型: TINYINT SMALLINT MEDIUMINT INT BIGINT
  2. 浮點數類型: FLOAT 單精度浮點數值(7個有效位) DOUBLE雙精度(15個)
  3. 字符串類型: CHAR VARCHAR
  4. 時間和日期類型: DATE TIME DATETIME TIMESTAMP YEAR
  5. 枚舉類型: ENUM
  6. 集合類型: SET

數據類型的經常使用場景函數

  1. 整數類型:用於存儲用戶的年齡、遊戲的Level、經驗值等。
    分爲有符號(默認)和無符號
  2. 浮點數類型:做用:用於存儲用戶的身高、體重、薪水等
    浮點數類型可使用名稱後加(M,D)的方式表示,表示一共顯示M位數字(整數位+小數位),其中D表示小數點後面的位數,M和D又稱爲精度和標度。
  3. 時間和日期類型:用於存儲用戶的註冊時間,在線時長,文章的發佈時間,員工的入職時間等
  4. date類型:使用連字號爲分隔符分隔開 (顯示年月日)
  5. time類型:應該使用冒號做爲分隔符且須要加上單引號,或者是直接使用具體的數字(顯示時分秒)
  6. year類型:關於年的時間有個分界線是1970年,把在0069範圍內的值轉換爲20002069範圍內,而把7099範圍內的值轉換到19701999以內,爲了不發生這種現象最好就是寫全了.
  7. datetime和timestamp類型:都用於存儲包含當前日期和時間的時間戳
  • 若是字段沒有值或者是空值時timestamp會使用當前的系統時間做爲他的時間戳,而datetime只顯示出NULL。
  • 當已有字段更新時,datetime類型所對應的時間不會發生變化,timestamp類型所對應的時間會更新爲最新時間。
  1. 字符串類型:用於存儲用戶的姓名、愛好、發佈的文章等
  2. char:定長字符串,須要大小修飾符來指定要存儲值的長度,修飾符的範圍是0-255
  3. varchar:變長字符串,須要大小修飾符來指定要存儲值的長度,修飾符的範圍是0-65535
  4. ENUM類型即枚舉類型、集合類型SET
  5. 枚舉類型:通常用於性別,是女或是男二者選一個,不包含的不能選
  6. set類型:能夠多選,好比愛好中能夠有一個或者多個,但不能超出範圍,一個set最多包含64項。

5、Mysql增刪改查

5.1 建立表

語法:性能

create  table  表名(
        字段名1    類型[(寬度)約束條件]
        字段名2    類型[(寬度)約束條件]
        ...
)[存儲引擎  字符集];
  
# 說明: 在同一張表中,字段名和類型是必須有的,且字段名是不能相同;
# 中括號裏面的寬度和約束條件可選,整數類型不須要指定寬度,其餘的浮點型和定點型等須要指定寬度,也就是約束條件。
表school.student1
字段     字段     字段     字段
id       name     sex     age
1        tom      male     23     記錄
2        jack     male     21     記錄
3        alice    female   19     記錄

# 建立庫
mysql> create database school;

# 建立表
create table school.student1
(id int,name varchar(50),sex enum('male','female'),age int);

Example
create table student(stu_id INT NOT NULL AUTO_INCREMENT, name CHAR(32) NOT NULL, age INT NOT NULL, register_date DATE, PRIMARY KEY(stu_id) );測試

5.2 插入表數據
# 注意: 先看錶的結構再去插值,插值的時候數字不須要用引號,字符串必需要用雙引號或者是單引號引發來;
# 語法: insert  into  表名(字段1,字段2...)  values(字段值列表...)
# 順序插入多個記錄,不用指定字段名,此處指的順序並不是是id數字,而是插入的值和前面的字段是對應的;
mysql> insert into student1 values
     (1,'tom','male',23),
     (2,'jack','male',21),
     (3,'alice','female',19);
# 修改表
# 修改表名  
mysql> alter table student1 rename student2;

 1.插入完整數據(順序插入)  
 語法一:  insert into 表名(字段1,字段2,字段3..字段n) values(值1,值2,值3);  
 語法二:  insert into 表名  values (值1,值2,值3..值n);  
 2.指定字段插入數據  
 語法一:  insert into 表名(字段1,字段2) values (值1,值2);  
 3.插入多條記錄使用逗號隔開  
 語法一:  insert into 表名 values(值1,值2,值3),(值1,值2,值3..值n),(值1,值2,值3 );  
 4.插入查詢結果  
 語法一:  insert into 表1(字段1,字段2,字段3...字段n)  
 select (字段1,字段2,字段3) FROM 表2 WHERE ...;

Example
insert into student(name,age,register_date)values("youmen",21,"2020-02-12");

5.3 查看錶
mysql> show table;   
# 查看庫中已有的表  
  
# 查看錶結構  
mysql> desc student1;  
mysql> show create table student1;  
  
# 查詢表中指定字段的值  
mysql> select id,name,sex from student1\G;  
  
mysql> select * from student1;   
# 查詢表中全部字段的值,由於尚未插入字段,因此查詢到數據都是空的  

# 聚合查詢
# 查詢一個表中有多少條記錄,可使用SQL內置的count()函數查詢~~~~
select count(*) from students;
5.4 更新數據update
# 語法: update 表名  SET  字段1=值1,字段2=值2...  WHERE  CONDITION;
# 表的修飾符
# not null        標識該字段不能爲空
# default         爲該字段設置默認值
mysql> update student2 set name='flying' where id=2;   # 匹配id=2的哪一行,並將name字段換成flying;   
mysql> update student2 set name='flying' where d=3 and sex='female';  # 此處and也能夠是or
# 添加字段
mysql> alter table student2 add id int(3) not null default 22, add gender enum('M','WW');
5.5 刪除表
mysql> drop table 表名,表名;  
mysql> drop table IF EXISTS student2;        # 這個表存在就刪除,不存在也不會報錯,能夠刪除腳本使用
# 刪除字段/表
delete FROM 表名 [where condtion];
mysql> alter table student2 drop id;
mysql> delete from student2;  
mysql> delete from mysql.user where authentication_string='';  # 出於安全考慮將表中沒有密碼的刪掉  
mysql> delete from student2 where id=2 and name='flying';   # 匹配到id=2而且name=flying的刪掉此類數據

六. 單表查詢

6.1 簡單查詢:
一、單列查詢去重:select distinct  字段名  from  表名; (distinct爲去重)
            
二、查詢同時運算:select 字段名(數據類型爲數字)*14 from 表名;

三、 改變表頭輸出:select 字段名(數據類型爲數字)*14 as(能夠省略)  新表頭 from 表名;  
eg:  
mysql> select name from student;
+-------+
| name  |
+-------+
| zhou  |
| alice |
+-------+

mysql> select CONCAT("name:",name)as message from student;
+------------+
| message    |
+------------+
| name:zhou  |
| name:alice |
+------------+
6.2 條件查詢:

如下爲操做符列表,可用於WHERE子句中。
下表中實例假定A爲10,B爲20

操做符 描述 實例
= 等號,檢測兩個值是否相等,若是相等返回true (A = B) 返回false。
<>, != 不等於,檢測兩個值是否相等,若是不相等返回true (A != B) 返回 true。
> 大於號,檢測左邊的值是否大於右邊的值, 若是左邊的值大於右邊的值返回true (A > B) 返回false。
< 小於號,檢測左邊的值是否小於右邊的值, 若是左邊的值小於右邊的值返回true (A < B) 返回 true。
>= 大於等於號,檢測左邊的值是否大於或等於右邊的值, 若是左邊的值大於或等於右邊的值返回true (A >= B) 返回false。
<= 小於等於號,檢測左邊的值是否小於於或等於右邊的值, 若是左邊的值小於或等於右邊的值返回true (A <= B) 返回 true。
一、單條件查詢:where
        select 字段 from  表名  where  條件判斷;
        select 字段 from  表名  where  條件判斷 and 條件判斷;
        select 字段 from  表名  where  條件判斷(between A and B); --> 範圍
            eg: select name from haha where id between 0 and 2;
                    +------+
                    | name |
                    +------+
                    | ljt  |
                    +------+
                    1 row in set (0.00 sec)

        SELECT name, salary FROM employee5 WHERE salary NOT IN (4000,5000,6000,9000) ;
        SELECT name,job_description  from employee5 where job_description is null;(字段爲空)
        SELECT * FROM employee5 WHERE name LIKE 'al%'; %表明多個字符
        SELECT * FROM employee5 WHERE name LIKE 'al___'; --> "_"下劃線表明一個字符
        正則:' = ' 精確匹配;'like'  模糊查詢; ' regexp '正則查詢

	select * from student where register_date > '2020-02-13';
	# 使用主鍵來做爲WHERE子句的條件查詢是很是快速的.

二、排序:order by 字段(通常此字段都是數字,排個成績啥的)
單列:默認升序,在末尾加DESC則變爲降序;
eg:
mysql> select id from haha order by id ;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
4 rows in set (0.00 sec)

mysql> select id from haha order by id DESC;
            +----+
            | id |
            +----+
            |  4 |
            |  3 |
            |  2 |
            |  1 |
            +----+
            4 rows in set (0.00 sec)

    多列:先按第一條件,在第一條件框架中再按第二條件
           eg: mysql> select id from haha order by money,id;
6.3 限制型查詢:limit num1,num2 num1爲從哪裏開始,num2爲包括第num1的接下來num2個
先用order排序,再使用limit 3,5;
    eg: SELECT * FROM employee5 ORDER BY salary DESC LIMIT 3,5;
6.4 利用函數:count() 計數 max()最大 avg()平均 sum()和
6.5 分組查詢:group by [分組其實就是把"某字段值"相同的"行"分爲一組]
SELECT 字段1 FROM employee5 GROUP BY 字段2;---按字段2分組,字段2中值相同的記錄被分爲一組。
    group_concat函數能夠將分完組以後的,某一組的某個字段以列表方式打印出來。
    eg: SELECT dep_id,group_concat(name) FROM employee5 GROUP BY dep_id;
        過程解析:一、分組:先以dep_id字段爲分組標準進行分組,dep_id字段相同的行被分爲一組,
                 二、打印:使用group_concat函數調用name字段,將每一個組中全部行的"name"字段作成一個列表,將此列表看做爲一個值,進行打印;

多表查詢

交叉連:笛卡爾積
eg:select a,b from info,departtment;

只有當info表,departtment表都包含

內外鏈接區別:內鏈接只能顯示出兩表中符合條件的字段
外鏈接能夠顯示主表的所有字段,未能匹配到副表的顯示null

內鏈接:SELECT 字段列表   FROM 表1 ,表2  WHERE    表1.字段 = 表2.字段;
    eg:select info.name,info.age,info.dep_num,department.dep_num  from info,department where info.dep__num = department.dep_num;
外鏈接:
    左鏈接:select info.name,info.age,info.dep_num,department.dep_name from info left join department on info.dep_num = department.dep_num;
                                             ~~~~~~              ~~~~
                                                ,                     where    
    右鏈接:
相關文章
相關標籤/搜索