通過mysql-client連接到mysql-server,sql語句要以分號結尾,這樣按Enter才會執行sql語句。 mysql關鍵字不區分大小寫 字元串、時間日期類型的值要引起來 資料庫操作 show databases; #顯示已有的資料庫 create database db_studen ...
通過mysql-client連接到mysql-server,sql語句要以分號結尾,這樣按Enter才會執行sql語句。
mysql關鍵字不區分大小寫
字元串、時間日期類型的值要引起來
資料庫操作
show databases; #顯示已有的資料庫
create database db_student character set utf8; #新建資料庫並指定使用的字元集
create database db_student; #新建資料庫,使用預設的字元集
drop database db_studrnt; #刪除資料庫
use db_student; #使用指定的資料庫。要先使用此語句,才能使用該資料庫中的表
數據表操作
show tables; #查看當前資料庫中的表
drop table 表名; #刪除表
desc 表名; #查看該表的定義
show create table 表名; #查看該表的建表語句
rename table 原表名 to 新表名;
create table tb_user(
id int not null auto_increment, #欄位名 數據類型 【約束】
name varchar(20) not null,
primary key (id) #設置主鍵
);
alter table 表名 add 欄位名 數據類型 [約束]; #添加一列
alter table 表名 drop 欄位名; #刪除一列
alter table 表名 modify 欄位名 數據類型 [約束] ; #修改某列的定義
alter table 表名 character set utf8; #修改字元集
欄位名寫成`欄位名`的形式,可以防止欄位名和mysql關鍵字衝突(欄位名和mysql關鍵字相同)
記錄操作
select 列名1,列名2 from 表名; #返會的結果集是一張虛擬的表
select * from 表名;
insert into 表名 (列名1,列名2) values (值1,值2); #插入一條記錄
insert into 表名 (列名1,列名2) values (值1,值2),(值11,值22); #同時插入多條記錄,()之間逗號分隔
insert into 表名 values (值1,值2,...); #插入所有欄位
delete from 表名 where ... #刪除記錄
delete from 表名; #刪除表中所有記錄
truncate table 表名; #刪除表中的所有記錄
#delete是逐條刪除表中的所有記錄,truncate是直接將原表刪除,再根據表定義新建一張空表。truncate速度比delete快
update 表名 set 列名1=值1,列名2=值2 where... #更新一條記錄
update tb_user set age=age+2 where name='chy'; #在原值的基礎上
時間日期類型、字元串類型的值都要引起來,比如where name='chy'
插入、更新操作如果要寫的欄位、值很多,自己寫很麻煩、還容易出錯,在navicat、datagrip等工具中插入、更新一條記錄,複製控制台代列印出來的sql語句,粘到項目中改下即可。
where子句
where子句select、update、delete都可以使用。
where id=1 #等於
where id!=1 #不等於
where id<>1 #不等於也可以這樣寫
#> >= < <= 不一一寫了
where id between 1 and 10 #id在[1,10]上,是閉區間
where id in (1,3,9) #id=1或id=3或id=9
where score is null
where score is not null
where score>60 and score<90
where score<60 or score>90
where score not
#模糊匹配,用於匹配字元串。常見於模糊查詢,但delete、update也可以用
where name like '張%' #以張開頭。pattern要引起來
where name like '%偉' #以偉結尾
where name like '%國%' #含有國字就ok
% #一個或多個字元
_ #任意一個字元
[abcd] #abcd中的任意一個字元,只代表一個字元。比如 '張[傑偉]' 匹配張傑或張偉
[!abcd] #不是abcd中的任意一個字元就行,只代表一個字元,比如'張[!傑偉]' 只要不是張傑、張偉就ok
[^abcd] #!也可以寫成^,同上
查詢專用
select distinct 列名 from 表名; #去重。如果結果集中有完全相同的記錄,只保留一條
select 列名1*列名2 from 表名; #可以進行數學運算,但要求參與運算的列都是數值型
select 列名 as 別名 from 表名; #別名,常用於原列名較長、難記的情況
select 列名1+列名2 as 別名 from 表名; #或者要進行運算
#order by子句,結果集排序
select 列名 from 表名 order by 列名; #預設按升序(asc)排列
select 列名 from 表名 order by 列名 desc; #可指定序別,desc是降序
select 列名 from 表名 order by 列名1 asc,列名2 desc; #先按列名1排序,列名1相同記錄再按列名2排序。列名1叫做第一排序關鍵字,列名2叫做第二排序關鍵字
#排序的列結果集中要有
#聚合函數。所謂聚合函數,就是mysql自帶的對結果集進行統計、分析的函數。在聚合函數中,值是null的記錄均不參與統計。
select count(*) from 表名; #統計記錄數
select count(列名) from 表名; #統計某一列的記錄數
select count(distinct 列名) from 表名; #去重,結果集中重覆的記錄只算做一條
#null不計算在內
select max(列名) from 表名;
select min(列名) from 表名;
select sum(列名) from 表名;
select avg(列名) from 表名;
select sum(列名),avg(列名) from 表名; #都可以配合使用
#group by 子句,結果集分組
select * from tb_student group by dep; #對結果集按指定的列進行分組,比如此處把dep相同的記錄分為一組,顯示分好的組
select count(*) from tb_student group by dep; #單獨使用group by沒多大意義,一般都是和聚合函數搭配使用,用於統計每組的數據。比如此處計算每個系的學生人數
select avg(score) from tb_student group by class; #計算每個班的平均分
#having子句
select * from user_tb having id>10; #having的作用和where差不多,都是對記錄進行過濾
#但過濾時機不同,where是在資料庫中過濾,將符合要求的記錄放到結果集中
#having是對結果集中的記錄進行過濾,將過濾好的結果返回給客戶端
select * from student_tb [where子句] group by class having avg(score)<80 #having一般和group by配合使用
#因為group by後面不能使用where,且where子句中不能使用聚合函數
#此處是先根據where從資料庫中獲取結果集,再將結果集按班級分組,去掉平均分<80的班級,最終返回給客戶端的是平均分>=80的班級
#分頁,常見的分頁方式有三種:
#1、where只取出指定區間上的記錄,比如where id>0 and where id<10,或者where id between 1 and 9
#2、limit對結果集進行限制
#3、查詢、返回所有記錄,由客戶端自己實現分頁
#limit子句 結果集分頁
select * from user_tb [where子句] [order by子句] limit 10; #只取出結果集的前10條記錄。註意是對結果集進行限制,從結果集中取
select * from user_tb [where子句] [order by子句] limit 9,19; #只取出結果集的第[10,20]條記錄。都+1,再取閉區間
#多個子句常見的書寫、執行順序
select ... from ... [where子句] [group by子句] [having子句] [order by子句] [limit子句]
#先執行select ... from ... [where子句] 將匹配的記錄放到結果集中
#再group by將結果集中的記錄分組
#having對分組進行過濾,去掉不滿足要求的分組
#orderby排序
#limit只取出結果集某個區間的記錄,返回給客戶端
#和書寫順序一致
#一般不會這麼長,常見的是以下2種:
select ... from ... [where子句] [group by子句] [having子句]
select ... from ... [where子句] [order by子句] [limit子句]
字元串類型的排序、比較均按碼值比較,先按第一個字元的碼值排序、比較,如果相同則再比較第二個字元的碼值
表別名
select user.name from tb_user user;
如果表名很長、難記,可以取別名,使用別名來操作