MySQL基本語法

1.SQL簡介
	結構化查詢語言
		(層次模型,網狀模型,關係模型)

		關係模型是目前的主流  (Oralce,mysql    mssql )

	SQL標準:ANSI  (1992  1997   2002   ISO)

	方言與Sql 標準   
		學習者:SQL標準
		方言:  只支持自己當前的數據庫

2.常用數據庫
	Oracle MySQL  SQL Server  SQLite

	MySQL(重點)

	安裝
	   Client---->Server------>庫------>表
3.建庫
	1.登錄MySQL
		mysql -u root -p

	2.創建數據庫
	*** create database 數據庫名;
	 create database day14;

	 --創建數據庫時指定字符集
	 create database day14  character set gbk;

	3.查看服務器上所有的數據庫
	 ****  show databases;
	4.查看創建數據庫的代碼
	  show create database 數據庫名;
	  show create database day13; 

	5.修改某個數據庫的編碼
	  alter database 數據庫名  character set 字符編碼  COLLATE 字符集的校驗規則;
	  alter database day13  character set utf8 collate utf8_general_ci;

	6.刪除數據庫
	****  drop database 數據庫名;
	  drop database day13;

	 7.使用某個數據庫  (將來建表都放在這個庫中)
	 ****  use 數據庫名;
	   use day13;
4.建表
	  1.建表
	  create table 表名(
	      字段名(列名)  數據類型,
	      字段名(列名)  數據類型,
	      字段名(列名)  數據類型
	  );

	  float(5,2):代表總長度是5,其中小數位數是2位,整數位數是3位

	  示例:  create table employee(
		    id int,
		    name varchar(20),
		    gender char(4),
		    birthday datetime,
		    entry_date datetime,
		    job varchar(100),
		    salary float(7,2),
		    resume longtext
		);
	   
	  2.
	  顯示當前數據下所有的數據表
	  show tables;

	  3.
	  查看創建表的代碼
	  show create table 表名;
	  show create table employee;

	  4.查看錶的明細,以列表的形式顯示出結果
	  desc 表名;
	  desc employee;
	  describe employee;
  5.修改表的列
	1.添加一列
	alter table  表名  add 列名  類型;

	2.修改某列的數據類型
	alter table  表名 modify 列名  新的數據類型;

	3.刪除某列
	alter table 表名  drop 列名;

	4.修改表名
	rename table 舊錶名 to 新表名;

	5.修改表的字符集
	alter table 表名 character set 字符集編碼

	6.修改列名
	alter table 表名  change column 舊列名 新列名 新的數據類型;

	7.刪除表結構
	drop table 表名;


	1.加一個列image
		alter table employee add image longblob;
	2.修改job列,使其長度爲60
		alter table employee modify job varchar(60);
	3.刪除image列
		alter table employee drop image;
	4.表名改爲user
		rename table employee to user;

	5.修改表的字符集爲gbk
		alter table user character set gbk;

	6.列名name修改爲username
		alter table user change column name username varchar(30);




ALTER  CREATE  DROP:   DDL語言(數據定義語言)

INSERT UPDATE DELETE :DML語言(數據操作語言)

SELECT              :DQL語言(數據查詢語言)
select * from employee;

