1.創建數據庫:create database 數據庫名 [character set 字符集][collate 校對規則]; (中括號里面的內容不是必須的)
(1).create database day08_3 character set gbk collate gbk_chinese_ci;
(2).alter database day08_2 character set utf-8; (修改day08_2的字符集為utf-8)
2.設置數據庫編碼:create database 數據庫名 character set 字符集;
3.查看數據庫MySQL服務器中的所有的數據庫: show databases;
4.查看某個數據庫的各種信息: show create database 數據庫名;
查看employee的建表語句:show create table employee;
5.刪除數據庫:drop database 數據庫名稱;
6.切換數據庫:use 數據庫名;
7.查看正在使用的數據庫: select database();
8.創建表:
create table 表名(
字段名 類型(長度) 約束,
字段名 類型(長度) 約束
);
create table sort (
sid int primary key auto_increment, #分類ID (該鍵為主鍵,并且長度會自動增長,切記如果不是最后一行要加上逗號)
sname VARCHAR(100) #分類名稱
);
時間類型:
? date: yyyy-MM-dd; datetime:日期和時間 yyyy-MM-dd HH:mm:ss; timeStamp: 時間戳
9.刪除主鍵:alter table 表名 drop primary key;
10.刪除一個表:drop table 表名; (alter table 表名 drop 列名;)刪除一個列
11.查看數據庫中的所有表:show tables;
12.查看表結構:desc 表名;
13.修改表結構格式(添加一列):alter table 表名 add 列名 類型(長度) 約束;
14.修改表修改列的類型長度及約束:alter table 表名 modify 列名 類型(長度) 約束;
alter table sort modify sname varchar(50) not null;
15.修改表修改列名:alter table 表名 change 舊列名 新列名 類型(長度) 約束;
注意:不能將原本含有null值的列的約束改為not null;如下所示,名字可以改但約束不對:
alter table lam change ext extra2 varchar(10) not null;
16.修改表名:rename table 表名 to 新表名;
17.修改表的字符集:alter table 表名 character set 字符集;
18.向表中的列插入數據語法:
如果插入空值,請使用null
插入的日期和字符串,使用單引號括起來。
insert into 表 (列名1,列名2,列名3..) values(值1,值2,值3..); (向表中插入某些列)
insert into 表 values (值1,值2,值3..); (向表中插入所有列)
19.將指定的sname字段中的值 修改成 日用品
update sort set sname='日用品';
--將sid為s002的記錄中的sname改成 日用品
update sort set sname='日用品' where sid='s002';
--將名字為王安全和黃海波的type改成4
update star set type=4 where name='王安全' or name='黃海波';
--將龍太子的價格在原價格的基礎上增加2000
update star set price=price+2000 where name='房祖名';
--統計每個學生的總分。
select *,chinese+math+english from exam;
--查詢總分大于200分的所有同學
select * from exam where chinese+math+english>200;
--求班級最高分和最低分(數值范圍在統計中特別有用)
select max(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;
select min(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;
20.刪除表: delete from 表名 [where 條件] 或者 truncate table 表名;
delete:一條一條刪除,如果沒加條件相當于將表中的數據全部刪除,不清空auto_increment記錄數,表結構還在;刪除后的數據可以找回
truncate:直接將表刪除,重新創建一張一模一樣的空表(速度快!),auto_increment將置為零,從新開始。
21.查詢表中所有字段: select * from 表名;
select 字段1,字段2,...from 表名;
例如:
select id,name from zhangwu; (查詢id和name這兩列的數據)
22.去除重復字段:?
distinct用于去除重復記錄
select distinct 字段 from 表名;
例如:
select distinct money from zhangwu; (去除money這一列中的重復數據并顯示出來)
select distinct age,name from star; (表示去掉所有行里面年齡和name都相同的行,并將age和name這兩列打印出來)
23.where和having的區別
(1) having是在分組后對數據進行過濾.where是在分組前對數據進行過濾
(2) having后面可以使用聚合函數(統計函數)where后面不可以使用聚合函數
(3) having后面加的條件一定要與分組有關。(不明白也沒關系)
24.表別名: (暫時修改表名)
select 字段名 as 別名 from 表名; 其中as可以省略
select name as nam from star;
25.列運算:
select zname,zmoney+1000 as 'sum' from zhangwu;
26.查詢所有的吃飯支出
select * from zhangwu where zname='吃飯支出';
27.查詢金額大于1000的所有數據
select * from zhangwu where zmoney>1000;
28.查詢金額在2000到5000之間
select * from zhangwu where zmoney >= 2000 and zmoney <= 5000;
改造成between and 方式
select * from zhangwu where zmoney between 2000 and 5000;
between...and...: 包含臨界值 eg: between 3000 and 6000相當于: 3000<=price<=6000
29.查詢金額是 1000,3500,5000 其中一個
select * from zhangwu where zmoney = 1000 or zmoney=3500 or zmoney=5000;
改造成in方式
select * from zhangwu where zmoney in (1000,3500,5000);
30.模糊查詢,like和通配符一起使用:
select * from zhangwu where zname like '%支出%';
select * from star where name like('周%');
? 占位符: % : 多位(0~n)
? _ : 一位
31.查詢賬務名字,五個字符的
select * from zhangwu where zname like'_____';
32.查詢賬務名,不為空的
select * from zhangwu where zname is not null;
select * from zhangwu where not ( zname IS NULL);
33.聚合函數 (聚合函數的前面不能有字段名,如果一定要有,那么該字段名只能是用來分組的字段名)
聚合函數不能寫在where條件中
聚合函數是用來做縱向運算的函數
? count(*|字段);統計指定列不為NULL的記錄行數,一般用來統計表中的總數據數
? 如果要統計表中的總記錄數,那么count( *|不能為空的字段名)
? sum();計算指定列的數值和,如果指定列類型不是數值類型,那么計算結果為0
? max();計算指定列的最大值,如果指定列是字符串類型,那么使用字符串排序運算
? min();計算指定列的最小值,如果指定列是字符串類型,那么使用字符串排序運算
? avg();計算指定列的平均值,如果指定列類型不是數值類型,那么計算結果為0
34.查找所有明星的記錄,按照價格升序
select * from star order by price asc; (切記沒有where)
查找所有明星的記錄,按照價格升序,如果價格一樣,按照年齡降序
select * from star order by price asc,age desc;統計star表中的總數據量,因為count()函數統計的是不為空的數據
select count(*) from star;求明星價格的總和
select sum(price) from star;查詢身價最高的明星
select max(price) from star;
-查詢明星的平均價格
select avg(price) from star;
如果有分組,select后面加的第一個字段名一定是用來分組的字段名**
select type,group_concat(name,age,sex) from star group by type;
-統計每一組的數據出現次數的總和,count()這一列的值代表type這一列中每個相同數據出現次數的統計
select type,count() from star group by type;
-統計每一組的相同數據的價格總和,sum(price)這一列的值代表age這一列中所有年齡相同的人的身價總和
select age,sum(price) from star group by age;
-在各個價格相同的組中,挑選出年齡最小的數據
select price,min(age) from star group by price;
-根據明星類別分組,統計不同明星類別的個數,并且該明星類別數量大于2并且年齡大于30的才查詢出來
select type,count() from star where age>30 group by type having count()>2;
多表操作:
-- 使用type作為外鍵,指向category表中的cid
ALTER TABLE star ADD constraint fk_star FOREIGN KEY(TYPE) REFERENCES category(cid);
-- 刪除外鍵
alter table star drop constrain fk_star;
-- 結合兩張表一起來查詢
SELECT * FROM star,category;
-- 篩選正確數據
SELECT * FROM star,category WHERE star.type=category.cid;
-- 給隱式內連接查詢加上一個別名
SELECT * FROM star s,category c WHERE s.type=c.cid;
-- 顯示內連接查詢,inner可以省略
SELECT * FROM star s INNER JOIN category c ON s.type=c.cid;
-- 使用左外鏈接查詢,顯示主表的所有數據
(打印出左邊star表的所有內容,左邊star表不符合的內容用null顯示,打印右邊表格category符合條件的內容)
SELECT * FROM star s LEFT OUTER JOIN category c ON s.type=c.cid;
-- 使用右外連接查詢,顯示主表的所有數據
(打印右邊category表的所有內容,右邊category表不符合的內容用null顯示,打印左邊表格category符合條件的內容)
SELECT * FROM star s RIGHT OUTER JOIN category c ON s.type=c.cid;
-- 使用子查詢,查出身價最高的明星的信息
SELECT * FROM star WHERE price=(SELECT MAX(price) FROM star); //后面小括號返回的是最高的price值
-- 使用子查詢查詢價格高于IPhone8的商品信息
SELECT * FROM product WHERE price>(SELECT price FROM product WHERE pname='IPhone8')
-- 查詢和農夫山泉是同一類別的商品信息且不能包含農夫山泉
SELECT * FROM product WHERE TYPE=(SELECT TYPE FROM product WHERE pname='農夫山泉') AND pname <> '農夫山泉'
-- 查詢類別是手機數碼的所有商品信息 //前提是product里面的type為category2表的外鍵
SELECT * FROM product WHERE TYPE=(SELECT cid FROM category2 WHERE cname='手機數碼')
-- 聯合查詢
CREATE TABLE A(
NAME VARCHAR(10),
score INT
)
CREATE TABLE B(
NAME VARCHAR(10),
score INT
)
//一次性插入多組數據
INSERT INTO A VALUES('a',10),('b',20),('c',30);
INSERT INTO B VALUES('a',10),('b',20),('d',40);
-- 聯合查詢,將兩個SQL語句查詢出來的結果集進行合并
SELECT * FROM a UNION SELECT * FROM b //去重排序出來
SELECT * FROM a UNION ALL SELECT * FROM b //全部顯示,不去重
-- 分頁查詢,limit a,b,a表示從第幾條數據開始查詢,b表示每頁的數據條數。如果客戶端給咱們這樣傳數據,那我就開心啦。
-- 客戶端只會傳給服務器,頁數和每頁的數據條數
-- 如果客戶端傳過來 1,3表示,客戶端需要第一頁的數據,每頁3條數據
-- 服務器拿到頁數和每頁的數據條數之后,要將頁數轉換成從第幾條數據開始
SELECT * FROM star LIMIT 0,3
-- 客戶端給你傳2,3
SELECT * FROM star LIMIT 3,3
-- 客戶端給你傳3,3
SELECT * FROM star LIMIT 6,3
-- 總結一個公式,將客戶端傳過來的頁數page 轉換成limit a,b中的a
-- a=(page-1)*b
-- 使用分頁查詢,查詢出來身價最高的明星信息
-- 先按照=身價由高到低排序,然后使用分頁查詢查詢出第一條數據
SELECT * FROM star ORDER BY price DESC LIMIT 0,1
多表練習:
--新建一個day09_exercise的數據庫
create database day09_exercise;
use day09_exercise;
-- 新建一個用戶表(user)
create table user(
id int auto_increment primary key,
username varchar(50)
);
-- 新建一個訂單表(orders)
create table orders(
id int auto_increment primary key,
price double,
user_id int
);
-- 給訂單表添加外鍵約束
alter table orders add constraint user_fk foreign key (user_id) references user(id);
-- 向user表中添加數據
insert into user values(3,'張三'),(4,'李四'),(5,'王五'),(6,'趙六');
-- 向orders 表中插入數據
insert into orders values(1,1314,3),(2,1314,3),(3,15,4),(4,315,5),(5,1014,null);
練習:
--查詢用戶的訂單,沒有訂單的用戶不顯示
select *from user,orders where user.id=orders.user_id;
或者select * from user join orders on user.id=orders.user_id;
--查詢所有用戶的訂單詳情
select *from user left join orders on user.id=orders.user_id;
--查詢所有訂單的用戶詳情
select *from user right join orders on user.id=orders.user_id;
練習:
--查看用戶為張三的訂單詳情
答案:select * from orders where user_id = (select id from user where username = "張三");
--查詢出訂單的價格大于300的所有用戶信息。
答案:select * from user where id in (select user_id from orders where price>300); //注意in后面有空格
--查詢訂單價格大于300的訂單信息及相關用戶的信息。
SELECT * from user,orders where user.id=orders.user_id and orders.price > 300;