1. 程式人生 > >Mysql學習第三天

Mysql學習第三天

sorting 數據類型 客戶 使用 update 控制 bsp insert 插入

1、對表中數據的增刪改(DML)
create table t_user(
id int primary key auto_increment,
name varchar(20) not null,
email varchar(20) unique
)

為表添加記錄 (必須掌握)

insert into 表名[(列名1,列名2...)] values (值1,值2...);
1.插入一條數據

1.1指定要插入那些列
insert into t_user(name,email) values(‘tom‘,‘[email protected]‘);
****註意: 數據類型為字符串類型的.需要使用單引號包裹.
1.2不指定插入哪些列, 需要指定每一列的值
insert into t_user values(null,‘jerry‘,‘[email protected]‘);
insert into t_user(name,email) values(‘湯姆‘,‘[email protected]‘);
=====================================================================================
SHOW VARIABLES LIKE ‘%character%‘;

==> 查看字符編碼配置

| character_set_client | gbk 客戶端的編碼 ***
|
| character_set_results | gbk 結果集的編碼 ***
|
| character_set_connection | utf8 客戶端連接的編碼
|
| character_set_database | utf8 數據庫默認使用的編碼
|
| character_set_filesystem | BINARY 文件系統存放時使用的編碼

|
| character_set_server | utf8 服務器編碼 安裝時指定的
|
| character_set_system | utf8 內部系統編碼
結論: 如果使用cmd 命令控制臺操作 數據庫,
註意character_set_client 和 character_set_results 需要設置成GBK, 因為我們的命令控制航使用gbk碼表顯示中文.
使用如下命令設置:
方式:
set character_set_client=gbk


set character_set_results=gbk
註意:
每次重新連接數據庫都要重新設置.
如果使用的cmd窗口操作數據庫. 就修改如下的碼表為gbk(cmd窗口使用的是gbk碼表).
這種做法影響的範圍只在你當前鏈接中.
2、修改一條記錄 (必須掌握)

update 表名 set 列名1 = 值 , 列名2 = 值 ....[where 條件1,條件2...]
create table t_user(
id int primary key auto_increment,
name varchar(20) not null,
email varchar(20) unique
)
2.1、修改表中id為3 的記錄, 將name修改為rose;

update t_user set name=‘rose‘ where id=3;
update t_user set name=‘rose‘;
//-----------------------------------------------------------------------------------------------------
CREATE TABLE employee (
id INT,
NAME VARCHAR(20),
gender VARCHAR(20),
birthday DATE,
entry_date DATE,
job VARCHAR(30),
salary DOUBLE,
RESUME LONGTEXT
);
INSERT INTO employee VALUES(1,‘zs‘,‘male‘,‘1980-12-12‘,‘2000-12-12‘,‘coder‘,4000,NULL);
INSERT INTO employee VALUES(2,‘ls‘,‘male‘,‘1983-10-01‘,‘2010-12-12‘,‘master‘,7000,NULL);
INSERT INTO employee VALUES(3,‘ww‘,‘female‘,‘1985-03-08‘,‘2008-08-08‘,‘teacher‘,2000,NULL);
INSERT INTO employee VALUES(4,‘wu‘,‘male‘,‘1986-05-13‘,‘2012-12-22‘,‘hr‘,3000,NULL);
-- 要求
-- 將所有員工薪水修改為5000元。
-- 將姓名為’zs’的員工薪水修改為3000元。
-- 將姓名為’ls’的員工薪水修改為4000元,job改為ccc。

-- 將wu的薪水在原有基礎上增加1000元。
3、刪除記錄語句 (必須掌握)
DELETE FROM 表名 [WHERE 條件];
3.1、 刪除表中名稱為’rose’的記錄。
DELETE FROM employee WHERE NAME=‘rose‘;
3.2、 刪除表中所有記錄。
DELETE FROM employee ;
3.3、使用truncate刪除表中記錄。
TRUNCATE TABLE employee;
DELETE 刪除 和 TRUNCATE刪除(了解) 兩者有什麽區別?
首先,這兩種都是刪除表中的記錄.