5.CRUD操作
	1.插入:
	insert into 表名[(列名1,列名2)] values(值1,值2);
	  字符和日期型數據應包含在單引號中。
	 insert into employee (id,name,gender,birthday,salary,entry_date,resume) 
	 values(1,'cgx','男','1982-10-1',10000,'2000-10-1','服務業幹得不錯');

	  insert into employee 
	 values(2,'aj','女','1982-10-1','2000-10-1','演員',100,'服務業幹得不錯');

	 2.處理添加及查詢數據的亂碼問題
	 show variables like 'character%';
	 set character_set_client=gbk;//處理客戶端向服務器提交數據的編碼
	 set character_set_results=gbk;//處理服務器響應在客戶端中的結果的編碼

	 2.
	 刪除數據
	 delete from 表名 【where條件】
	 delete from employee where name='2阿嬌';

	 delete from employee;//清除表中所有記錄
	 truncate table employee;//清除表中所有記錄

	 區別:
		1.truncate table 刪除數據效率更高(先摧毀整個表結構,再重建表)
		2.delete 刪除所有記錄時,一條一條往後刪除
		3.truncate table只能刪除所有
		4.delete可以選擇性的刪除部分記錄

	3.更新
	update 表名 set 列名=值,列名2=值2 where 條件;
	update employee set name='2阿嬌',gender='男' where name='aj';


	4.查詢
	select 列名 [as] 改列名,列名 from 表名 【 where 條件 order by 排序字段 (ASC(默認值)升序 |  DESC)】
	用*代表所有列
	distinct可以消除重複數據(查詢時)
	order by 如果指定了多個排序字段,優先按第一個字段排,如果第一個字段取值相同時,才考慮第二個字段排序
	

	示例:
		查詢表中所有學生的信息。
			select * from student;
		查詢表中所有學生的姓名和對應的英語成績。
			select name,english from student;
		過濾表中重複數據(英語成績(同一個成績只顯示一次))。
			select distinct english from student;
		在所有學生數學分數上加10分特長分。(顯示)
			select name,math+10 from student;
			select name as 姓名,math+10 as 數學成績 from student;
		統計每個學生的總分。
			select name,chinese+math+english from student;
		使用別名表示學生分數。
			select name 姓名,chinese+math+english 總分 from student;

		排序:order by 排序字段 (asc (默認升序)     desc降序)
			使用別名表示學生分數,並按總分從高到低排
			select name 姓名,chinese+math+english 總分 from student order by 總分 desc;

		查詢姓名爲王五的學生成績
			select * from student where name='王五';
		查詢英語成績大於90分的同學
			select * from student where english>90;
		查詢總分大於200分的所有同學
			select * from student where (chinese+math+english)>200 ;

	
	運算符
		(<>  !=)
		BETWEEN  ...AND...  是一個閉區間(含頭含尾)
		in(set)  指的是在一個集合中取元素都可以
		Like語句中,% 代表零個或多個任意字符,_ 代表一個字符,例first_name like ‘_a%’

		IS NULL;代表某列取值是否爲null    select * from student where name is null;

		and  or not

		示例:
			查詢英語分數在 80-90之間的同學。
				select * from student where english between 80 and 90;
				select * from student where english>=80 and english<=90;
			查詢數學分數爲89,90,91的同學。
				select * from student where math in (89,90,91);
				select * from student where math=89 or math=90 or math=91;
			查詢所有姓李的學生成績。
				select * from student where name like '李%';
			查詢數學分>80,語文分>80的同學。
				select * from student where math>80 and chinese>80;



	排序:
		示例:
			對數學成績排序後輸出。
				select * from student order by math;

				select * from student order by math asc ,第二個排序字段  (asc|desc) ;
				引入第二個排序字段 是當第一個字段取值相同時,纔會啓用第二個排序字段(字典順)
				select * from student order by math asc ,name desc ;
			對總分排序後輸出,然後再按從高到低的順序輸出
				select name 姓名,chinese+math+english 總分 from student order by 總分 desc;
			對姓李的學生成績排序輸出
				select * from student where name like '李%' order by chinese+math+english 


6.多表操作
	實體完整性約束:
		規定表的一行(即每一條記錄)在表中是唯一的實體。實體完整性通過表的主鍵(primary key)來實現。
		主鍵的特性:唯一性,非空性
		主鍵的分類:物理主鍵,邏輯主鍵(業務主鍵)實際開發中主要用的是業務主鍵
create table student(
	id int primary key ,
	name varchar(20) unique not null,
	chinese float,
	english float,
	math float
);

insert into student(id,chinese,english,math) values(1,89,78,90);
insert into student(id,chinese,english,math) values(4,67,98,56);
insert into student(id,name,chinese,english,math) values(3,'王五',87,78,77);
insert into student(id,name,chinese,english,math) values(4,'李一',88,98,90);
insert into student(id,name,chinese,english,math) values(5,'李來財',82,84,67);
insert into student(id,name,chinese,english,math) values(6,'張進寶',55,85,45);
insert into student(id,name,chinese,english,math) values(7,'黃蓉',75,65,30);


