數據庫及MYSQL基礎(2)

數據庫及MySQL基礎(1)

SQL進階及查詢練習

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 條件;

相關文章
相關標籤/搜索