1. 程式人生 > >JavaWeb_day8_MySQL單表和多表

JavaWeb_day8_MySQL單表和多表

1.關閉和啟動mysql

在命令列視窗輸入:net   start   mysql(啟動mysql)

                                 net   stop   mysql(關閉mysql)

2.登入mysql

在命令列視窗輸入:mysql    -u  root(使用者名稱)  -p(注意不要帶分號;)

再輸入密碼

3.SQL語句

是什麼:結構化查詢語句。關係資料庫語言的國際標準

分類:

         資料定義語言DDL:用來定義資料庫物件:資料庫database,表table,列colum等。關鍵字:建立create,修改alter,刪除drop等(結構)

          資料操作語言DML:用來對資料庫中表的記錄進行更新。關鍵字:插入insert,刪除delete,更新update等(資料)

         資料查詢語言DQL:用來查詢資料庫中表的記錄。關鍵字:select,from,where等

          資料控制語言DCL:用來定義資料庫的訪問許可權和安全級別及建立使用者,關鍵字:grant等

4.資料庫的操作

(1)建立資料庫

create database 庫名;

create database 庫名 character set 編碼(中文utf8);

(2)刪除資料庫

drop database 庫名;

(3)檢視所有資料庫

show databases;

(4)檢視一個數據庫結構(可以看到表的字符集)

show  create database  庫名;

(5)使用資料庫

use 庫名;

(6)檢視當前正在操作的資料庫

select database();

5.表的操作

(1)建立表

create table 表名(

欄位名   型別(長度)  [約束],

欄位名   型別(長度)  [約束],

欄位名   型別(長度)  [約束]

);

單表約束:

主鍵約束:primary key,要求被修飾的欄位:唯一和非空

唯一約束:unique,要求被修飾的欄位:唯一

非空約束:not null,要求被約束的欄位:非空

(2)查看錶

檢視資料庫中的所有的表:show tables;

(3)查看錶的結構

查看錶的結構:desc 表名;

(4)刪除表

drop table 表名;

(5)修改表

新增一列(也就是新增一個欄位)

alter table 表名  add   欄位名  型別(長度)  [約束]

例:alter table user add usex varchar(2);

修改欄位的型別(長度  約束)

alter  table  表名  modify  要修改的欄位名  型別(長度) [約束]

例: alter table user modify usex varchar(4);

修改欄位名

alter table  表名  change  舊欄位名  新欄位名  型別(長度) [約束]

例: alter table user change usex uage int(5) not null;

刪除欄位

alter table 表名  drop 欄位名;

例:alter table user  drop uage;

修改表名

rename  table  表名  to  新表名;

例:rename  table user1  to  user;

修改表的字符集

alter  table  表名  character set 字符集;

6.對資料庫表記錄進行操作(修改):

插入記錄:insert

語法:

(1)向表中某些欄位插入值

insert  into  表名(欄位名1,欄位名2,欄位名3...)values(值1,值2,值3...);

例:insert into user(uname,upassword,uid)values('王五','1234',null);         //uid為自增長,所以寫null也可以

(2)向表中所有欄位插入值

insert  into  表名   values(值1,值2,值3...);         //必須為每個欄位設定值

查看錶中所有的資料:

select * from 表名;

插入資料中文亂碼問題的解決:

如果建立資料庫時沒有指定編碼為utf8,那麼向表格插入資料為中文時,會出現中文亂碼問題,

解決辦法:

在cmd中輸入net   stop  mysql   關閉mysql

找到mysql安裝目錄下的my.ini檔案(有的版本沒有這個檔案,只有my-default.ini檔案,那麼就將這個檔案重新命名為my.ini檔案)在檔案中在[mysqld]前加,

[mysql]

port=3306

default-character-set=gbk

後加

character-set-server=gbk

其他的不要動

重啟mysql就可以了(在cmd中輸入 net  start   mysql)

到Mysql安裝目錄下的My.ini檔案,將裡面的所有utf8編碼改成gbk,儲存,重啟mysql,再插入中文資料,不會出現亂碼了,OK了。

就可以解決中文亂碼的問題了

更新(修改)記錄:update

語法:

不帶條件的:update  表名  set  欄位名=值,欄位名=值......;   //將該記錄的所有的值都改變

帶條件的:update  表名  set  欄位名=值,欄位名=值.....where 條件;

注意:值如果是字串或者日期需要加‘’;

