以MySql爲例
1.命令行操作
練習SQL語句還是在命令行下實踐比較好
安裝好MySql後,打開他自帶的命令行界面後,直接輸入密碼即可進入
/*
* 對庫的操作
*/
//查看已存在的數據庫,注意複數形勢:
show databases;
//創建數據庫,最好帶上編碼格式:
create database student character set utf8;
//更改編碼格式:
alter database student character set utf8;
//查看指定的某一個數據庫結構:
show create database student;
//刪除某一個數據庫,最好帶上判斷:
drop database if exits student;
/*
* 對錶的操作
*/
//對錶操作之前要聲明用哪個數據庫,直接是數據庫名,沒帶上database的聲明:
use student;
//創建一張表,圓括號,不是尖括號:
create table user(id int,name varchar(20),password varchar(8),birthday date);
//查看所有的表,若沒有,提示empty,複數形式:
show tables;
//查看指定的表結構:
show crate table user;
//給表加一列:
alter table student add age int;
//修改某一字段的屬性:
alter table student modify name varchar(30);
//修改這一字段的名稱和屬性,被改的無需寫上長度屬性,改後的屬性要標明:
alter table student change name username varchar(10);
//改變表的編碼:
alter table student character set gbk;
//重命名錶:
rename table student to students;
/*
* 亂碼問題
* 一般中文亂碼是由於數據庫client編碼和自己指定的編碼不一致導致的,若要中文需要GBK編碼
*/
//查看環境信息,注意 %
show variables like 'character%';
//更改環境裏的編碼
set character_set_client=gbk;
//還有顯示編碼也要一致
set character_set_results = gbk;
/*
* 增
*/
//第一次插入需要寫入字段名稱,後續則不用
insert into employee(id,username,gender,birthday,entry_date,job,salary,resume,image) values(1,'allen','male','1990-1-1','2010-1-1','CEO',9999.00,'someday','noday');
insert into employee values(2,'lisi','male','1990-1-1','2010-1-1','CEO',9999.00,'someday','noday');
//只插入部分還是需要寫入字段的
insert into employee(id,username,gender,resume,image) values(3,'Kitty','female','someday','noday');
//查看所有表元素
select * from employee;
/*
* 改
*/
//修改某一列所有屬性值
update employee set resume='n/a';
//修改某一列的某一行屬性值
update employee set resume='yes' where id=1;
//更改某一行多個屬性值
update employee set id=5,gender='femal' where username='allen';
//數值項四則運算
update employee set salary=salary+100 where id=2;
/*
* 刪除表中數據 delete,若不帶from來限定,則所有數據刪除,但是表結構(定義)還在
* 若要刪除表定義,請用drop table
* 另truncate,是刪除表記錄,類似不帶from的delete
* 但是drop和truncate是DDL,自動提交,立即生效;delete是DML,可以回滾
*/
delete from employer where id=4;
drop table employee;
另立了一個表
/*
* 查 前面用的 * 查所有
*/
//查某兩列
select name,english from pupils;
//過濾重複數據,多列時關鍵字distinct必須在首項,且必須多列都重複才過濾
select distinct name,english from pupils;
//查某一列並同時加上一個值
select name,math+1 from pupils;
//查詢時可將列的顯示位置變換,同時顯示每一行的數值之和
select name,math,chinese,english,math+chinese+english from pupils;
//別名顯示
select name as '用戶名' from pupils;
//範圍刷選,可以按照大於、小於號來,也可按照 in(可選值列表) 來定
select name,math,english,chinese from pupils where english>70 and math<99;
select name,math,english,chinese from pupils where math in(70,60,100);
//模糊查詢,%
select name,math,english,chinese from pupils where name like '李%';
//排序,默認是升序,降序是order by desc
select name,math,math+chinese+english from pupils order by math+chinese+english desc;
關於Null
若在插入時,輸入的內容爲空,則查詢時顯示的爲null,但這個不是真正的null,按照null爲關鍵字查詢時提示爲empty
只有在插入時 不輸入這一項,查詢時纔可以按null爲關鍵詞查詢
2.主鍵 & 外鍵 & 多表查詢
關於主鍵:
某一個屬性組(注意是組)能唯一標識一條記錄,該屬性組就可以成爲一個主鍵比如:
學生表(學號,姓名,性別,班級)
其中每個學生的學號是唯一的,學號就是一個主鍵
用戶表(用戶名、密碼、登錄級別)
其中用戶名是唯一的, 用戶名就是一個主鍵
主鍵主要是用於其他表的外鍵關聯,以及本記錄的修改與刪除
2.1 一對多
建一個省份表,主鍵是省份的id
建一個學生表,主鍵是學生id
每個省份id可以對應多個學生的籍貫省份信息
此時,有了主鍵後,插入數據時,主鍵不能爲空,而且不能重複。
/*
* 主鍵、外鍵
*/
create table province ( id int primary key,province varchar(9));
create table student (id int primary key,name varchar(20),provinceid int);
//插入數據時,各自的主鍵值不能重複且不能爲空
insert into province values(1,'新疆維吾爾族自治區');
insert into province values(2,'內蒙古自治區');
//此時沒有外鍵,沒有和省份表關聯,省份id可以自由加
insert into student values(1,'陳金旭',1);
insert into student values(2,'田偉',2);
insert into student values(3,'李陽',3);
但是這個時候兩張表沒有任何關係
以省份表爲學生表外鍵來源
此時學生表裏多了一個省份3,要刪掉才能添加外鍵,或者在省份表裏加一個ID=3
//刪除掉外鍵裏沒有的id
delete from student where id=3;
/*
* 添加外鍵
* FK_provinceid是自定義的外鍵名
* foreign key(province)表明這張表哪個字段需要關聯外鍵
* province(id)表明是哪張表的哪個字段當做外鍵
*/
alter table student add constraint FK_provinceid foreign key(province) references province(id);
此時要用別的省份,需要在省份表裏添加一個省份才行
//添加一個省份
insert into province values(3,'黑龍江');
//此時在學生表裏才能用到黑龍江
insert into student values(3,'李陽',3);
2.2 多對多
師生對應關係,另建一個數據庫
每個老師可以對應多個學生,每個學生也有多個老師
建立老師表和學生表,定義主鍵
//學生表老師表
create table teacher(id int primary key,Name varchar(10) not null);
create table student(id int primary key,Name varchar(10) not null);
//插入數據
insert into student values (1, '江峯');
insert into student values (2, '進旭');
insert into student values (3, '熊吉');
insert into student values (4, '蘇浪');
insert into student values (5, '王丹');
insert into teacher values (1, 'Chinese');
insert into teacher values (2, 'math');
insert into teacher values (3, 'english');
insert into teacher values (4, 'physics');
insert into teacher values (5, 'movie');
此時應該再建立一個表,將學生與老師的ID關係對應,並分別作爲學生表、老師表的外鍵
//外鍵對應表
create table course(T_ID int,S_ID int);
//分別作爲外鍵
alter table course add constraint FK_courseT_ID foreign key (T_ID) references teacher(id);
alter table course add constraint FK_courseS_ID foreign key (S_ID) references student(id);
//給外建表插入數據
insert into course values(1,1);
insert into course values(3,1);
insert into course values(5,1);
insert into course values(4,4);
insert into course values(1,5);
insert into course values(3,5);
insert into course values(5,4);
insert into course values(4,5);
insert into course values(5,5);
可以看到對應關係
1號學生對應着1、3、4號老師,以此類推
2.3 一對一關係
夫妻關係
/*
* 一對一
*/
create table husband (id int primary key,name varchar(10));
create table wife (id int primary key,name varchar(10));
//給wife增加一個husbandid字段,作爲關聯
//並且這個值應該是唯一的,否則可以出現多個wife嫁給同一個husband的情況,wife表插入時husbandid可以相同
alter table wife add husbandid int;
alter table wife add constraint FK_wife_husbandid foreign key(husbandid) references husband(id);
alter table wife modify husbandid int unique;
正常的寫法,另外也可以通過外鍵關聯來實現,因爲主鍵本身就是唯一的
/*
* 正常寫法
*/
create table PERSON(ID int primary key,NAME varchar(100));
create table computer(ID int primary key,brand varchar(20),
PERSON_ID int unique,constraint FK_PERSON_ID foreign key(PERSON_ID) references PERSON(ID));
//也可以通過外鍵關聯
create table computer(ID int primary key,brand varchar(20),
constraint FK_PERSON_ID foreign key(ID) references PERSON(ID)