auto_increment:只針對這一列的類型是整數,代表自動增長(1,2,3,4,5依次增長)
	:它應該與primary key 配套使用
create table score(
  id int primary key auto_increment,
  english float(5,2)
);

insert into score(english) values(67);
insert into score(english) values(89);
insert into score(english) values(98);

delete from score where id =3;
insert into score(english) values(100);#  id從4開始  如果又要從1開始自動增長,就可以先刪除表,再進行數據添加


數據冗餘:數據重複

	域完整性約束:保證某個字段符合要求
		not null
		unique:唯一 (對於null值無效)

		create table orders(
			id int primary key,
			orderno varchar(100) not null,
			price float(8,1)
		);
		insert into orders(id,orderno,price) values(1,null,1000);

		drop table orders;
		create table orders(
			id int primary key,
			orderno varchar(100) unique ,
			price float(8,1)
		);
		insert into orders(id,orderno,price) values(1,'123',1000);
		insert into orders(id,orderno,price) values(2,null,1000);
		insert into orders(id,orderno,price) values(3,null,4000);#可以添加進去,對於null值無效
		解決問題?可以對這一列同時添加unique及not null
		drop table orders;
		create table orders(
			id int primary key,
			orderno varchar(100) unique not null,
			price float(8,1)
		);
		insert into orders(id,orderno,price) values(1,'123',1000);
		insert into orders(id,orderno,price) values(2,'123',1000);

	參照完整性約束
		問題?成績表中出現了一個成績(它的學號是在學生表沒有)
		       訂單(訂單的客戶編號   應該在客戶表中能找到這樣的編號)
		解決辦法 :給表添加外鍵
			建表時添加外鍵:constraint 外鍵名 foreign key(外鍵字段名) references 主鍵表(主鍵字段) 
		先建表再添加外鍵:
		alter table 表名 add constarint FK_employee_dept_id foreign key(dept_id) references departement(id)

		表與表之間的關係:
		一對一 (一個人只能有一個身份證號碼)
		一對多(一個顧客可以下多個訂單,一個訂單隻能一個顧客下)  (開發中用的最多)
		create table cust(
			id int primary key,
			name varchar(20) not null
		);

		insert into cust values(1,'cgx');
		insert into cust values(2,'aj');
		insert into cust values(3,'zxc');
		
		drop table orders;
		customerid不能隨意編寫,它應當來自於cust表中的id這一列的取值
			customerid也稱爲外鍵列(外鍵字段)
		create table orders(
			id int primary key,
			orderno varchar(100) ,
			totalprice float(7,2),
			customerid int ,
			constraint FK_orders_customerid foreign key(customerid) references cust(id)
		);
		insert into orders values(1,'wqewq234324',1000,4);#出錯
		insert into orders values(1,'wqewq234324',1000,3);#成功

		delete from cust where id=3;#刪除失敗,原因是它現在有關聯的子項,當把父項刪除後,關聯子項就
						找不到父項了,所以刪除失敗
		解決:
			一、先將子項清除,再刪除自己
			    delete from orders where customerid=3;
			    delete from cust where id=3;

			二、解除外鍵
				alter table 表名  drop foreign key 外鍵名;
				alter table orders drop foreign key FK_orders_customerid;

				 delete from cust where id=3;


		多對多  (一個老師可以教多個學生,一個學生也可以被多個老師教)
			用中間表來描述關係:
				聯合主鍵:primary key(字段1,字段2)