不同的是:
1、 delete 是逐行標記刪除. TRUNCATE 是將整張表包括表結構都移除,然後將表重新創建.
2、 delete DML語句。 TRUNCATE DDL語句。
3、delete 刪除的記錄可以被恢復,TRUNCATE 不能回復。
4.、delete 不釋放空間,TRUNCATE 釋放空間.
5、 TRUNCATE 會提交事務. (還沒學)

//-------------------------以上就是 增加 修改 刪除 表記錄 相關語句 ,(DML)-----------------------------------------------------------
DQL語句(DML) 查詢語句. (必須掌握)

語法:
SELECT selection_list /*要查詢的列名稱*/
FROM table_list /*要查詢的表名稱*/
WHERE condition /*行條件*/
GROUP BY grouping_columns /*對結果分組*/
HAVING condition /*分組後的行條件*/
ORDER BY sorting_columns /*對結果排序*/
LIMIT offset_start, row_count /*結果限定*/
//---------------------------------------------------------------------------------------
CREATE TABLE stu ( --學生表
sid CHAR(6), -- 學生編號
sname VARCHAR(50), -- 學生姓名
age INT, -- 年齡
gender VARCHAR(50) -- 性別
);
INSERT INTO stu VALUES(‘S_1001‘, ‘liuYi‘, 35, ‘male‘);
INSERT INTO stu VALUES(‘S_1002‘, ‘chenEr‘, 15, ‘female‘);
INSERT INTO stu VALUES(‘S_1003‘, ‘zhangSan‘, 95, ‘male‘);
INSERT INTO stu VALUES(‘S_1004‘, ‘liSi‘, 65, ‘female‘);
INSERT INTO stu VALUES(‘S_1005‘, ‘wangWu‘, 55, ‘male‘);
INSERT INTO stu VALUES(‘S_1006‘, ‘zhaoLiu‘, 75, ‘female‘);
INSERT INTO stu VALUES(‘S_1007‘, ‘sunQi‘, 25, ‘male‘);
INSERT INTO stu VALUES(‘S_1008‘, ‘zhouBa‘, 45, ‘female‘);
INSERT INTO stu VALUES(‘S_1009‘, ‘wuJiu‘, 85, ‘male‘);
INSERT INTO stu VALUES(‘S_1010‘, ‘zhengShi‘, 5, ‘female‘);
INSERT INTO stu VALUES(‘S_1011‘, ‘xxx‘, NULL, NULL);
//---------------------------------------------------------------
CREATE TABLE emp( -- 員工表
empno INT, -- 員工編號
ename VARCHAR(50), -- 員工姓名
job VARCHAR(50), -- 工作
mgr INT, -- 員工上司的編號
hiredate DATE, -- 入職日期
sal DECIMAL(7,2), -- 工資
comm DECIMAL(7,2), -- 獎金
deptno INT -- 部門編號
);
INSERT INTO emp VALUES(7369,‘SMITH‘,‘CLERK‘,7902,‘1980-12-17‘,800,NULL,20);
INSERT INTO emp VALUES(7499,‘ALLEN‘,‘SALESMAN‘,7698,‘1981-02-20‘,1600,300,30);
INSERT INTO emp VALUES(7521,‘WARD‘,‘SALESMAN‘,7698,‘1981-02-22‘,1250,500,30);
INSERT INTO emp VALUES(7566,‘JONES‘,‘MANAGER‘,7839,‘1981-04-02‘,2975,NULL,20);
INSERT INTO emp VALUES(7654,‘MARTIN‘,‘SALESMAN‘,7698,‘1981-09-28‘,1250,1400,30);
INSERT INTO emp VALUES(7698,‘BLAKE‘,‘MANAGER‘,7839,‘1981-05-01‘,2850,NULL,30);
INSERT INTO emp VALUES(7782,‘CLARK‘,‘MANAGER‘,7839,‘1981-06-09‘,2450,NULL,10);
INSERT INTO emp VALUES(7788,‘SCOTT‘,‘ANALYST‘,7566,‘1987-04-19‘,3000,NULL,20);
INSERT INTO emp VALUES(7839,‘KING‘,‘PRESIDENT‘,NULL,‘1981-11-17‘,5000,NULL,10);
INSERT INTO emp VALUES(7844,‘TURNER‘,‘SALESMAN‘,7698,‘1981-09-08‘,1500,0,30);
INSERT INTO emp VALUES(7876,‘ADAMS‘,‘CLERK‘,7788,‘1987-05-23‘,1100,NULL,20);
INSERT INTO emp VALUES(7900,‘JAMES‘,‘CLERK‘,7698,‘1981-12-03‘,950,NULL,30);
INSERT INTO emp VALUES(7902,‘FORD‘,‘ANALYST‘,7566,‘1981-12-03‘,3000,NULL,20);
INSERT INTO emp VALUES(7934,‘MILLER‘,‘CLERK‘,7782,‘1982-01-23‘,1300,NULL,10);
1.1 查詢所有行所有列
select * from stu;
*號 是通配符.通配所有列. 上面語句與下面是一模一樣的
select sid,sname,age,gender from stu;
誰的效率更高?
下面的效率更高. *需要運算.
1.2 查詢所有行指定列
select sname from stu;
2.1 條件查詢介紹
條件查詢就是在查詢時給出WHERE子句,在WHERE子句中可以使用如下運算符及關鍵字:
? =、!=、<>、<、<=、>、>=;
? BETWEEN…AND;
? IN(SET);
? IS NULL;
//---條件連接符
? AND; &&
? OR; ||
? NOT; !
2.2 查詢性別為女,並且年齡小於50的記錄
select * from stu where gender=‘female‘ and age<50;
2.3 查詢學號為S_1001,或者姓名為liSi的記錄
select * from stu where sid=‘S_1001‘ or sname=‘liSi‘;
數據庫中,sql語句不區分大小寫 ,但是 數據區分大小寫.
2.4 查詢學號為S_1001,S_1002,S_1003的記錄
select * from stu where sid=‘S_1001‘ or sid=‘S_1002‘ or sid=‘S_1003‘;
select * from stu where sid in(‘S_1001‘,‘S_1002‘,‘S_1003‘);
2.5 查詢學號不是S_1001,S_1002,S_1003的記錄
select * from stu where not (sid=‘S_1001‘ or sid=‘S_1002‘ or sid=‘S_1003‘);
select * from stu where sid not in(‘S_1001‘,‘S_1002‘,‘S_1003‘);
2.6 查詢年齡為null的記錄
select * from stu where age=null;
null的特性: null不等於null 所以判斷時應如下寫法:
select * from stu where age is null;
2.7 查詢年齡在20到40之間的學生記錄
select * from stu where age >= 20 and age <= 40;
select * from stu where age between 20 and 40;
2.8查詢性別非男的學生記錄
select * from stu where gender!= ‘male‘;
select * from stu where not gender=‘male‘;
select * from stu where gender not in (‘male‘);
2.9 查詢姓名不為null的學生記錄
select * from stu where sname is not null;
select * from stu where not sname is null;
//--------------------------------------------------------------------------------------------------
where 字段 like ‘表達式‘;
% => 通配 通配任意個字符.
_ => 通配 通配單個字符.
說明: LIKE 條件後 根模糊查詢表達式, "_"==> 代表一個任意字符
3.1查詢姓名由5個字母構成的學生記錄
select * from stu where sname like ‘_____‘;
3.2查詢姓名由5個字母構成,並且第5個字母為“i”的學生記錄
select * from stu where sname like ‘____i‘;
3.3 查詢姓名以“z”開頭的學生記錄
說明: "%"該通配符匹配任意長度的字符.
select * from stu where sname like ‘z%‘;
3.4查詢姓名中第2個字母為“i”的學生記錄
select * from stu where sname like ‘_i%‘;
3.5 查詢姓名中包含“a”字母的學生記錄
select * from stu where sname like ‘%a%‘;
//-----------------------------------------------------------------
4.1 去除重復記錄
關鍵詞: distinct => 去除重復查詢結果記錄.
select gender from stu; ==> 出現大量重復的記錄
select distinct gender from stu; =>去除重復的記錄
4.2查看雇員的月薪與傭金之和
select sal*12+comm from emp;
null與任何數字計算結果都是null.上面的寫法是錯誤的.
使用IFNULL(參數1,參數2) 函數解決. 判斷參數1的值是否為null,如果為null返回參數2的值.
select sal*12 + IFNULL(comm,0) from emp;
*這個函數在所有數據庫通用嗎?
不通用.
4.3 給列名添加別名
select sal*12 + IFNULL(comm,0) as ‘年收入‘ from emp;
** select sal*12 + IFNULL(comm,0) ‘年收入‘ from emp;
select sal*12 + IFNULL(comm,0) 年收入 from emp;
//------------------------------------------------------------------------------------------------------------------------------
5.1 查詢所有學生記錄,按年齡升序排序
asc: 升序
desc:降序
select * from stu order by age asc;
默認就是升序
select * from stu order by age;
5.2 查詢所有學生記錄,按年齡降序排序
select * from stu order by age desc;
5.3 查詢所有雇員,按月薪降序排序,如果月薪相同時,按編號升序排序
select * from emp order by sal desc , empno asc;
聚合函數
聚合函數是用來做縱向運算的函數:
? COUNT():統計指定列不為NULL的記錄行數;
? MAX():計算指定列的最大值,如果指定列是字符串類型,那麽使用字符串排序運算;
? MIN():計算指定列的最小值,如果指定列是字符串類型,那麽使用字符串排序運算;
? SUM():計算指定列的數值和,如果指定列類型不是數值類型,那麽計算結果為0;
? AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麽計算結果為0;
6.1 COUNT
當需要縱向統計時可以使用COUNT()。
? 1>查詢emp表中記錄數:
select count(*) from emp;
2>查詢emp表中有傭金的人數:
select count(*) from emp where comm is not null and comm >0;
3>查詢emp表中月薪大於2500的人數:
select count(*) from emp where sal > 2500;
4>統計月薪與傭金之和大於2500元的人數:
select count(*) from emp where sal+IFNULL(comm,0) > 2500;
5>查詢有傭金的人數並且有領導的人數:
select count(*) from emp where comm > 0 and mgr is not null;
6.2 SUM(計算總和)和AVG(計算平均值)
當需要縱向求和時使用sum()函數。
1>查詢所有雇員月薪和:
select sum(sal) from emp;
2>查詢所有雇員月薪和,以及所有雇員傭金和:
select sum(sal),sum(comm) from emp;
3>查詢所有雇員月薪+傭金和:
select sum(sal+IFNULL(comm,0)) from emp;
4>統計所有員工平均工資:
select avg(sal) from emp;
6.3 MAX和MIN
? 查詢最高工資和最低工資:
select max(sal),min(sal) from emp;
//---------------------------------------------------------------------------------------------------------------------------------------
分組查詢
當需要分組查詢時需要使用GROUP BY子句,例如查詢每個部門的工資和,這說明要使用部分來分組。
? 1>查詢每個部門的部門編號和每個部門的工資和:
select deptno,sum(sal) from emp group by deptno;
2>查詢每個部門的部門編號以及每個部門的人數:
select deptno,count(ename) from emp group by deptno;
3>查詢每個部門的部門編號以及每個部門工資大於1500的人數:
select deptno,count(ename) from emp where sal>1500 group by deptno ;
HAVING子句
4>查詢工資總和大於9000的部門編號以及工資和:
select deptno,sum(sal) from emp group by deptno having sum(sal)>9000;
使用having在分組之後加條件.
where和having都可以加條件?
1.where在分組之前加條件.
2.having在分組之後加條件.
where的效率要遠遠高於having. 分組本身消耗資源非常大.
//----------------------------------------------以下是分頁相關知識---------------------------------------------------------------------------------------
LIMIT(MySQL方言) (必須掌握)
LIMIT用來限定查詢結果的起始行,以及總行數。
1>查詢5行記錄,起始行從0開始
select * from emp limit 0,5;
2> 查詢10行記錄,起始行從3開始
select * from emp limit 3,10;
3>如果一頁記錄為5條,希望查看第3頁記錄應該怎麽查呢?
? 第一頁記錄起始行為0,一共查詢5行;
select * from emp limit 0,5;
? 第二頁記錄起始行為5,一共查詢5行;
select * from emp limit 5,5;
? 第三頁記錄起始行為10,一共查詢5行;
select * from emp limit 10,5;

Mysql學習第三天