通過mysql-client連接到mysql-server,sql陳述句要以分號結尾,這樣按Enter才會執行sql陳述句,
mysql關鍵字不區分大小寫
字串、時間日期型別的值要引起來
如果要在mysql中使用utf8字符集,注意是utf8,8前面沒有-
資料庫操作
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 表名;
select st.id as 學號,st.name as 姓名 from tb_student st; #可以給表、欄位起別名,結果集中的列名使用的是別名
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 id < all(1,3,9) #id小于集合中的任何一個元素
where id < all(select子查詢) #一般和子查詢配合使用
where id <any(1,3,9) #id小于集合中的任意一個元素即可,id=8,id=2都行,一般和子查詢配合使用
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 first(列名) from 表名; #選取該列的第一行
select last(列名) from 表名; #該列的最后一行
select sum(列名),avg(列名) from 表名; #都可以一起使用
#其它常用函式
select if(gender,'男','女') as gender from tb_user; #如果gender欄位的值為true,就回傳‘男’,否則回傳'女'
#這個常對只有2個值的欄位來使用,比如性別,設定為tinyint(1),男、女分別存盤為1、0
select ifnull(money,0) as money from tb_user; #如果money欄位為空,回傳設定的默認值0
#結果集中的列名是select選中的部分(*除外),比如 select ifnull(money,0),客戶端顯示的欄位名是ifnull(money,0),論取別名的重要性,
#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子句,一般和group by搭配使用,用來對分組進行過濾
select * from student_tb [where子句] group by class having class between 0 9; #查詢[1,10]班的學生資訊
#group by以哪個欄位進行分組,having只能以該欄位進行過濾
#group by后面不能使用where,且where子句中不能直接使用聚合函式,having用來彌補where的不足
#聚合函式的使用
select avg(score) from tb_score; #select后面可以使用聚合函式
select * from tb_score where score>(select avg(score) from tb_score); #where中不能直接使用聚合函式,但可以通過子查詢間接使用聚合函式
select * from tb_score group by score having score>avg(score); #這個sql陳述句并不能查詢到成績大于平均分的學生資訊
#having中可以直接使用聚合函式,但在having使用聚合函式,統計物件是一組中的所有記錄,不是整個結果集
#上面的sql陳述句查到是本組中成績>本組平均分的學生資訊,而又是以成績分組的,本組中每條記錄的的成績都一樣,即每條記錄的score都等于平均分,一個組都不滿足having的要求,所以沒有資料
select * from tb_score group by score having score>(select avg(score) from tb_score); #這樣才可以
#分頁,常見的分頁方式有三種:
#1、where只取出指定區間上的記錄,比如where id>0 and where id<10,或者where id between 1 and 9
#2、limit對結果集進行限制
#3、查詢、回傳所有記錄,由客戶端自己實作分頁
#記錄數很多的時候,一定要先分頁查詢再回傳給客戶端(使用第1種或第2種),不要使用第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子句]
字串型別的排序、比較均按碼值比較,先按第一個字符的碼值排序、比較,如果相同則再比較第二個字符的碼值,
查詢記錄數要用count(*),不能用最后一條記錄的id作為記錄數,比如最后一條記錄的id是10,洗掉這條記錄,再插入一條記錄,新插入記錄的id為11,并不是10,而實際只有10條記錄,
表別名
select user.name from tb_user user;
如果表名很長、難記,可以取別名,使用別名來操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/74685.html
標籤:MySQL
上一篇:mysql基本語法
下一篇:mysql基本語法
