1. 程式人生 > >SQL總結

SQL總結

多表 h+ 輸入 篩選條件 nbsp 數據庫結構 custom odi 基礎上

一、SQL

Structured Query Language 結構化查詢語言

作用:與數據庫進行交互

知識擴展:

SQL標準,由ANSI(美國標準學會,屬於ISO的核心成員)進行管理和維護的。

數據庫廠商都支持該標準,並進行了擴展。擴展的部分,一般稱之為方言。

SQL標準和方言:普通話和方言。

二、常用的數據庫

1、Oracle

2、DB2

3、MySQL

4、SQL Server

三、安裝MySQL

驗證是否安裝成功:

登錄數據庫:

shell>mysql -u root -p

四、數據庫的基本概念:

知識點:使用關鍵字作為表名或數據庫名或字段名,使用``(反引號)引起來

約定:

shell>命令 windows命令

mysql>命令 mysql命令或語句

User類對應User表結構,類中的屬性映射為表中的列

User對象對應User表中的一條記錄

五、SQL語句的分類:

*DDLData Definition Language數據定義語言

*DMLData Manipulation Language 數據操作語言

DCLData Control Language 數據控制語言

*DQLData 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字符集,並帶校對規則的

mydb3數據庫。

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;

查詢英語分數在 8090之間的同學。

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總結