创建表: CREATE TABLE tb_dept ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(18), description VARCHAR(200) ); 注:最后一个元素后不加逗号。 #建表最后建立约束(在表内建约束) CREATE TABLE tb_emp ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(18) NOT NULL,#非空约束 sex VARCHAR(2), age INT , address VARCHAR(200), email VARCHAR(100) UNIQUE ,#唯一约束 dept_id INT, #constraint foreign key 外键名[表名+约束名](外键)references 主表(字段) CONSTRAINT FOREIGN KEY tb_emp_fk(dept_id) REFERENCES tb_dept(id) ); INSERT INTO tb_emp(NAME,sex, age, address, email,dept_id) VALUES('a','男',22,'dfdf','[email protected]',1); #修改列类型:alter table 表名 modify 列名 列类型; #增加列 alter table 表名 add 列名 列类型; #删除列 alter table 表名 drop 列名; #列改名 alter table 表名 change 旧列明 新列名 列类型 ALTER TABLE tb_dept CHANGE dept_id id INT ; #更改表名 alter table 表名 rename 新表名 #在表外建立约束 CREATE TABLE tb_emp ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(18) NOT NULL,#非空约束 sex VARCHAR(2), age INT , address VARCHAR(200), email VARCHAR(100) UNIQUE ,#唯一约束 dept_id INT ); ALTER TABLE tb_emp ADD CONSTRAINT FOREIGN KEY tb_emp_fk(dept_id) REFERENCES tb_dept(id); #删除约束 修改非空约束 ALTER TABLE 表名 MODIFY 字段 字段类型 ALTER TABLE tb_emp MODIFY NAME VARCHAR(18) #删除唯一约束 ALTER TABLE tb_emp DROP INDEX email #删除主键约束 注意自动增长不能删除 ALTER TABLE tb_emp MODIFY id INT ALTER TABLE tb_emp DROP PRIMARY KEY #删除外键约束 ALTER TABLE tb_emp DROP FOREIGN KEY tb_emp_ibfk_1 INSERT INTO tb_emp(NAME,dept_id) VALUES ('as',1); INSERT INTO tb_emp(NAME,sex, age, address, email,dept_id) VALUES('a','男',22,'dfdf','[email protected]',1); #查询数据必须先插入tb_dept数据,因为tb_emp有外键约束 #insert into table [(column[,column....])]values (value[,value...]); #1.指明字段进行插入,注意字段和值数量和类型都需匹配 INSERT INTO tb_dept(NAME, description)VALUES('开发部','负责软件开发工作'); #2.如果插入的values是所有字段,可以不必显示写插入的字段名,不推荐 INSERT INTO tb_dept(2,NAME, description)VALUES('开发部','负责软件开发工作'); #auto_increment会记住曾经生成的值 INSERT INTO tb_dept(NAME,description)VALUES('市场部','负责市场调研'); #3.一次插入多条记录 INSERT INTO tb_dept(NAME,description) VALUES('财务部','负责财务工作'), ('市场部','负责市场调研'), ('采购部','负责采购工作'); #4.可以从一张表中插入数据 #创建一张表和tb_dept的结构一样,通过这种方式建表只是复制表结构,不复制约束 CREATE TABLE tb_dept2 SELECT *FROM tb_dept #where id=99 INSERT INTO tb_dept2(id,NAME,description) SELECT id,NAME,description FROM tb_dept INSERT INTO tb_emp(NAME,sex,age,address,email,dept_id) VALUES('Sam','男',26,'ad','[email protected]',1); --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #更新update table set column=value[,column=value][wherecondition]; #where 后面建议使用主键或者唯一键,主键最好,因为与业务无关 UPDATE tb_emp SET age=23 WHERE id=1; UPDATE tb_emp SET sex='女' WHERE id=1; UPDATE 0FILE SET remarknum='3' WHERE id=1; SELECT remarknum FROM 0FILE WHERE id=1 #删除 delete[from] table [where econdition] DELETE FROM tb_emp;#删除表中所有数据 DELETE FROM tb_emp WHERE id=1; DELETE FROM tb_emp WHERE NAME='Tom' DELETE FROM USER WHERE username='wanglixue' SELECT id FROM tb_emp WHERE username='Mary' #截断表,DDL语句,删除所有表数据 TRUNCATE TABLE tb_emp; /* 1.delete删除数据,保留表结构,可以回滚,如果数据量大,很慢。回滚就是备份删除的数据。 2.truncate删除所有数据,保留表结构,不可以回滚,一次删除所有数据,速度相对很快 3.drop删除数据和表结构,删除速度最快 */ #修改提交方式(1是自动提交,0是手动提交) SET autocommit=0; #查询语句:select{*,column [alias],...}from table; SELECT NAME,age,sex FROM tb_emp SELECT * FROM tb_emp #*表示所有的列 #算术表达式 SELECT NAME,age,age+5 FROM tb_emp; #null和0还有空字符串不是一个概念 SELECT *FROM tb_emp; SELECT *FROM tb_emp WHERE NAME=0; SELECT *FROM tb_emp WHERE NAME IS NULL; #列的别名 SELECT NAME '姓名',sex'性别',age'年龄',address '地址',email'邮箱',dept_id'部门编号' FROM tb_emp; /*缺省情况下查询显示所有行,包括重复行*/ SELECT age FROM tb_emp; /*使用distinct关键字可从查询结果中清除重复行*/ SELECT DISTINCT age FROM tb_emp; #distinct的作用范围是后面所有字段的组合 SELECT DISTINCT sex,age FROM tb_emp WHERE age=26; #使用where语句限定返回的记录 SELECT *FROM tb_emp WHERE NAME='Lucy'; #比较运算符,使用between运算符显示某一值域范围的记录,包含最大值和最小值 SELECT * FROM tb_emp WHERE age BETWEEN 20 AND 25; #使用in运算符获得匹配列表值得记录 SELECT * FROM tb_emp WHERE age IN (26); /*使用like运算符执行模糊查询,查询条件可包含文字字符或数字 (%)可表示零或多个字符 (_)可表示一个字符 */ SELECT * FROM tb_emp WHERE NAME LIKE'L%'; #and 需要所有条件都满足,or只要满足一个条件就行 not取反,可以通过()控制优先级别 SELECT *FROM tb_emp WHERE age>24 AND NAME LIKE 'L%'; SELECT *FROM USER WHERE username='王丽雪' AND authority='1' #排序 按照年龄从高到低排序 SELECT *FROM tb_emp ORDER BY age DESC; #按照年龄从低到高排序 SELECT *FROM tb_emp ORDER BY age ASC; --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 函数 #concat(str1,str2...) 连接 SELECT CONCAT(NAME,address) FROM tb_emp; #upper(str) 转为大写字母 lower(str)转换为小写字母 SELECT UPPER(NAME) FROM tb_emp WHERE age=26; #返回字符串长度length(str) SELECT LENGTH(NAME) FROM tb_emp WHERE age=23; #substr(str,num,len)返回字符串str从num位置开始长度为len的字符串 SELECT SUBSTR(NAME,2,2) FROM tb_emp WHERE age=26; #返回当前时间 SELECT NOW(); #查询入职时间是1981年2月 SELECT *FROM tb_emp WHERE YEAR(hiredate)=1981 AND MONTH(hiredate)=2; #插入时间 INSERT INTO tb_emp(NAME,job,hiredate,sal) VALUES('周杰伦','天王','2011-12-14',10000); INSERT INTO tb_emp(NAME,job,hiredate,sal) VALUES('周杰伦','天王','2011-12-14',10000); INSERT INTO tb_emp(NAME,job,hiredate,sal) VALUES('蔡依林','小天后',NOW(),23345); #ifnull(第一个值,第二个值)函数,如果字段不为空,则直接返回该值,如果为空,取第二个值 SELECT age,IFNULL(age,18)AS 年龄 FROM tb_emp; #if函数,如果字段不为null,则取第二个值,如果为空,取第三个值 SELECT NAME,IF(age,19,18)AS 年龄 FROM tb_emp; /*case when value then result else default end 如果value是真,返回result,否则返回default */ /*case when value1 then result1 when value2 then result2 else default end */ SELECT NAME CASE WHEN age IS NULL THEN 18 ELSE age END FROM tb_emp; #聚合函数 SELECT AVG(age) FROM tb_emp #平均数 SELECT SUM(age) FROM tb_emp #和 SELECT MAX(age) FROM tb_emp #最大值 SELECT MIN(age) FROM tb_emp #最小值 SELECT COUNT(*) FROM tb_emp #count不统计null,统计的是记录数 #分组统计 #每个部门的平均工资 SELECT deptno, AVG(sal) FROM tb_emp GROUP BY deptno #每个部门的员工数 SELECT deptno, COUNT(*) FROM tb_emp GROUP BY deptno /* 如果使用了分组函数,或者使用group by的查询,出现在select列表中的字段,要么出现在组合函数里,要么出现在group by子句中 group by子句的字段可以不出现在select列表中 */ #分组后加条件使用having,where 和having都是来做条件限定的,但是having只能在group by之后。where是在分组之前进行条件查询,having是在分组之后进行条件查询的。 SELECT age,sex FROM tb_emp GROUP BY age HAVING age>18 ORDER BY age AS #limit,常用来做分页 SELECT ... LIMIT offset_start ,ROW_COUNT; offset_start:第一个返回记录行的偏移量,默认为零 ROW_COUNT:要返回记录行的最大数目 SELECT *FROM tb_emp LIMIT 3;#检索前三个记录 SELECT *FROM tb_emp LIMIT 3,4;#检索记录行4-7 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 子查询 #多表连接查询 #交叉连接 SELECT COUNT(*) FROM tb_emp;#7 SELECT COUNT(*) FROM tb_dept;#4 SELECT COUNT(*) FROM tb_emp,tb_dept;#28 #标准写法 SELECT COUNT(*) FROM tb_emp CROSS JOIN tb_dept; #内连接 连接条件是主外键关联 SELECT COUNT(*)FROM tb_emp e,tb_dept d WHERE e.`dept_id`=d.`id`FROM #标准写法 SELECT * FROM tb_dept INNER JOIN tb_emp ON tb_dept.`id`=tb_emp.`dept_id` #在外连接中,某些不满足条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行 #左外连接,左边的表做主表,左边的表记录全部显示,如果没有找到记录则补null SELECT *FROM tb_dept LEFT JOIN tb_emp ON tb_dept.`id`=tb_emp.`dept_id` #右连接和左连接相反 SELECT *FROM tb_dept RIGHT JOIN tb_emp ON tb_dept.`id`=tb_emp.`dept_id` #子查询 SELECT *FROM tb_emp WHERE id=(SELECT id FROM tb_emp WHERE NAME='Lily') #in 与列表中的任一成员相等(等于子查询的任意一个结果) SELECT *FROM tb_emp WHERE age IN(SELECT age FROM tb_emp WHERE NAME='Tom') SELECT PASSWORD FROM USER WHERE username=(SELECT username FROM USER WHERE authority='1')