1,單表的查詢練習html
SELECT * FROM emp WHERE deptno=30;mysql
SELECT ename,empno,deptno FROM emp WHERE job='銷售員';linux
SELECT * FROM emp WHERE comm>sal;正則表達式
SELECT * FROM emp WHERE comm>sal*0.6;sql
SELECT * FROM emp WHERE (deptno=10 AND job='經理') OR (deptno=20 AND job='經理');數據庫
SELECT * FROM emp WHERE (deptno=10 AND job='經理') OR (deptno=20 AND job='經理') OR (job NOT IN('經理' , '銷售員') AND sal>=20000);windows
SELECT * FROM emp WHERE comm IS NULL OR comm<1000;服務器
SELECT * FROM emp WHERE ename LIKE '___';//模糊查詢網絡
SELECT * FROM emp WHERE hiredate LIKE '2000-%';//相似正則表達式dom
SELECT * FROM emp ORDER BY empno;
SELECT * FROM emp ORDER BY sal DESC,hiredate ASC;
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
SELECT job,MAX(sal),MIN(sal),COUNT(*) FROM GROUP BY job;
2,mysql編碼問題
SHOW VARIABLES LIKE 'char%';
character_set_client=utf8;不管客戶端發送的是什麼編碼的數據,mysql都當成是utf8的數據
>若服務器發送的是GBK,服務器會當成utf8對待,總結:必然會亂碼
處理問題的手段有兩種:
①讓客戶端發送utf8的數據(行不通)
②把character_set_client修改成gbk,set character_set_client=gbk;只在當前窗口有效!
character_set_results=utf8把數據用什麼編碼發給客戶端
①讓服務器發送gbk的數據:set character_set_results=gbk;
②讓小黑屏使用utf8來解讀(行不通)
my.ini【windows】my.cnf【linux】
在總配置文件中進行配置,一勞永逸
#[mysqld]標記很是重要
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 通常配置選項
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
socket = /var/run/mysqld/mysqld.sock
character-set-server=utf8
[mysql]
no-auto-rehash
default-character-set=utf8
safe-updates
socket = /var/run/mysqld/mysqld.sock
3,mysql備份與恢復數據
數據庫-->sql語句--------->sql語句-->數據庫。
①數據庫導出SQL腳本(備份數據庫內容)
>mysqldump -uroot -p密碼 數據庫名>生成的sql腳本的路徑
>例如:mysqldump -uroot -p123 mydb1>C:\mydb1.sql (與mysql.exe和mysqld.exe同樣,都在bin目錄之下)
>注意,不要打分號,不要登陸mysql,直接在cmd下運行
>注意,生成的腳本文件中不包含CREATE DATABASE語句【只複製內容不復制數據庫】
②【1】執行SQL腳本
>先刪除數據庫,再從新建立CREATE DATABSE mydb1;退出
>cmd下執行mysql -uroot -p密碼 數據庫<腳本文件路徑
>例如:mysqldump -uroot -p123 mydb1<C:\mydb1.sql;
②【2】
>先登陸mysql,刪除DROP DATABSE mydb1;後從新建立數據庫
>切換到要複製的數據庫
>SOURCE SQL腳本路徑;
4,約束之主鍵約束
主鍵特色:非空、惟1、被引用(學習外鍵時)
①設置數據表主鍵
CREATE TABLE stu( sid CHAR(6) PRIMARY KEY, sname VARCHAR(20), age INT, gender VARCHAR(10), ); |
CREATE TABLE stu( sid CHAR(6), sname VARCHAR(20), age INT, gender VARCHAR(10), PRIMARY KEY(sid) ); |
ALTER TABLE emp{ ADD-->添加列 MODIFY-->修改列名和列類型 CHANGE-->修改列名 DROP-->刪除列 RENAME TO-->修改表名; |
②修改數據表主鍵
ALTER TABLE emp DROP PRIMARY KEY; ALTER TABLE emp ADD PRIMARY KEY(ename); |
5,主鍵自增加
因爲主鍵的三大特色【非空、惟1、引用】,因此咱們一般會指定主鍵類爲整型,而後設置其自動增加,這樣能夠保證在插入數據的時候主鍵列的惟一和非空性。
CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20), age INT, gender VARCHAR(10) );//修改主鍵自增加 |
INSERT INTO stu VALUES(1,'萬雨',26,'男'); INSERT INTO stu VALUES(NULL,'馮馮',26,'女'); |
備註:不建議使用有意義的號碼來當主鍵,應該單獨使用一個獨立的天然數來當主鍵;而且主鍵自增加在羣集系統中因爲網絡延遲的問題,致使使用同一個主鍵會出現問題;建議使用UUID來當主鍵。
6,非空和惟一約束
CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20) NOT NULL,//重複能夠只是NULL不行 age INT, gender VARCHAR(10) ); |
CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20) NOT NULL UNIQUE,//①非空②惟一,可是不等同於主鍵【差引用】 age INT, gender VARCHAR(10) ); |
7,概述模型、對象模型、關係模型
對象模型:能夠雙向關聯,並且引用的是對象,而不是一個主鍵!
關係模型:只能多方引用一方,並且引用的只能是主鍵,而不是一整行記錄。
在Java中domain!例如:User、Student就等同於數據庫中的數據表
Java中的類的關係【①is a繼承(1對一、1對多、多對多;少是主,可能是從主從),②has a成員的形式,③use a方法對象】
class Employee{//多方關聯一方 ... private Department department; } class Department{//一方關聯多方 ... private List<Employee> employees; } class Husband{//一方對應一方 ... private Wife wife; } class Wife{//一方對應一方 ... private Husband husband; } class Student{//多對多 ... private List<Teacher> teachers; } class Teacher{//多對多 ... private List<Student> students; } |
8,外鍵約束
外鍵必須是①另外一個表的主鍵的值(外鍵要引用主鍵!);②能夠重複;③能夠爲空;
用戶、主體帖、回覆帖 1,做者:用戶 2,主貼:主題 |
外鍵約束初始化
CREATE TABLE emp( empno INT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(50), dno INT, CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno)//外鍵 ); |
設置修改【添加】外鍵約束
ALTER TABLE emp ADD CONTRIAINT fk_emp_dept FOREIGN KEY(dno) dept(deptno); |
從表的主鍵便是外鍵。
9,一對一關係
10,多對多關係
多對多須要關聯表【中間表】
CREATE TABLE stu_tea( sid INT, tid INT, CONSTRAINT fk_student FOREIGN KEY(sid) REFERENCES student(sid), CONSTRAINT fk_teacher FOREIGN KEY(tid) REFERENCES teacher(tid) ); |
INSERT INTO stu_tea VALUES(1,1); INSERT INTO stu_tea VALUES(2,1); INSERT INTO stu_tea VALUES(3,1); INSERT INTO stu_tea VALUES(4,1); INSERT INTO stu_tea VALUES(5,1); INSERT INTO stu_tea VALUES(2,2); INSERT INTO stu_tea VALUES(3,2); INSERT INTO stu_tea VALUES(4,2); INSERT INTO stu_tea VALUES(3,3); INSERT INTO stu_tea VALUES(4,3); INSERT INTO stu_tea VALUES(5,3); |
11,合併結果集
多表查詢:①合併結果集;②鏈接查詢;③子查詢。
CREATE TABLE ab(a INT,b VARCHAR(50)); INSERT INTO ab VALUES(1,'1'); INSERT INTO ab VALUES(2,'2'); INSERT INTO ab VALUES(3,'3'); CREATE TABLE cd(c INT,d VARCHAR(50)); INSERT INTO cd VALUES(1,'1'); INSERT INTO cd VALUES(2,'2'); INSERT INTO cd VALUES(3,'3'); SELECT * FROM ab UNION SELECT * FROM cd;//無視重複行列所有顯示 SELECT * FROM ab UNION ALL SELECT * FROM cd;//將重複行列只顯示單次 |
12,鏈接查詢以內鏈接【方言】
分類:①內鏈接;②外鏈接【左、右、全(mysql不支持)】
方言【只是MYSQL有效】
SELECT * FROM husband,wife; |
+-----+--------+-----+------------------+ | hid | hname | wid | wname | +-----+--------+-----+------------------+ | 1 | 劉備 | 1 | Arya Stark | | 2 | 關羽 | 1 | Arya Stark | | 3 | 張飛 | 1 | Arya Stark | | 1 | 劉備 | 2 | Sansa Stark | | 2 | 關羽 | 2 | Sansa Stark | | 3 | 張飛 | 2 | Sansa Stark | | 1 | 劉備 | 3 | Cersei Lannister | | 2 | 關羽 | 3 | Cersei Lannister | | 3 | 張飛 | 3 | Cersei Lannister | +-----+--------+-----+------------------+ |
笛卡爾積{a,b,c}{1,2}={a1,a2,b1,b2,c1,c2}
mysql> SELECT husband.hname [AS '丈夫姓名' ],wife.wname [AS '妻子名字'] -> FROM husband,wife -> WHERE husband.hid=wid; |
+--------+------------------+ | hname | wname | +--------+------------------+ | 劉備 | Arya Stark | | 關羽 | Sansa Stark | | 張飛 | Cersei Lannister | +--------+------------------+ |
標準語句:
mysql> SELECT h.hname [AS '丈夫姓名' ],w.wname [AS '妻子名字'] -> FROM husband h INNER JOIN wife w -> ON h.hid=w.wid; |
天然語句:
mysql> SELECT h.hname [AS '丈夫姓名' ],w.wname [AS '妻子名字'] -> FROM husband h NATUAL JOIN wife w |
13,鏈接查詢以外鏈接【標籤與天然】
/*外鏈接有一主一次,左外即左表爲主,右表爲次;左表中全部記錄不管知足與否所有都打印,不知足的使用默認值補位。*/
①左外
SELECT h.hname AS '丈夫姓名' ,w.wname AS '妻子名字' FROM husband h LEFT OUTER JOIN wife w ON h.hid=w.wid; |
②右外
SELECT h.hname AS '丈夫姓名' ,w.wname AS '妻子名字' FROM husband h RIGHT OUTER JOIN wife w ON h.hid=w.wid; |
③全【mysql直接不支持】
SELECT h.hname AS '丈夫姓名' ,w.wname AS '妻子名字' FROM husband h FULL OUTER JOIN wife w ON h.hid=w.wid; |
SELECT h.hname AS '丈夫姓名' ,w.wname AS '妻子名字' FROM husband h LEFT OUTER JOIN wife w ON h.hid=w.wid; UNION SELECT h.hname AS '丈夫姓名' ,w.wname AS '妻子名字' FROM husband h RIGHT OUTER JOIN wife w ON h.hid=w.wid; |
14,子查詢
/*查詢成績最高學生的詳細信息*/
SELECT * FROM tb_stu WHERE score=(SELECT MAX(score) FROM tb_stu); |
+------------+--------------+------+--------+-------+ | number | name | age | gender | score | +------------+--------------+------+--------+-------+ | mufasa_008 | zhoujiankang | 24 | male | 95 | +------------+--------------+------+--------+-------+ |
SELECT 【能夠進行子查詢,可是不標準】
FROM 【能夠】
WHERE 【能夠】
條件:
①單行單列:SELECT * FROM 表1 別名1 WHERE 列1[=、>、<、>=、<=、!=] (SELECT 列 FROM 表2別名2 WHERE 條件)
②多行單列:SELECT * FROM 表1 別名1 WHERE 列1[IN、ALL、ANY] (SELECT 列 FROM 表2別名2 WHERE 條件)
③單行多列:SELECT * FROM 表1 別名1 WHERE 列1 IN (SELECT 列 FROM 表2別名2 WHERE 條件)
④多行多列:SELECT * FROM 表1 別名1,(SELECT ...) 別名2 WHERE 條件;