例: update user set uname='wang'where uname='王五';

刪除記錄:delete

語法:

帶條件:delete   from  表名  where  條件;

例:delete from user where uid=4;

注意:刪除後uid不會重置,也就是說如果被刪除了,主鍵uid如果是自增長的不會從1開始,會接著以前的記錄增長

不帶條件:delete   from  表名;//將刪除表中的所有記錄

刪除方式delete和truncate的區別:

delete刪除是一條一條的刪除記錄,配合事物,可以將刪除的資料找回。

例:

truncate刪除是將表摧毀,然後新建一個一模一樣的表,刪除的資料無法找回。

用法:truncate table 表名;

用truncate刪除表時,新增資料時,是從1開始的,但delete不是

資料庫表查詢操作

簡單查詢:

語法:

查具體的欄位:select 欄位名,欄位名...from  表名 [where 條件];、

例:SELECT pid,pname from product WHERE pid=5;

查詢所有的欄位:select  *  from  表名 [where 條件];

使用別名:as可不寫

SELECT * FROM product as p;(表別名)

SELECT pid,pname name from product;(欄位(列)別名)

去掉重複值:

SELECT DISTINCT(price) FROM product;

將所有商品價格加10:

SELECT pid,pname,price+10 FROM product;

條件查詢:where

SELECT * from product WHERE pid=11;

SELECT * from product WHERE pid<>1;  //<>代表的是不等於

SELECT * from product WHERE price>500;

SELECT * from product WHERE pname LIKE '%強%';

like使用佔位符_和%(_代表一個字元,%代表任一個字元)

SELECT * from product WHERE pid IN(1,3,5);

in代表在某一個範圍內獲取值

就相當於SELECT * from product WHERE pid=1 OR pid=3 OR pid=5;  //or代表的是多個條件任意一個成立,and代表多個條件同時成立,not代表不成立

排序查詢:order by

SELECT * FROM product ORDER BY price DESC;    //ORDER BY排序,asc -升序,desc-降序

例:SELECT * FROM product WHERE pname LIKE  '%士%'  ORDER BY price DESC;

聚合查詢:

常用的聚合函式:求和sum()   平均avg()    最大值max()   最小值min()   計數count()

例:SELECT COUNT(*)FROM product;   //統計所有的個數

       SELECT avg(price)  FROM product;    //統計價格的平均數

       注:聚合函式不統計null值

分組查詢:group by

SELECT cid,COUNT(*) FROM product GROUP BY cid;

SELECT cid,AVG(price) FROM product GROUP BY cid HAVING AVG(price)>2000;     //分組後,需要條件查詢用having,不能使用where

查詢操作的順序:

select    //一般跟在這個後面的都是要查詢的欄位

from        //要查詢的表

where

group by

having    //分組後帶有條件只能使用having

order by    //必須放在最後面

Limit子句可以被用於強制 SELECT 語句返回指定的記錄數。Limit接受一個或兩個數字引數。引數必須是一個整數常量。如果給定兩個引數,第一個引數指定第一個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。

  //初始記錄行的偏移量是 0(而不是 1):
  mysql> SELECT * FROM table LIMIT 5,10; //檢索記錄行6-15

  //為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1:
  mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last

  //如果只給定一個引數,它表示返回最大的記錄行數目。換句話說,LIMIT n 等價於 LIMIT 0,n:
  mysql> SELECT * FROM table LIMIT 5;     //檢索前 5 個記錄行

外來鍵

語法:alter    table    從表   add foreign key(從表外來鍵欄位名)   references  主表名(主表的主鍵);

 alter table product add foreign key(category_id)references category(cid);

表關係:

一對多

多對多

兩張表都是主表,第三張表為從表,提供兩個欄位,都是外來鍵

 多表查詢

交叉連線查詢(得到的是兩個表的乘積    -----一般不會用)

 select * from category,product;

內連線查詢(使用的是關鍵字inner   join   ----inner可以省略)

      隱式內連線       select * from category,product where category_id=cid;

      顯式內連線      select * from category  inner join product on cid=category_id;

外連結查詢(使用的是關鍵字outer  join   ------outer可以省略)

      左外連線    select * from  category left join product on cid=category_id;

      右外連線     select * from  category right join product on cid=category_id;

內連線和外連線的區別

子查詢

一條select語句作為另一條select語法一部分

 select * from product where category_id=(select cid from category where cname='化妝品');