連接查詢:
	交叉連接(cross join):不帶on子句,返回連接表中所有數據行的笛卡兒積。
	select * from A cross join B;(顯式交叉連接)
	select * from A ,B;           (隱式交叉連接)


	內連接(inner join):返回連接表中符合連接條件及查詢條件的數據行。
	select * from A inner join B on (連接條件) where 條件
	示例:
		查詢陳冠希的所有訂單
		select * from customer A inner join orders B on(A.id=B.customer_id) where A.name='陳冠希';
		查詢所有下過訂單的人員及訂單信息
		select * from customer A inner join orders B on(A.id=B.customer_id)


	外連接:分爲左外連接(left out join)、右外連接(right outer join)。與內連接不同的是,外連接不僅返回連接表中符合連接條件及查詢條件的數據行,也返         回左表(左外連接時)或右表(右外連接時)中僅符合查詢條件但不符合連接條件的數據行。
	select * from A left join B on (連接條件) where條件
	特點:左表中能連接上右表的記錄顯示出來,還會將左表中連接不上的其它所有記錄也顯示出來
	示例:
		select * from customer left join orders on(customer.id=orders.customer_id) ;

	select * from A right join B on (連接條件) where 條件
	特點:將右表中的記錄都要保留下來
	示例:
		select * from customer right join orders on(customer.id=orders.customer_id) ;
		select * from orders right join customer  on(customer.id=orders.customer_id) ;

子查詢
	select * from 表名 where 字段名 in (select 字段名 from 表名  where條件);  (放在外面的查詢叫父查詢,放在內部的查詢叫子查詢)
	子查詢可以出現在select ,from ,where部分。
	示例:查詢陳冠希的所有訂單
	select id from customer where name='陳冠希';
	select id,order_number,price,customer_id from orders 
	         where customer_id in (select id from customer where name='陳冠希');
聯合查詢
	select * from A 
	union
	select * from B
	將A表中的記錄與B表中的記錄合併在一起,並消除重複記錄

	select * from orders where price>200
	union
	select * from orders where customer_id in (select id from customer where name='陳冠希');

報表查詢
	select * from 表名 where 條件  group by 分組字段 having(分組後的條件)

	聚合函數:
		count():統計個數
		sum():求和
		avg():求平均值
		max()最大值
		min()最小值

	示例:
	統計一個班級共有多少學生?
	select count(*) from student;
	統計數學成績大於等於90的學生有多少個?
	select count(*) from student where math>=90;
	統計總分大於250的人數有多少?
	select count(*) from student where (math+chinese+english)>250;
	求一個班級數學平均分?
	select avg(math) from student;

	求一個班級總分平均分
	select avg(math+chinese+english) from student;
	select sum(math+chinese+english)/count(*) from student;

	求班級最高分和最低分
	select max(math+chinese+english) 最高分,min(math+chinese+english) 最低分 from student;


	對訂單表中商品歸類後,顯示每一類商品的總價
	select product ,sum(price) from orderss group by product ;
	查詢購買了幾類商品,並且每類總價大於100的商品
	select product ,sum(price) from orderss   group by product having (sum(price)>100);

	
7.數據備份與還原
	1.數據庫備份:
	   WINDOWS命令行:
		mysqldump -h localhost -u root -p[也可以加密碼] day14>d:/day14.sql

	2.還原
		1.WINDOWS命令
		mysql -u root -psorry 數據庫名(要事先存在)<test.sql(sql文件所在位置)


		2.MYSQL命令
		  1.確保數據庫存在
		    create database day14;
		  2.source sql文件所有位置
		    source d:/mysql.sql;
DCL
1 創建用戶
語法:
CREATE USER 用戶名@地址 IDENTIFIED BY '密碼';
CREATE USER user1@localhost IDENTIFIED BY ‘123’; 
CREATE USER user2@’%’ IDENTIFIED BY ‘123’; 

2 給用戶授權
  語法:
GRANT 權限1, … , 權限n ON 數據庫.* TO 用戶名@IP
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
GRANT ALL ON mydb1.* TO user2@’%’;

3 撤銷授權
  語法:
  REVOKE權限1, … , 權限n ON 數據庫.* FORM 用戶名
REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;

4 查看用戶權限
語法:
SHOW GRANTS FOR 用戶名
SHOW GRANTS FOR user1@localhost;

5 刪除用戶
語法:
DROP USER 用戶名
DROP USER user1@localhost;

6 修改用戶密碼
語法:
Use mysql;
UPDATE USER SET PASSWORD=PASSWORD(‘密碼’) WHERE User=’用戶名’;
FLUSH PRIVILEGES;
UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='user2';
FLUSH PRIVILEGES;



發佈了66 篇原創文章 · 獲贊 22 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章