Structured Query Language 結構化查詢語言mysql
做用:與數據庫進行交互面試
知識擴展:sql
SQL標準,由ANSI(美國標準學會,屬於ISO的核心成員)進行管理和維護的。shell
數據庫廠商都支持該標準,並進行了擴展。擴展的部分,通常稱之爲方言。數據庫
SQL標準和方言:普通話和方言。windows
一、Oracle服務器
二、DB2函數
三、MySQL編碼
四、SQL Serverspa
驗證是否安裝成功:
登陸數據庫:
shell>mysql -u root -p
知識點:使用關鍵字做爲表名或數據庫名或字段名,使用``(反引號)引發來
約定:shell>命令 windows命令
mysql>命令 mysql命令或語句
User類對應User表結構,類中的屬性映射爲表中的列
User對象對應User表中的一條記錄
*DDL:Data Definition Language數據定義語言
*DML:Data Manipulation Language 數據操做語言
DCL:Data Control Language 數據控制語言
*DQL:Data Query Language 數據查詢語言
*TPL:事務處理語言
做用:定義數據庫或表結構用的
關鍵字:CREATE ALTER DROP
--------------------------------
建立一個名稱爲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;
--------------------------------
建立表以前要先選擇數據庫。
選擇數據庫
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);
做用:操做的是表中的記錄(數據)
關鍵字:INSERT UPDATE DELETE
MySQL:
字符串類型 使用單引號引發來 ‘abcdefg’
日期時間 使用單引號引發來 ‘2001-01-08’
特殊值 null
---------------------------------
向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;
------------------------------------
將全部員工薪水修改成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=’皇甫張軍’;
--------------------------------------
刪除表中名稱爲’zhw’的記錄。
msyql>DELETE FROM user WHERE username=’zhw’;
刪除表中全部記錄。
方式一:
mysql>DELETE FROM user;
方式二:(屬於DDL語句)
mysql>TRUNCATE TABLE user; 把整張表格摧毀,而後重建的表結構。這比一行一行的刪除行要快不少
做用:查詢
關鍵字:SELECT
-----------------------------
查詢表中全部學生的信息。
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;
一、數據完整性是爲了保證插入到數據中的數據是正確的,它防止了用戶可能的輸入錯誤
二、分爲三類
l 實體完整性
l 域完整性
l 參照完整性
規定表的一行(即每一條記錄)在表中是惟一的實體。實體完整性經過表的主鍵來實現
主鍵的特色:不能爲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)
);
指數據庫表的列(即字段)必須符合某種特定的數據類型或約束。
非空約束:not null
惟一約束:unique
CREATE TABLE t6(
id int PRIMARY KEY auto_increment,
username varchar(100) not null unique, 非空和惟一約束
gender varchar(10) not null 非空約束
);
表間的關係:
一對多(用的最多)
多對多(用的不少)
一對一(幾乎不用)
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)
);
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)
);
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)
);
基本語法形式: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;
子查詢也叫嵌套查詢,是指在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=’陳冠希’);
union關鍵字。
聯合查詢可以合併兩條查詢語句的查詢結果,去掉其中的重複數據行,而後返回沒有重複數據行的查詢結果
SELECT * FROM orders WHERE price>200 UNION SELECT * FROM orders WHERE customer_id=1;
統計一個班級共有多少學生?
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
方式二:不用進入MySQL