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='化妝品');