12.sql語句增刪改查快速回顧

一、對數據庫進行操作(DDL語句)。

1.創建數據庫。

create database [if not exists] 數據庫名稱 character set 字符編碼;

例:創建一個數據庫,名字爲db_1,字符編碼爲utf8

create database if not exists db_1 character set utf8;


2.查看數據庫。

2.1查看所有數據庫:show databases;

2.2 查看一個數據庫的創建方式:show create database 數據庫名稱;

例:

show create database db_1;


3.修改數據庫。

alter database db_name [character set xxx] 


4.切換當前操作的數據庫。

use 所要切換到的數據庫名稱。

例:use db_1


若要查看當前在哪個數據庫下:

select database();



二、mysql中的數據類型。

MySQL支持多種類型,大致可以分爲三類:數值、日期/時間和字符串(字符)類型。

數值類型:

wKiom1k0Gn2zlxGKAARiHZvuIm8342.png


日期和時間類型:

wKiom1k0GyzwULxGAAHkv3dPG9Y002.png


字符串類型:

wKiom1k0HGDz_6JYAAK-lMI4M-M273.png

CHAR和VARCHAR類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換。

BINARY和VARBINARY類類似於CHAR和VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。

BLOB是一個二進制大對象,可以容納可變數量的數據。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長度不同。

有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應4種BLOB類型,有相同的最大長度和存儲需求。



三、數據庫中的表操作。

1.在數據庫中創建表。

create table 表名 (字段以及每個字段的屬性,每個字段以逗號分隔)

例:

create table tb1( id int primary key auto_increment ,name char(20),gender bit default 1, birthday date,entry_date date,job char(20),salary double(4,2) unsigned, resume text );


!!這裏的primary key 屬性,就是主鍵了,那麼什麼是主鍵呢?

主鍵有兩個特點,就是非空並且值唯一。

auto_increment這個屬性是自增的意思,當主鍵字段是數字類型時可以使用,它可以讓數值自增。



2.查看數據庫中某個表的結構以及信息。

2.1查看一張表的表結構:desc tab_name;

例如:

desc tb1;


2.2 查看當前數據庫中所有的表:

show tables;


2.3 查看創建表時使用的sql語句:

show create table 表名;

例如:

show create table tb1 \G;


3.修改表結構。

3.1 給表增加一個字段:

格式:  alter table tab_name add [column] 列名 類型[完整性約束條件][first|after 字段名];

#其中的first和after是可選參數(可以不用,這兩個參數,如果不寫,默認添加的字段是在最後面)

#first是指添加到第一個字段的位置。

#after 是添加到某個字段的後面。

alter table user add addr varchar(20) not null unique first/after username


3.2 添加多個字段的示例:

alter table users2 

            add addr varchar(20),

            add age  int first,

            add birth varchar(20) after name;


3.3 修改表中某個字段的類型:

 alter table tab_name modify 列名 類型 [完整性約束條件][first|after 字段名];

例:

alter table users2 modify age tinyint default 20;

alter table users2 modify age int  after id;

修改表中字段的名字:

 alter table tab_name change [column] 列名 新列名 類型 [完整性約束條件][first|after 字段名];

 alter table users2 change age Age int default 28 first;


3.4刪除一個字段:

alter table tab_name drop [column] 列名;


3.5修改一個表名:

rename table 表名 to 新表名;


3.6修改表字符集:

alter table student character set utf8;


3.7 刪除整張表:

drop table 表名;


3.8 爲表中字段增加主鍵約束:

alter table tab_name add primary key(字段名稱,...)


3.9 刪除字段中的主鍵約束:

先刪除自增長在刪除主鍵

Alter table tb1 change id id int(11);//刪除自增長

Alter table tb1 drop primary key;//刪除主建


3.10 添加唯一索引:

格式:

alter table tab_name add unique [index|key] [索引名稱](字段名稱,...) 

例:

alter table users add unique(name)

alter table users add unique key user_name(name);


3.11 添加聯合索引:

alter table users add unique index name_age(name,age);#show create table users;


3.12 刪除唯一索引:

alter table tab_name drop {index|key} index_name;


