MySQL——表的約束,資料型別,增刪查改
資料型別
數值型別:
- tinyint:1位元組,-128~127,0~255
- smallint:2位元組,-32768~32767,0~65535
- mediumint:3位元組 ,-8388608~8388607 ,0~16777215
- int :4位元組,-2147483648~2147483647……
- bigint:8位元組
越界測試:
- create table tt1(num tinyint);
- insert into tt1 values(1);//成功
- insert into tt1 values(128);//失敗,越界
在MySQl中,整形可以指定是有符號和無符號的,但是預設是有符號的
可以通過UNSIGNED來說明某個欄位的無符號的
- create table tt2(num tinyint unsigned);
- insert into tt2 values(255);//成功
- insert into tt2 values(-1);//失敗,無符號的
關於unsigned細節
unsigned為無符號,表示非負數,但是在事件使用中會帶來一些負面的影響
建立一個表,倆個欄位都是無符號
- create table tt3(a int unsigned ,b int unsigned);
- insert into tt3 values(1,2);
- select * from tt3;
- select a-b from tt3; //顯示a-b為4294967295
- set sql_mode='NO_UNSIGNED_SUBTRACTION'
注:儘量不要使用unsigned,因為可能會帶來一些意想不到的結果,對於int放不下的資料可能unsigned int同樣放不下,與其如此,還不如直接將int提升為bigint。
bit的使用:
bit[(M)]:位欄位,M表示每個值的位數,範圍從1~64,如果M被忽略,預設為1
- create table tt4(a int ,b bit(8));
- insert into tt4 values(10,10);
- select * from tt4; //會發現,a的資料10沒有出現
注:bit欄位顯示時,是按照ASCII碼對應的值顯示的
- insert into tt4 values(65,65);
- select * from tt4; // 65 A
小數的基本使用:
1.float[(m,d)][unsigned];m指定顯示長度,d指定小數位數,佔空間4個位元組
- create table tt6(id int,salary float(4,2));
小數float(4,2)表示的範圍時-99.99~99.99,MySql中儲存至時會四舍五
2.decimal[(m,d)][unsigned]; m指定長度,d表示小數點的位數
- decimal整數的最大位數m為65,支援小數的最大位數d是30,如果d被省略,預設為0,如果m被省略,預設為10
- 看起來和float差不多,但是他們表示的精度不一樣,decimal的精度更高。
字串
- char(L):固定長度字串,L表示可以儲存的長度,單位是字元,最大長度可以為255
- varchar(L):可變長度字串,L表示字元長度,最大長度65535個位元組
- 驗證char
create table tt9(id int,name char(2));
insert into tt9 values(100,'ab');
insert into tt9 values(100,'中國');
//char(2)表示可以存放倆個字元,可以是字母或漢字,但不能超過2個
//char最大為255
- 測試varchar
create table tt10(id int ,name varchar(6));
insert into tt10 values(100,'hello');
insert into tt10 values(100,'我愛你,中國');
- char和varchar的選擇
- 如果資料的長度都是一樣的(char),就使用定長,比如身份證,手機號……
- 如果資料長度是有變化的,就用變長的(varchar),比如名字,地址
- 定長的磁碟空間比較浪費,但是效率高
- 變長的磁碟空間比較節省,但是效率低
日期和時間型別:
- fatetime時間格式‘yyy-mmm-dd HH:ii:ss’表示範圍從1000到9999,佔8位元組
- date日期:“yyy-mmm-dd” 佔3位元組
- timestamp:時間戳,從1970年開始的‘yyy-mm-dd HH:ii:ss’格式和datetime完全一致,佔4位元組
//建立一個表
- create table birthday (t1 date ,t2 datetime,t3 timestamp);
//插入資料
- insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1');
//更新資料
- update birthday set t1=‘2000-1-1’;
列舉和set
- 列舉:enum,列出多個選項但是隻能選其中的一個(單選),處於效率考慮,這些值的時間儲存是“數字”,每個選項對應一個數字,最多65535,新增列舉時,可以直接新增其對應的數字(列舉從1開始)
- set:就是多選,設定時實際儲存的是數字,依次對應“1,2,4,8,16……”最多64個
需求:一個調查表votes,調查人的喜好(登山,籃球,游泳,武術)中去選擇,可以多選
男,女(選項)
- create tables votes(
- username varchar(30),
- hobby set('登山',‘籃球’,‘游泳’,‘武術’),
- gender enum(‘男’,‘女’)
- );
//插入資料:
- inster into votes values('張三','登山,武術','男');
//查詢語句:
- select* from votes where hobby ='登山';
- //這樣只能查詢出愛好只有登山的人,而有些人的愛好有很多,登山只是其中的一部分,所以就查詢不出來
要使用find_in_set(sub,str_list)查詢
- select* from votes where find_in_set('登山',hobby);
//如果sub在str_list中,則返回下標,如果不在,返回0
表的約束:
空屬性:
- null(預設的)和not null(不為空)
- 資料庫預設的欄位基本都為空,但是實際開發時,儘可能保證欄位不為空,因為資料為空沒辦法參與運算
建立一個班級表,包含班級名和班級所在的教室,如果沒有班級名字,不知道你在哪個教室上課,如果教室名字可以為空,就不知道在哪上課。
- cteate table class(
- class_name varchar(20) not null,
- class_name varchar(10) not null);
- inster into myclass(class_name)values('class1'); //插入失敗,沒有給教室資料
預設值:
- default:某一種資料會經常性的出現某個具體的值,可以在一開始就指定好,在需要真實資料的時候,使用者可以選擇性的使用預設值
注:set和enum不能設定為預設值
- create table tt10(
- name varchar(20) not null,
- age tinyint unsigned default 0,
- sex char(2) defalut '男');
列描述:
- 列描述comment沒有實際含義,通過desc看不到註釋資訊,通過show可以看到
zerofill:
主鍵:
主鍵:primary key
- 用來唯一的約束該欄位裡面的資料,不能重複,不能為空,主鍵所在的列是整數型別
- 一張表最多隻能由一個主鍵
建立表的時候直接在欄位上指定主鍵
- create table tt13(
- id int unsigned primary key comment '學號不能為空',
- name varchar(20)not null
- );
在建立表的時候,在所有欄位之後,使用primary key來建立主鍵,如果由多個欄位多為主鍵,可以使用複合主鍵
- create table tt14(
- id int unsigned,
- course char(10) comment '課程程式碼',
- score tinyint unsigned default 60 comment '成績',
- primary key(id,course));
表建立好以後可以在追加主鍵
- alter into tt13 add primary key(欄位)
主鍵約束:主鍵對應的欄位不能重複,一旦重複,操作失敗
- 刪除主鍵:alter table 表名 drop primary key;
自增長:
auto_increment:對應的欄位不給值,就會自動的被系統觸發,系統會從當前欄位,已經有的最大值+1操作,得到一個新的不同的值,通常和主鍵搭配使用,作為邏輯主鍵
特點:
- 如何一個欄位要做自增長,前提是本身是一個索引(key一欄有值)
- 自增長欄位必須是整數
- 一張表最多隻能有一個自增長
唯一鍵:
unique:一張表中往往有多個欄位需要唯一性,資料不能重複,但是一張表中只能有一個主鍵,唯一鍵就可以解決表中有多個欄位需要唯一約束的問題
- 唯一鍵的本質和主鍵差不多,唯一鍵允許為空,而且可以多個為空,空欄位不做唯一性比較
表的增刪查改:
增加:
- 語法:insert into tablename values()
例:建立一張商品表
- create table goods(
- id int unsigned primary key,
- goods_name varchar(50) not null default ' ',
- price float not null defalt 0.0
- );
插入倆條記錄:
- insert into goods values(100,' 牛排',78.5);
- insert into goods values(100,‘披薩’,27.5);
- 插入的資料應用欄位的資料型別相同
- 資料的大小應在規定範圍內
- 在values中列出的資料位置必須與加入的列的位置相對應
- 日期和字元型別應包含在單引號內
- 插入空值,不指定或insert into table values(null)
- insert into table values(),(),()一次性新增多條記錄
- 如果給表中的欄位新增資料,可以不寫前面的欄位名稱,但是給指定的欄位新增資料,則需要寫欄位名
增加進階:
- 在新增資料的時候,假設主鍵對應的值已經存在了 :插入失敗
- 當主鍵衝突時,可以選擇以下方式進行處理
1)更新操作
- insert table into goods values('101','ccc',20.5);
//提醒新增失敗,id是主鍵,id=101,已經存在,所以不能賦值
- insert table into goods values on duplicate key update good_name='ccc',price=20.5;
2)替換:主鍵如果沒有衝突,就之間插入
- replace into goods values(100,’華為‘,999);
修改
更新表中的資料
語法:update tbl_name set col_name1=expr1 where 列
例:
- 將所有產品的價格修改為300快
update goods set price=300//沒有條件,整表修改
- 將id為100的產品價格修改為1000
update goods set price=1000 where id=100;
- 將id為101的產品價格增加200塊
update goods set price=price 200 where id=101;
update使用細節:
- update語法可以用新值更新源有表中的各列
- set子句指示要修改哪些列和要給予哪些值
- where語句指示要更新哪些行,如果沒有where語句就跟新所有行
- 如果需要更新多個欄位,可以通過set欄位1=值1,欄位2=值2
更新還可以限制更新數量
update 表名 set 欄位=值 [where 條件] [limit 更新數量]
例:
goods表中有五條ccc產品,我們希望將前三條改成ddd
- update goods set goods_name='ddd' where goods_name='ccc' limit 3;
刪除:
語法:delete from tlb_name [where condition]
刪除表中id為101的資料
- delete from goods where id=101;
刪除時,可以複製一份表,避免資料刪沒了
- 複製表結構:create table goods2 like goods;
- 把goods表中的資料複製到goods2中:insert into goods2 select * from goods;
- 刪除表中記錄:delete from goods;//刪除表中的資料,但是表的結構還在
- 使用truncate刪除表中記錄:truncate table goods;//這個指令把真個表記錄刪除
delete和truncate刪除整表的區別:
- 效果一樣,但是truncate速度快
- delete可以帶where條件,刪除更靈活
- delete可以返回被刪除的記錄數,而truncate返回0
- 推薦使用delete
delete使用細節
- 如果不使用where子句,將刪除整個表中所有資料
- delete語句不能刪除某一列的值(可以使用update置null)
- 使用delete語句僅刪除記錄,不刪除表本身(drop table)
select
語法:select */{column1,column2……} from table;
- 指定查詢某些列:查詢id,name,math
selete id,name,math from student;
- *表示查詢所有列(*的效率低,用哪些欄位就取哪些欄位)
- distinct:如果結果中有重複行,就刪除重複行
select distinct math from student;
- select 語句中可以使用表示式對查詢的列進行計算
- select語句中可以使用as對列起別名
- select column as 名字 from 表;
例:
1.在所有學生總分數上加十分
- select id,name,(math+chinese+english)+10 as total from student;
2.將所有姓唐的學生成績增加60%
- select name ,(math+Chinese+English)*1.6 as total from student where name like '唐%'
select 的where語句
- between…and…:在某區間內;
- in(a,b):列表中的值
- like,not like :模糊查詢
- and,or,not :與,或,非
查詢姓李的學生的成績:
- select * form student where name like '李%';
查詢英語成績大於90分的同學:
- select * from student where English>90;
查詢總分大於200的所有同學
- select name,(math+english+chinese)as 'total' from student where math+english+chinese>200;
查詢姓李並且id>10的同學
- select * from student where name like ‘李%’ and id>10;
查詢英語成績大於語文成績的同學
- select * from student where English>chinese;
查詢總分>200分並且數學成績小於語文成績的姓唐的學生
- select* from student where english+math+chinese>200 and math<chinese and name like '唐%';
查詢英語成績在80~90之間的同學
- select * from student where english between 80 and 90;
查詢數學成績為89,90,91的同學
- select * from student where math in(98,90,91);
select的order by語句
語法:select column1 …from table order by column asc/desc…
- order by指定排序的列,排序可以使用表中的列名,也可以使用別名
- asc,升序(從小到大),desc 降序(從大到小)
- order by 子句應該位於select語句的結尾
對數學成績進行排序:
- select * from student order by math;
對總分進行排序後,按從高到低輸出
- select id,name,math+English+Chinese as total from student order by total desc;
對姓李的學生按成績進行從低到高排序
- select id,name,math+english+chinses as total from student where name like ‘李%’ order by total asc;
count:返回某列,行的總數
- 語法:select count(*)/count(列名) from table where condition
例:
統計一個班級有多少學生
- select count(id)from table ;//對某個列名進行統計,不包含null值
統計數學成績大與等於90的學生人數
- select count(*)from student where math>=90;
統計總分大於250的人數
- select count(*)from student where math+e+c>250;
- count(*)會統計一共的記錄數,count(列名)會派出null情況
sum:返回滿足where條件的行的和
- 語法:select sum(列名) from table [where…]
例:
統計一個班的數學總成績
- select sum(math)from student;
統計一個班級語文,英語,數學各科的總成績
- select sum(Chinese),sum(math),sum(english)from student;
統計一個班語文,英語,數學的成績總和
- select sum(c+e+m)from student
統計一個班的語文成績 的平均成績
- select sum(chinense)/count(name)from student;
注:sum僅對數值起作用,否則結果無意義
avg:返回滿足where條件的一列的平均值
求一個班級的數學平均分
- select avg(math)from student;
求一個班及總分平均值
- select avg(m+c+e) from student;
max/min:返回滿足where條件的最大/最小值
- 語法:select max(列名) from table [where…];
例:
求班級最高分和最低分
- select max(c+e+m),min(c+e+m)from student;
group by:對子句進行分組
- 語法:delect column1… from table group by column
顯示一個部門的最高工資和平均工資
- select deptno,max(sal),avg(sal)from EMP group by deptno;
顯示每個部門每個崗位平均工資和最低工資
- select depton,job,min(sal),avg(sal)from EMP group by depton ,job;
顯示平均工資低於2000的部門和他的平均工資
- select depton,avg(sal)from EMP gurop by depton having avg(sal)<2000;
函式:
常用日期函式:
- current_date():獲取年月日
- current_time():獲取時分秒
- current_timestamp():獲取使勁戳
- date(datetime):返回datetime的日期部分
- date_add(date2,interval date):在date2上加上一個時間
- date_sub(date2, interval date):在date2上減去一個時間
- datedeff(date1,date2):倆個日期差(結果是天數)
- now():當前時間
相關文章
- MySql 表資料的增、刪、改、查MySql
- mysql指令1:增刪改庫,資料型別,建立表MySql資料型別
- MySQL資料庫 ---MySQL表的增刪改查(進階)MySql資料庫
- mysql資料增刪改查操作MySql
- MySQL表的增刪查改(提高篇)MySql
- MySQL表的增刪改查(基礎)MySql
- MySQL表的增刪改查(進階)下MySql
- mysql 資料增刪改查基本語句MySql
- mysql增刪改查MySql
- mysql增查刪改MySql
- 資料庫的簡介和MySQL增刪改查資料庫MySql
- mybatis實現MySQL資料庫的增刪改查MyBatisMySql資料庫
- 【MySQL】MySQL基礎(SQL語句、約束、資料型別)MySql資料型別
- mysql基本增刪改查MySql
- 基本的資料庫增刪改查資料庫
- MongoDB 資料庫建立刪除、表(集合)建立刪除、資料增刪改查MongoDB資料庫
- Golang原生sql操作Mysql資料庫增刪改查GolangMySql資料庫
- 用強資料型別保護你的表單資料-基於antd表單的型別約束資料型別
- Oracle、mysql資料庫增、刪、改OracleMySql資料庫
- 資料庫操作增刪改查模糊查資料庫
- FMDB | 實現資料的增刪改查
- go——beego的資料庫增刪改查Go資料庫
- MySQL的基本語法(增,刪,改,查)MySql
- MySQL server的安裝以及增刪改查遠端資料庫MySqlServer資料庫
- MySQL自增約束MySql
- C# 泛型 引用型別約束 值型別約束C#泛型型別
- MySQL基礎操作(增刪改查)MySql
- 資料的增刪改
- ORM實操之資料的增刪改查ORM
- 關於mongodb資料庫的增刪改查MongoDB資料庫
- Numpy array資料的增、刪、改、查例項
- 搭建頁面:資料庫的增刪改查資料庫
- mysql中建庫、建表、增刪改查DDL語句MySql
- 臨時表空間的增刪改查
- 增刪改查
- Go實現對MySQL的增刪改查GoMySql
- Flutter資料庫Sqflite之增刪改查Flutter資料庫
- mogoose 建立資料庫並增刪改查Go資料庫