show databases;
查看當前選擇的數據庫
select database();
use test3;(使用表)
查詢編碼格式(這樣可以避免在doc下看到的亂碼)
show variables like 'character%';
set character_set_client=gbk;
set character_set_results=gbk;
開始創建表
create table student(
id int,
name varchar(20),
chinese float,
english float,
math float
);
insert into student(id,name,chinese,english,math) values(1,'陳冠希',89,78,90);
insert into student(id,name,chinese,english,math) values(2,'郭美美',67,98,56);
insert into student(id,name,chinese,english,math) values(3,'阿嬌',88,98,90);
insert into student(id,name,chinese,english,math) values(4,'李一',87,78,77);
insert into student(id,name,chinese,english,math) values(5,'李來財',82,84,67);
insert into student(id,name,chinese,english,math) values(6,'張進寶',55,85,45);
insert into student(id,name,chinese,english,math) values(7,'黃蓉',75,65,30);
然後插入數據
distinct 明顯的,獨特的
查詢表中所有的學生信息
select * from STUDENT;
查詢表中所有學生的姓名和對應的英語成績。
select NAME,ENGLISH from STUDENT;
顯示英語成績,過濾表中重複數據
select distinct ENGLISH from STUDENT;
在所有學生數學分數上加10分特長分。
select NAME,MATH+10 from STUDENT;
統計每個學生的總分。
select NAME MATH+CHINESE+ENGLISH from STUDENT;
使用別名表示學生分數。
select NAME as 姓名,MATH+ENGLISH+ENGLISH 總分 from STUDENT;(注意在使用別名的時候的as是可以省略的)
查詢姓名爲"陳冠希"的學生成績
select * from STUDENT where NAME='陳冠希';
查詢英語成績大於90分的同學
select * from STUDENT where ENGLISH > 90;
查詢總分大於200分的所有同學
select * from STUDENT where(MATH+CHINESE+ENGLISH)>200;
查詢英語分數在 80-90之間的同學。
select * from STUDENT where ENGLISH between 80 and 90;
查詢數學分數爲89,90,91的同學。
select * from STUDENT where MATH in(89,90,91);
查詢所有姓李的學生成績。
select * from STUDENT where NAME like '李%';
查詢數學分>80,語文分>80的同學。
select * from STUDENT where MATH>80 and CHINESE>80;
注意:not and or 優先級依次降低。一元運算符比二元的要高。
對數學成績排序後輸出。
select MANE,MATH from STUDENT order by MATH;
對總分排序後輸出,然後再按從高到低的順序輸出
select NAME,MATH+CHINESE+ENGLISH 總分 from STUDENT order by 總分 desc;
對姓李的學生語文成績排序輸出
select NAME,CHINESE from STUDENT where NAME like '李%' order by CHINESE;
注意:訂單,order。創建表時要注意不要和關鍵字衝突。
解決辦法:
1、把用戶定義的內容用反引號引起來。`(Esc按鍵的下方)
2、數據庫命名習慣:表名ORDERS (建議)這樣將表名變爲複數形式
這樣可以避免和關鍵字衝突
create table order(id int);
這樣的輸入會報錯,所以我們必須加上`(Esc按鍵下方)的反引號
應該這樣輸入:
create table `order`(int int);
查看錶格式
desc `order`;
二、完整性約束
數據完整性的意義:
數據完整性是爲了保證插入到數據中的數據時正確的,
它防止了用戶可能輸入錯誤。
數據完整性有以下三類
1、實體完整性:
規定表中的一行(即每一條記錄)在表中是唯一的實體(Entity)。
實體完整性通過表的主鍵來實現。
主鍵:不能爲null;唯一
創建一個表格T1,並聲明一個主鍵
寫法一(只能指定一個字段作爲主鍵)
create table T1(
ID int primary key,
NAME varchar(100)
);
insert into T1(ID,name) values(1'aa');
寫法二:(指定聯合主鍵)
create table T2(
ID int,
NAME varchar(100),
primary key(ID)
);
用desc T2;
查看錶的結構
比較寫法一和寫法二:
推薦寫法二:可以指定聯合主鍵
寫法三:(創建沒有任何約束的表格,最後再修改約束)
create table T3(
ID int,
NAME varchar(100)
);
alter table T3 add primary key(ID);
三種方法比較後:
極力推薦寫法三
寫法三的好處是:如果兩張表的主鍵受到另外一張表的約束的時候,在數據還沒有插入完畢的時候,
在插入數據的過程中會報錯。所以我們選擇寫法三的話,就可以避免這樣的錯誤。
注意:
邏輯主鍵(建議):除了唯一標識一條記錄外,沒有別的意義,一般
取名ID
業務主鍵:還有一定的業務意義。
在MySql中:
create table T4(
ID int key auto_increment,#自動增長,不建議使用,
並不是所有的數據庫都支持自動增長,比如Qracle就不支持。
NAME varchar(100)
);
域的完整性
指數據庫表的列(即字段)必須符合某種特定的數據類型偶約束。比如NOT NULL
1、約束數據的類型:強類型
2、非空約束: not null
3、唯一約束 unique
實例:
create table T5(
ID int primary key auto_increment,
USERNAME varchar(100) not null unique,
PHONE_NUM varchar(11) unique,
GENDER varchar(10) not null
);
參照完整性(多表的設計)定義外鍵
注意:類和表的結構關係;對象和記錄的關係(幫助學習ORM:Hibernate MyBatis)
一對多(實例:客戶對訂單)
CUSTOMERS ORDERS
ID(PK) NAME PADDRESS ID(PK) ORDER_NUM AMOUT CUSTOMER_ID(FK)
1 張三 四川 1 2016101301 10 1
2 李四 湖北 2 2016101302 12 2
3 2016101303 15 2
4 2016101304 16 1
如何描述訂單與客戶的關係呢?
我們可以在ORDERS中增加一列CUSTOMER_ID(FK),這個CUSTOMER_ID 的值受到CUSTOMERS 的ID的約束
即一個訂單隻能對應一個客戶(一對多),反過來,一個客戶可以有多個訂單(多對一)
建表:
create table CUSTOMERS(
ID int primary key,
NAME varchar(100),
ADDRESS varchar(100)
);
create table ORDERS(
ID int primary key,
ORDER_NUM varchar(100),
AMOUNT float(10,2),
CUSTOMER_ID int,
constraint CUSTOMER_ID_FK foreign key (CUSTOMER_ID) references CUSTOMERS(ID)
);
說明:CUSTOMER_ID_FK爲約束名稱(一個庫中約束名稱唯一)
insert into CUSTOMERS values(1,"周莉",'四川');
insert into ORDERS values(1,'0001',100.00,2);(這句會報錯的,因爲有外鍵的約束)
我們插入:
insert into ORDERS values(1,'0001',100.00,1);這樣就是完美的。