四.對錶中的記錄進行操作。

  1. insert 在表中插入記錄:

    格式:insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......)

    例:

    insert into employee_new (id,name,birthday) values(1,'ayumi','1978-10-02');

    同時插入多條數據:

    insert into employee_new values   (4,'alvin1','1993-04-20'),   (5,'alvin2','1995-05-12);

    以鍵值對的方式插入數據:

    格式:

    insert [into] tab_name set 字段名=值

    例:

    insert into employee_new set id=130,name="bitch jolin"




    2. update 修改表中記錄:

    格式:

    update tab_name set field1=value1,field2=value2,......[where 語句]

     例:

    update employee_new set birthday="1995-09-05" WHERE id=1;

  #PDATE語法可以用新值更新原有錶行中的各列。

 #SET子句指示要修改哪些列和要給予哪些值。

 #WHERE子句指定應更新哪些行。如沒有WHERE子句,則更新所有的行.


另外一個用法示例:

 --- 將suhaozhi的薪水在原有基礎上增加130元。

    update employee_new set salary=salary+130 where name='suhaozhi';



3.delete 刪除表中的一個記錄:

格式:

delete from tab_name [where ....]


#delete語句如果不跟where語句則刪除整張表中的數據

#delete只能用來刪除一行記錄

#delete語句只能刪除表中的內容,不能刪除表本身,想要刪除表,用drop。

#TRUNCATE TABLE也可以刪除表中的所有數據,詞語句首先摧毀表,再新建表。此種方式刪除的數據不能在事務中恢復。

例:

刪除tb1這個表中,name字段爲suhaozhi的記錄。

delete from tb1 where name='suhaozhi';


刪除表中的所有記錄:

delete from tb1;


使用truncate刪除表中記錄:

truncate table tb1;

#TRUNCATE TABLE也可以刪除表中的所有數據,詞語句首先摧毀表,再新建表。此種方式刪除的數據不能在事務中恢復。



4.select 查詢語句:

select 查詢語句的基本格式:

   SELECT *|field1,filed2 ...   FROM tab_name

                  WHERE 條件

                  GROUP BY field

                  HAVING 篩選

                  ORDER BY field

                  LIMIT 限制條數

下面是關於select 查詢語句的示例:

create table tb2( id int primary key auto_increment, name varchar(20), yuwen DOUBLE, shuxue DOUBLE, yingyu double );


insert into tb2 values( 1,"aaa",98,98,99), (2,"bbb",35,98,66), (3,"ccc",59,59,62), (4,"ddd",88,89,87), (5,"eee",100,65,88);


現在有一張成績表,表裏有五條記錄:

select * from tb2;

+----+------+-------+--------+--------+

| id | name | yuwen | shuxue | yingyu |

+----+------+-------+--------+--------+

|  1 | aaa  |    98 |     98 |     99 |

|  2 | bbb  |    35 |     98 |     66 |

|  3 | ccc  |    59 |     59 |     62 |

|  4 | ddd  |    88 |     89 |     87 |

|  5 | eee  |   100 |     65 |     88 |

+----+------+-------+--------+--------+

5 rows in set (0.03 sec)


查看整張表:

select * from tb2;


查看name字段爲ddd的語文和數學成績:

select yuwen,shuxue from tb2 where name="ddd";


列出所有學員的語文和英語的成績:

select yuwen,yingyu from tb2;


#其中from指定從哪張表篩選,*表示查找所有列,也可以指定一個列

#表明確指定要查找的列,distinct用來剔除重複行。


select 與數學計算表達式與as別名:

select name,yuwen+shuxue+yingyu from tb2; #顯示每個學生,語文數學英語的總和。

+------+---------------------+

| name | yuwen+shuxue+yingyu |

+------+---------------------+

| aaa  |                 295 |

| bbb  |                 199 |

| ccc  |                 180 |

| ddd  |                 264 |

| eee  |                 253 |

+------+---------------------+

使用字段別名後:

select name as '姓名' ,yuwen+shuxue+yingyu as '總成績' from tb2;

+--------+-----------+

| 姓名   | 總成績    |

+--------+-----------+

| aaa    |       295 |

| bbb    |       199 |

| ccc    |       180 |

| ddd    |       264 |

| eee    |       253 |

+--------+-----------+



使用where語句,進行查詢過濾:

例1:找出英語成績大於90分的學員:

select * from tb2 where yingyu > 90;


例2:找出總成績大於200分的所有學員的名字和成績:

 select name as '姓名' ,yuwen+shuxue+yingyu as '總成績' from tb2 where yuwen+shuxue+yingyu > 200;

+--------+-----------+

| 姓名   | 總成績    |

+--------+-----------+

| aaa    |       295 |

| ddd    |       264 |

| eee    |       253 |

+--------+-----------+


where語句中可以使用的比較運算符補充:

 > < >= <= <> !=

between 80 and 100 值在10到20之間

in(80,90,100) 值是10或20或30

like 'yuan%'

like 模糊匹配

在多個條件直接可以使用邏輯運算符 and or not

例1:顯示出語文成績在70~100分之間的學員姓名以及語文成績。

select name,yuwen from tb2 where yuwen between 70 and 100;

+------+-------+

| name | yuwen |

+------+-------+

| aaa  |    98 |

| ddd  |    88 |

| eee  |   100 |

+------+-------+


例2:顯示出數學成績爲98,65,59的學員分之間的學員姓名以及數學成績。

select name,shuxue from tb2 where shuxue in (98,65,59);

+------+--------+

| name | shuxue |

+------+--------+

| aaa  |     98 |

| bbb  |     98 |

| ccc  |     59 |

| eee  |     65 |

+------+--------+


例3:顯示所有name爲a開頭的成績信息。

select * from tb2 where name like 'a%';

+----+------+-------+--------+--------+

| id | name | yuwen | shuxue | yingyu |

+----+------+-------+--------+--------+

|  1 | aaa  |    98 |     98 |     99 |

+----+------+-------+--------+--------+


例4:找出所有語文成績和數學成績都小於90分的學員信息。

select * from tb2 where yuwen < 90 and shuxue < 90;

+----+------+-------+--------+--------+

| id | name | yuwen | shuxue | yingyu |

+----+------+-------+--------+--------+

|  3 | ccc  |    59 |     59 |     62 |

|  4 | ddd  |    88 |     89 |     87 |

+----+------+-------+--------+--------+


例5:找出成績爲空的學員。

select name from tb2 where yuwen is null



!排序:Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 語句後指定的別名。

基本格式:

select *|field1,field2... from tab_name order by field [Asc|Desc]

#Asc 升序、Desc 降序,其中asc(升序)爲默認值 ORDER BY 子句應位於SELECT語句的結尾。


例:以數學成績爲基準排列。

select * from tb2 order by shuxue;

+----+------+-------+--------+--------+

| id | name | yuwen | shuxue | yingyu |

+----+------+-------+--------+--------+

|  3 | ccc  |    59 |     59 |     62 |

|  5 | eee  |   100 |     65 |     88 |

|  4 | ddd  |    88 |     89 |     87 |

|  1 | aaa  |    98 |     98 |     99 |

|  2 | bbb  |    35 |     98 |     66 |

+----+------+-------+--------+--------+


例2:把所有學生的總成績,從高到低輸出:

select name as '姓名',yuwen+shuxue+yingyu as '總成績' from tb2 order by  總成績 desc;

+--------+-----------+

| 姓名   | 總成績    |

+--------+-----------+

| aaa    |       295 |

| ddd    |       264 |

| eee    |       253 |

| bbb    |       199 |

| ccc    |       180 |

+--------+-----------+




分組查詢:

示例準備:

create table test_menu( id int primary key auto_increment, product_name varchar(20), price float(6,2), born_date DATE, class varchar(20) );


INSERT INTO test_menu (product_name,price,born_date,class) VALUES

                                             ("蘋果",20,20170612,"水果"),

                                             ("香蕉",80,20170602,"水果"),

                                             ("水壺",120,20170612,"電器"),

                                             ("被罩",70,20170612,"牀上用品"),

                                             ("音響",420,20170612,"電器"),

                                             ("牀單",55,20170612,"牀上用品"),

                                             ("草莓",34,20170612,"水果");

#注意,按分組條件分組後每一組只會顯示第一條記錄.

#group by字句,其後可以接多個列名,也可以跟having子句,對group by 的結果進行篩選。

現在有一張表:

+----+--------------+--------+------------+--------------+

| id | product_name | price  | born_date  | class        |

+----+--------------+--------+------------+--------------+

|  1 | 蘋果         |  20.00 | 2017-06-12 | 水果         |

|  2 | 香蕉         |  80.00 | 2017-06-02 | 水果         |

|  3 | 水壺         | 120.00 | 2017-06-12 | 電器         |

|  4 | 被罩         |  70.00 | 2017-06-12 | 牀上用品     |

|  5 | 音響         | 420.00 | 2017-06-12 | 電器         |

|  6 | 牀單         |  55.00 | 2017-06-12 | 牀上用品     |

|  7 | 草莓         |  34.00 | 2017-06-12 | 水果         |

+----+--------------+--------+------------+--------------+

按照字段的位置進行分組:

select * from test_menu group by 5;

#這個5代表了當前表從左數第五個字段。

+----+--------------+--------+------------+--------------+

| id | product_name | price  | born_date  | class        |

+----+--------------+--------+------------+--------------+

|  4 | 被罩         |  70.00 | 2017-06-12 | 牀上用品     |

|  1 | 蘋果         |  20.00 | 2017-06-12 | 水果         |

|  3 | 水壺         | 120.00 | 2017-06-12 | 電器         |

+----+--------------+--------+------------+--------------+


#從左數第5個字段是class,按分組條件分組後每一組只會顯示第一條記錄。


對購物表按類名class字段分組後顯示每一組商品的價格總和:

select class,sum(price) from test_menu group by class;

+--------------+------------+

| class        | sum(price) |

+--------------+------------+

| 牀上用品     |     125.00 |

| 水果         |     134.00 |

| 電器         |     540.00 |

+--------------+------------+


對購物表按類名class字段分組後顯示每一組商品價格總和超過150的商品。

select class,sum(price) from test_menu group by class having sum(price) > 150;

+--------+------------+

| class  | sum(price) |

+--------+------------+

| 電器   |     540.00 |

+--------+------------+


#!!!! 在這裏特別強調一點!having和where雖然都可以對查詢結果做過濾!!但是它們是有區別的!

where只能用於分組前的篩選!! 而having則可以用於分組後的篩選!這是因爲having可以使用聚合函數!!where中不可以!!!!!!這點牢記!




常用的聚合函數補充:

一般情況下,聚合函數會配合分組查詢去使用。

#把要求的內容查出來再包上聚合函數即可。

  1. count 統計行個數。

    例1:統計這張表一共有多少行記錄

     select count(*) from test_menu;

    例2:統計數學成績大於70的有多少條記錄。

    select count(*) from tb2 where shuxue > 70;

    例3:統計總分大於200的記錄有多少?

    select count(*) from tb2 where yuwen+shuxue+yingyu > 200;


    2.sum 統計滿足條件的行的和。

    例1:統計這個班的語文總成績。

    select sum(yuwen) as '語文總成績' from tb2;

 +-----------------+

| 語文總成績      |

+-----------------+

|             380 |

+-----------------+



    例2:統計這個班各科的總成績。

    select sum(yuwen),sum(shuxue),sum(yingyu) from tb2;

   

    例3:求班級語文成績的平均值。

    select sum(yuwen)/count(*) from tb2;

    

  3.avg求平均值。

  例1: 求班級語文成績的平均值。

   select avg(yuwen) from tb2;

  例2: 求班級總和的平均分。

    select avg(yuwen+shuxue+yingyu) from tb2;


4.max&min 求最高值或者最低值。

 例:

select max(yuwen+shuxue+yingyu) from tb2;

select min(yuwen+shuxue+yingyu) from tb2;


5.ifnull 將空值轉換爲指定的值。

注意!!!!!null 和所有的數計算都是null,所以需要用ifnull將null轉換爲0!!!

例:ifnull(yuwen,0)



6.limit 指定查找出記錄的數量。

select * from tb2 limit 1; #只顯示出結果的第一行。

select * from tb2 limit 2,5; #跳過前兩行,顯示接下來的後5行。



7.REGEXP 使用正則表達式進行查詢。

 select * from tb2 where name regexp '^a';



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章