SQL總結
一、SQL
Structured Query Language 結構化查詢語言
作用:與數據庫進行交互
知識擴展:
SQL標準,由ANSI(美國標準學會,屬於ISO的核心成員)進行管理和維護的。
數據庫廠商都支持該標準,並進行了擴展。擴展的部分,一般稱之為方言。
SQL標準和方言:普通話和方言。
二、常用的數據庫
1、Oracle
2、DB2
3、MySQL
4、SQL Server
三、安裝MySQL
驗證是否安裝成功:
登錄數據庫:
shell>mysql -u root -p
四、數據庫的基本概念:
知識點:使用關鍵字作為表名或數據庫名或字段名,使用``(反引號)引起來
約定:
mysql>命令 mysql命令或語句
User類對應User表結構,類中的屬性映射為表中的列
User對象對應User表中的一條記錄
五、SQL語句的分類:
*DDL:Data Definition Language數據定義語言
*DML:Data Manipulation Language 數據操作語言
DCL:Data Control Language 數據控制語言
*DQL:Data Query Language 數據查詢語言
*TPL:事務處理語言
六、DDL:數據定義語言
作用:定義數據庫或表結構用的
關鍵字:CREATE ALTER DROP
6.1數據庫結構操作:
--------------------------------
創建一個名稱為mydb1的數據庫。
mysql>CREATE DATABASE mydb1; (字符集采用數據庫默認的--安裝時的那個)
查看數據庫的創建細節
mysql>SHOW CREATE DATABASE mydb1;
查看當前所有的數據庫
mysql>SHOW DATABASES;
創建一個使用gbk字符集的mydb2數據庫。
mysql>CREATE DATABASE mydb2 CHARACTER SET gbk;
創建一個使用utf8字符集,並帶校對規則的
mysql>CREATE DATABASE mydb3 CHARACTER SET utf8 COLLATE utf8_general_ci;
查看當前數據庫服務器中的所有數據庫
mysql>SHOW DATABASES;
查看前面創建的mydb2數據庫的定義信息
mysql>SHOW CREATE DATABASE mydb2;
刪除前面創建的mydb1數據庫
mysql>DROP DATABASE mydb1;
查看服務器中的數據庫,並把mydb2的字符集修改為utf8;
mysql>ALTER DATABASE mydb2 CHARACTER SET utf8;
--------------------------------
6.2表結構操作
創建表之前要先選擇數據庫。
選擇數據庫
mysql>USE mydb2;
創建一個員工表
mysql>CREATE TABLE employee(
id int,
name varchar(100),
gender varchar(10),
birthday date,
entry_date date,
job varchar(100),
salary float(8,2),
resume text
);
查看當前數據庫中的所有表
mysql>SHOW TABLES;
查看表的創建細節
mysql>SHOW CREATE TABLE employee;
在上面員工表的基本上增加一個image列。
mysql>ALTER TABLE employee ADD image blob;
修改job列,使其長度為60。
mysql>ALTER TABLE employee MODIFY job varchar(60);
刪除image列。
mysql>ALTER TABLE employee DROP image;
表名改為user。
mysql>RENAME TABLE employee TO user;
修改表的字符集為utf8
mysql>ALTER TABLE user CHARACTER SET gbk;
列名name修改為username
mysql>ALTER TABLE user CHANGE name username varchar(100);
七、DML:數據操作語言
作用:操作的是表中的記錄(數據)
關鍵字:INSERT UPDATE DELETE
MySQL:
字符串類型 使用單引號引起來 ‘abcdefg’
日期時間 使用單引號引起來 ‘2001-01-08’
特殊值 null
7.1插入數據
---------------------------------
向user表中插入三條員工信息
mysql>INSERT INTO user (id,username,gender,birthday,entry_date,job,salary,resume) VALUES(1,‘zhw‘,‘male‘,‘1990-08-09‘,‘2014-03-29‘,‘CTO‘,10000,‘description‘);
mysql>INSERT INTO user VALUES(2,‘hch‘,‘female‘,‘1989-08-09‘,‘2014-03-29‘,‘CEO‘,10000,‘aaaaaa‘);
mysql>INSERT INTO user (id,username,gender,birthday,entry_date,job,salary,resume) VALUES(3,‘皇甫張軍‘,‘male‘,‘1990-08-09‘,‘2014-03-29‘,‘UFO‘,10000,‘帥鍋一枚‘);
告知服務器客戶端使用的編碼為gbk
mysql>set character_set_client=gbk;
告知服務器客戶端查看結果集用的編碼為gbk;
mysql>set character_set_results=gbk;
7.2更新數據
------------------------------------
將所有員工薪水修改為5000元。
mysql>UPDATE user SET salary=5000;
將姓名為’zhw’的員工薪水修改為3000元。
mysql>UPDATE user SET salary=3000 WHERE username=’zhw’;
將姓名為’hch’的員工薪水修改為4000元,job改為ccc。
mysql>UPDATE user SET salary=4000,job=’ccc’ WHERE username=’hch’;
將”皇甫張軍”的薪水在原有基礎上增加1000元。
mysql>UPDATE user SET salary=salary+1000 where username=’皇甫張軍’;
7.3刪除數據
--------------------------------------
刪除表中名稱為’zhw’的記錄。
msyql>DELETE FROM user WHERE username=’zhw’;
刪除表中所有記錄。
方式一:
mysql>DELETE FROM user;
方式二:(屬於DDL語句)
mysql>TRUNCATE TABLE user; 把整張表格摧毀,然後重建的表結構。這比一行一行的刪除行要快很多
八、DQL:數據查詢語言
作用:查詢
關鍵字:SELECT
8.1簡單查詢
-----------------------------
查詢表中所有學生的信息。
mysql>SELECT * FROM student;
查詢表中所有學生的姓名和對應的英語成績。
mysql>SELECT name,english FROM student; (投影查詢)
過濾表中重復數據。
msyql>SELECT DISTINCT english FROM student;
在所有學生數學分數上加10分特長分。
mysql>SELECT name,math+10 FROM student;
統計每個學生的總分。
mysql>SELECT name,chinese+english+math FROM student;
使用別名表示學生分數。
mysql>SELECT name AS 姓名,chinese+english+math 總分 FROM student;
查詢姓名為王五的學生成績
msyql>SELECT * FROM student WHERE name=‘王五‘;
查詢英語成績大於90分的同學
mysql>SELECT * FROM student WHERE english>90;
查詢總分大於200分的所有同學
mysql>SELECT * FROM student WHERE (chinese+english+math)>200;
查詢英語分數在 80-90之間的同學。
mysql>SELECT * FROM student WHERE english BETWEEN 80 AND 90;
查詢數學分數為89,90,91的同學。
mysql>SELECT * FROM student WHERE math IN (89,90,91);
查詢所有姓李的學生成績。
mysql>SELECT * FROM student WHERE name LIKE ‘李%’;
查詢數學分>80,語文分>80的同學。
mysql>SELECT * FROM student WHERE math>80 AND chinese>80;
對數學成績排序後輸出。
mysql>SELECT name,math FROM student ORDER BY math;
對總分排序後輸出,然後再按從高到低的順序輸出
mysql>SELECT name,chinese+english+math FROM student ORDER BY chinese+english+math DESC;
對姓李的學生語文成績排序輸出(由高到低)
msyql>SELECT name,chinese FROM student WHERE name LIKE ‘李%’ ORDER BY chinese DESC;
九、數據完整性
1、數據完整性是為了保證插入到數據中的數據是正確的,它防止了用戶可能的輸入錯誤
2、分為三類
l 實體完整性
l 域完整性
l 參照完整性
9.1實體完整性
規定表的一行(即每一條記錄)在表中是唯一的實體。實體完整性通過表的主鍵來實現
主鍵的特點:不能為null,必須有值,且不能重復。
主鍵分類:
邏輯主鍵:不代表實際意義,只是區分不同記錄用的。比如id
業務主鍵:代表者具體的實際意義。比如身份證號 用戶名
CREATE TABLE t2(
id int PRIMARY KEY,#PRIMARY KEY 聲明id是主鍵
name varchar(100)
);
CREATE TABLE t4(
id int,
name varchar(100),
PRIMARY KEY(id)
);
CREATE TABLE t3(
id int PRIMARY KEY auto_increment,#auto_increment 數據庫自動增長
name varchar(100)
);
9.2域完整性
指數據庫表的列(即字段)必須符合某種特定的數據類型或約束。
非空約束:not null
唯一約束:unique
CREATE TABLE t6(
id int PRIMARY KEY auto_increment,
username varchar(100) not null unique, 非空和唯一約束
gender varchar(10) not null 非空約束
);
9.3參照完整性(多表)
表間的關系:
一對多(用的最多)
多對多(用的很多)
一對一(幾乎不用)
9.3.1一對多:部門和員工的關系
CREATE TABLE department(
id int primary key,
name varchar(100)
);
CREATE TABLE employee(
id int primary key,
name varchar(100),
salary float(8,2),
department_id int,
CONSTRAINT department_id_fk FOREIGN KEY(department_id) REFERENCES department(id)
);
9.3.2多對多:老師和學員
CREATE TABLE teacher(
id int primary key,
name varchar(100),
salary float(8,2)
);
CREATE TABLE student(
id int primary key,
name varchar(100),
grade varchar(10)
);
CREATE TABLE teacher_student(
t_id int,
s_id int,
CONSTRAINT t_id_fk FOREIGN KEY(t_id) REFERENCES teacher(id),
CONSTRAINT s_id_fk FOREIGN KEY(s_id) REFERENCES student(id),
PRIMARY KEY(t_id,s_id)
);
9.3.3一對一(了解)
l 按照外鍵關聯:
CREATE TABLE person(
id int primary key,
name varchar(100)
);
CREATE TABLE idcard(
id int primary key,
number varchar(20),
person_id int unique,
CONSTRAINT person_id_fk FOREIGN KEY(person_id) REFERENCES person(id)
);
l 按照主鍵關聯:
CREATE TABLE person(
id int primary key,
name varchar(100)
);
CREATE TABLE idcard(
id int primary key,
number varchar(20),
CONSTRAINT person_id_fk FOREIGN KEY(id) REFERENCES person(id)
);
十、DQL:數據查詢復雜的(多表)
10.1連接查詢(面試幾率很大)
基本語法形式:FROM 表1 連接類型 表2 [on 連接條件][where 篩選條件]
約定:表1在連接類型的左邊,稱之為左表
表2在連接類型的右邊,稱之為右表
l 交叉連接:cross join
返回左表和右表的笛卡爾積(左表5條記錄 ,右表6條記錄 5*6=30條)
select * from customer,orders;(隱式交叉連接)
select * from customer cross join orders;(顯式交叉連接)
l 內連接:inner join
返回滿足連接條件的所有記錄。
隱式內連接:(不使用inner join關鍵字)
select c.*,o.* from customer c,orders o where c.id=o.customer_id;
顯式內連接:(使用inner join關鍵字)
select * from customer c inner join orders o on c.id=o.customer_id;
l 外連接:outer join
左外連接:left outer join=left join
返回滿足連接條件的所有記錄,同時返回左表中剩余的其他記錄
查詢所有客戶,有訂單的把訂單也顯示出來
select * from customer c left outer join orders o on c.id=o.customer_id;
右外連接:right outer join=right join
返回滿足連接條件的所有記錄,同時返回右表中剩余的其他記錄
查詢所有訂單,同時打印訂單所屬的客戶
select * from customer c right outer join orders o on c.id=o.customer_id;
10.2子查詢
子查詢也叫嵌套查詢,是指在select子句或者where子句中又嵌入select查詢語句
查詢“陳冠希”的所有訂單信息
select id from customer where name=’陳冠希’;
select * from orders where customer_id=1;
子查詢:
select * from orders where customer_id=(select id from customer where name=’陳冠希’);
10.3聯合查詢
union關鍵字。
聯合查詢能夠合並兩條查詢語句的查詢結果,去掉其中的重復數據行,然後返回沒有重復數據行的查詢結果
SELECT * FROM orders WHERE price>200 UNION SELECT * FROM orders WHERE customer_id=1;
10.4報表查詢(使用數據庫提供的函數)
統計一個班級共有多少學生?
msyql>SELECT COUNT(*) FROM student;
統計數學成績大於90的學生有多少個?
mysql>SELECT COUNT(*) FROM student WHERE math>90;
統計總分大於250的人數有多少?
mysql>SELECT COUNT(*) FROM student WHERE (chinese+english+math)>250;
統計一個班級數學總成績?
mysql>SELECT SUM(math) FROM student;
統計一個班級語文、英語、數學各科的總成績
mysql>SELECT SUM(chinese),SUM(english),SUM(math) FROM student;
統計一個班級語文、英語、數學的成績總和
mysql>SELECT SUM(chinese+english+math) FROM student;
統計一個班級語文成績平均分
mysql>SELECT SUM(chinese)/COUNT(*) FROM student;
求一個班級數學平均分?
mysql>SELECT AVG(math) FROM student;
求一個班級總分平均分
mysql>SELECT AVG(chinese+english+math) FROM student;
求班級語文最高分和數學最低分
mysql>SELECT MAX(chinese) FROM student;
mysql>SELECT MIN(math) FROM student;
對訂單表中商品歸類後,顯示每一類商品的總價
mysql>SELECT product,SUM(price) FROM orders GROUP BY product;
查詢購買了幾類商品,並且每類總價大於100的商品
mysql>SELECT product,SUM(price) FROM orders GROUP BY product HAVING SUM(price)>100;
十一、MySQL數據庫的備份與恢復
1、備份
2、恢復
前提:必須先創建數據庫的名稱
方式一:進入MySQL
方式二:不用進入MySQL
SQL總結