說明
上節內容學習了數據庫 MySQL
的安裝、驗證、數據庫管理工具、數據庫的基本操作命令,還沒有學習的同學可以從主頁去看上一篇推送內容
本節內容就學習有關數據庫中表的操作,這其中包括 表內
和 表關聯
的:創建、列數據類型、數據查詢、篩選、刪除、添加、修改等等操作,這塊內容極為重要,重點不但需要掌握基本的 SQL使用規則,還要掌握一些系統提供的SQL函數。
提示:你可以將sql理解為一種編程語言格式,那么這其中用到的所有標點符號都是英文的,括號都是成對出現的,這種低級錯誤千萬別給自己養成"習慣"。
表(CRUD)
1,創建表
create table 表名(列名 列的類型(長度) 列的約束,列名2 列的類型(長度) 列的約束);
列的類型
int
:和Java
中相同char
:固定長度(長度指的是字符個數)varchar
:可變長度(長度指的是字符個數)double
:float
:boolean
:date
:YYYY-MM-DDtime
:hh:mm:ssdatetime
:YYYY-MM-DD hh:mm:ss,默認值是 nulltimestamp
:YYYY-MM-DD hh:mm:ss,默認使用當前時間text
:主要用來存放文本。blob
:存放二進制。列的約束
主鍵約束:
primary key
唯一約束:
unique
非空約束:
not null
舉例,創建學生表
登錄
MySql
mysql -u root -p密碼
進入指定數據庫(如果沒有數據庫,則利用前面的創建數據庫語句進行創建)
use 數據庫名字;
這兩步是必須的,我們的表都是在庫的基礎上才有的,所以在創建表之前我們需要選對要使用的數據庫。
1,創建學生表
create table student( sid int primary key, sname varchar(30), ssex int, sage int);
2,查看表
show tables;
3,查看表的創建過程
show create table 表名;
4,查看表結構
desc 表名;
5,修改表
添加列(add)
alter table 表名 add 列名 列的類型 列的約束alter table student add chengji int not null;
修改列(modify)
alter table 表名 modify 列名 列的類型(長度);
修改列名(change)
alter table 表名 change 原列名 新列名 列名的類型(長度);
刪除列(drop)
alter table 表名 drop chengji;
修改表名(rename)
rename table 原表名 to 新表名;
修改表的字符集
alter table 表名 character set 字符集名稱;
6,刪除表
drop table 表名;
表內、表與表之間的 SQL
1,插入數據
insert into 表名(列名1,列名2,列名3...) values (列名1對應的值,列名2對應的值,列名3對應的值);
批量插入
insert into student values(103,lunzima,1,18),(104,houyi,0,20),(105,hanbin,1,22);
批量插入效率高于單條插入,但是批量插入其中一條如果出錯,可能引起同批插入的其他條數據錯誤。
注:
- 如果是全列名插入,則可以省略表名后的列名不寫,例如下面這樣:
insert into student values(100,yasuo,0,25);
設置了主鍵的列,插入時要保證主鍵不重復。
插入中文亂碼解決方法
在 MySql 的安裝目錄(比如我的是:C:/Program Files/MySQL/MySQL Server 5.5)下,找到
my.ini
文件,打開后編輯default-character-set=gbk
這句代碼即可,默認是utf8
然后在命令行重新登錄賬戶,操作即可。
部分列插入時,列名不能省略。
insert into 表名(要插入的列1,列2...) values(對應列的值...);
2,查詢表中記錄
select * from 表名;
- 查看表中指定列的數據
select 列名1,列名2 from 表名;
別名
as
查詢select 表名的別名.列名1,表名的別名.列名2 from 表名 as 表名的別名;
別名
as
是可以省略的。也可以給列名加別名,像下面這樣select 表名的別名.列名1 列名1的別名,表名的別名.列名2 列名2的別名 from 表名 表名的別名;
去重查詢
// 查詢表中某列數據,并去掉重復值select distinct 列名 from 表名;
select 運算查詢
select *,列名*0.85 from 表名;
這里的運算符可以是
+
,-
,*
,/
。增加的列也可以添加別名;增加的列僅僅是在查詢結果上顯示,不會真正改變表中的結構。where
后的條件寫法關系運算符:
>
,>=
,<
,<=
,!=
,<>
select * from 表名 where 列名 關系運算符 限定條件的值;// 比如這樣select * from product where price <> 500;
其中,
!=
不是標準的 SQL 語法,<>
才是標準的不等于。邏輯運算符:
and
,or
,no
// 舉例select * from product where price > 10 and price < 2000;// 上面這句和下面這句等價select * from product where price between 11 and 1999;
模糊查詢:
like
_
:代表一個字符。%
:代表多個字符。
// 查詢商品名字中帶有代碼兩個字的所有商品select * from product where pname like %代碼%;// 查詢商品名字中第二個字符是一的所有商品select * from product where panme like _一%;
在某個范圍獲得值:
in
// 查出商品編號為 3 和 5 的所有商品select * from product where cno in (3,5);
排序查詢:
order by
最后執行,對
select
的結果進行操作。asc
:升序(默認排序方式)desc
:降序
// 按照某列進行排序select * from 表名 order by 列名 desc/asc;// 結合 where 條件的結果,在進行排序select * from 表名 where 列名 條件運算符 條件值 order by desc/asc;
聚合函數
sum()
:求和avg()
:求平均值max()
:最大值min()
:最小值count()
:統計數量
// 求和select sum(要求和的列名) from 表名;// 求平均值select avg(要求平均值的列名) from 表名;// 求最大值select max(要求最大值的列名) from 表名;// 求最小值select min(要求最小值的列名) from 列名;// 統計數量select count(表中任意一列或者直接寫`*`) from 表名;
注意:聚合函數不能直接跟在
where
后面。// 比如:查出價格大于平均值的所有商品select * from product where price > (select avg(price) from product);
分組:
group by
將表中某列值相同的記錄放在一起,稱為一組。
// 按照某列去分組,對于列名相同的記錄默認會顯示排在前面的select * from 表名 group by 列名;// 按照某列排序,并統計該列的數量select 列名,count(列名) from 表名 group by 列名;
having
條件篩選。出現在分組之后,其后可以接聚合函數。
where
關鍵字出現在分組之前,其后不可接聚合函數。// 比如:查詢商品表中,按照商品編號分組顯示每組的平均價格,并查詢平均價格大于 60元的所有商品。select *,avg(price) from product group by cno having avg(price) > 60;
3,刪除表中記錄
刪除指定某條記錄
delete from 表名 where 條件;// 例如delete from student where sid=105;
注:如果不指定條件,則會將表中的數據一條一條全部刪除。
truncate
和delete from 表名;
刪除表中數據有何區別?前者是將表直接刪除,然后重新創建表,表中無數據。后者是一條一條刪除表中所有數據。
在數據量較少的情況下,后者效率高;反之,前者高。
4,更新表中記錄
更新某條記錄
update 表名 set 要更新的列名1=列的值1,要更新的列名2=列的值2 where 條件;
比如這樣:
update student set sname=寒冰,sage=23 where sid=105;
更新所有記錄的某些列
update 表名 set 要更新的列1=值1,要更新的列2=值2;
總結
- 表的操作,根據個人職位和功能需求來定,一個完整體系表的構建是一個具體業務的邏輯體現。
- 大多開發者在表內和表與表之間進行操作的時候多,其中最主要也是用的做多的操作是查詢和篩選。
小編特意創建了一個公眾號:
推薦學java
,分享與java
相關的內容,并且以原創為主,歡迎大家搜索關注(關注即送視頻教程),一起學Java!