Mysql基础

一、sql语句

1.操作数据库
(1)创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] …]
create_specification:   
[DEFAULT] CHARACTER SET charset_name  | [DEFAULT] COLLATE collation_name

	~创建一个名称为mydb1的数据库。
	    create database mydb1;
	~创建一个使用gbk字符集的mydb2数据库。
	    create database mydb2 character set gbk;
	~创建一个使用utf8字符集,并带校对规则的mydb3数据库。
	    create database mydb3 character set utf-8 collate utf8_bin;
(2)查看数据库
	显示数据库语句:
		SHOW DATABASES
	显示数据库创建语句:
		SHOW CREATE DATABASE db_name

           ~查看当前数据库服务器中的所有数据库 
		show databases;
       ~查看前面创建的mydb2数据库的定义信息
		show create database mydb2;
(3)修改数据库
	ALTER  DATABASE  [IF NOT EXISTS] db_name  [alter_specification [, alter_specification] ...] 
	alter_specification:    
	    [DEFAULT] CHARACTER SET charset_name  |   [DEFAULT] COLLATE collation_name
	
	~查看服务器中的数据库,并把其中mydb2字符集修改为utf8
	alter database mydb2 character set utf8;
(4)删除数据库
	DROP DATABASE  [IF EXISTS]  db_name 
	
	~删除前面创建的mydb1数据库 drop database mydb1;
	drop database mydb1;
(5)选择数据库
	进入数据库:use db_name;
	查看当前所选的数据库: select database();

2.操作表
(1)创建表
CREATE TABLE table_name
(
field1 datatype,
field2 datatype,
field3 datatype,
)[character set 字符集] [collate 校对规则]
field:指定列名 datatype:指定列类型

	~创建一个员工表employee 
		create table employee(
			id int primary key auto_increment,
			name varchar(20) unique,
			gender bit not null,
			birthday date,
			entry_date date,
			job varchar(40),
			salary double,
			resume text
		);
(2)查看表
	查看表结构:desc tabName
	查看当前数据库中所有表:show tables
	查看当前数据库表建表语句 show create table tabName;
	从表中选取数据:SELECT 列名称 FROM 表名称;
			SELECT * FROM 表名称;


(3)修改表
	ALTER TABLE tablename  ADD/MODIFY/DROP/CHARACTER SET/CHANGE  (column datatype [DEFAULT expr][, column datatype]...);
	*修改表的名称:rename table 表名 to 新表名;

	~在上面员工表的基本上增加一个image列。
		alter table employee add image blob;
	~修改job列,使其长度为60。
		alter table employee modify job varchar(60);
	~删除gender列。
		alter table employee drop gender;
	~表名改为user。
		rename table employee to user;
	~修改表的字符集为gbk
		alter table user character set gbk;
	~列名name修改为username
		alter table user change name username varchar(20);
	~修改表名
		alter table 旧表名 rename 新表名;
(4)删除表
	DROP TABLE tab_name;

	~删除user表
		drop table user;

3.操作表记录CRUD
(1)INSERT
INSERT INTO table [(column [, column…])] VALUES (value [, value…]);

	插入的数据应与字段的数据类型相同。
	数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
	在values中列出的数据位置必须与被加入的列的排列位置相对应。
	字符和日期型数据应包含在单引号中。
	插入空值:不指定或insert into table value(null)
	如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表

	**查看服务器所认为的字符集编码:show variables like 'character%';(查看系统变量)
	**通知服务器当前这边客户端的编码集为gbk:set names gbk;(只能通知当前客户端,换了客户端就不行了)
						//可在mysql中的my.ini配置文件中的default—character配置项中修改默认字符集编码(要重启mysql服务)
	**在服务器端有个转码的过程

	~使用insert语句向表中插入三个员工的信息
	insert into employee (id,name,gender,birthday,entry_date,job,salary,resume)values (null,'张飞',1,'1999-09-09','1999-10-01','打手',998.0,'老大的三弟,真的很能打');
	insert into employee values (null,'关羽',1,'1998-08-08','1998-10-01','财神爷',9999999.00,'老大的二弟,公司挣钱都指着他了');
	insert into employee values (null,'刘备',0,'1990-01-01','1991-01-01','ceo',100000.0,'公司的老大'),(null,'赵云',1,'2000-01-01','2001-01-01','保镖',1000.0,'老大贴身人');
(2)UPDATE
	UPDATE 	tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]  
	
	UPDATE语法可以用新值更新原有表行中的各列。
	SET子句指示要修改哪些列和要给予哪些值。
	WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行
	

	~将所有员工薪水修改为5000元。
		update employee set salary = 5000;
	~将姓名为’张飞’的员工薪水修改为3000元。
		update employee set salary = 3000 where name='张飞';
	~将姓名为’关羽’的员工薪水修改为4000元,job改为ccc。
		update employee set salary=4000,job='ccc' where name='关羽';
	~将刘备的薪水在原有基础上增加1000元。	
		update employee set salary=salary+1000 where name='刘备';
	
	  
(3)DELETE
	
	如果不使用where子句,将删除表中所有数据。
	Delete语句不能删除某一列的值(可使用update)
	使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
	同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。
		外键约束
	删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,参看mysql文档。


	delete from tbl_name [WHERE where_definition]    
	~删除表中名称为’张飞’的记录。
		delete from employee where name='张飞';
	~删除表中所有记录。
		delete from employee;(只是逐条删除表记录,表还在,删除表用drop)
	~使用truncate删除表中记录。
		truncate table employee;(原理:摧毁整张表,然后重新创建原表)//与delete删除不同的是,如果id中有计数器,用delete删除后再插入,id随着之前的值自增,不会从新来
(4)SELECT
	~1.基本查询
		SELECT [DISTINCT] *|{column1, column2. column3..} FROM	table;
		**distinct;过滤掉重复行信息
		
		~查询表中所有学生的信息。
			select * from exam;
		~查询表中所有学生的姓名和对应的英语成绩。
			select name,english from exam;
		~过滤表中重复数据(去掉重复行)
			select distinct english from exam;
		~在所有学生分数上加10分特长分显示。
			select name , math+10,english+10,chinese+10 from exam;(数据库中真实数据没有变,只是显示的时候加了十分做了显示,要修改数据库数据,只能用update)
		~统计每个学生的总分。
			select name ,english+math+chinese from exam;
		使用别名表示学生总分。
			select name as 姓名 ,english+math+chinese as 总成绩 from exam;
			select name 姓名 ,english+math+chinese 总成绩 from exam;(使用as关键字或者不写都可以设置别名)
		select name english from exam;

	~2.使用where子句进行过滤查询
		~查询姓名为张飞的学生成绩
			select * from exam where name='张飞';
		~查询英语成绩大于90分的同学
			select * from exam where english > 90;
		~查询总分大于230分的所有同学
			select name 姓名,math+english+chinese 总分 from exam where math+english+chinese>230;
		~查询英语分数在 80-100之间的同学。
			select * from exam where english between 80 and 100;
		~查询数学分数为75,76,77的同学。
			select * from exam where math in(75,76,77);
		~查询所有姓张的学生成绩。
			select * from exam where name like '张%'; (张后面跟0个或多个字符)
			select * from exam where name like '张__';(张后面跟_个字符)
		~查询数学分>70,语文分>80的同学。
			select * from exam where math>70 and chinese>80;

	~3.使用order by关键字对查询结果进行排序操作
		SELECT column1, column2. column3.. FROM	table where... order by column asc|desc;
		asc 升序 -- 默认就是升序
		desc 降序

		~对语文成绩排序后输出。
			select name,chinese from exam order by chinese desc;
		~对总分排序按从高到低的顺序输出
			select name 姓名,chinese+math+english 总成绩 from exam order by 总成绩 desc;
		~对姓张的学生成绩排序输出
			select name 姓名,chinese+math+english 总成绩 from exam where name like '张%' order by 总成绩 desc;
	~4.聚合函数
		(1)Count -- 用来统计符合条件的行的个数
			~统计一个班级共有多少学生?
				select count(*) from exam;
			~统计数学成绩大于90的学生有多少个?
				select count(*) from exam where math>70;
			~统计总分大于230的人数有多少?
				select count(*)from exam where math+english+chinese > 230;
		(2)SUM -- 用来将符合条件的记录的指定列进行求和操作
			~统计一个班级数学总成绩?
				select sum(math) from exam;
			~统计一个班级语文、英语、数学各科的总成绩
				select sum(math),sum(english),sum(chinese) from exam;
			~统计一个班级语文、英语、数学的成绩总和
				select sum(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
				在执行计算时,只要有null参与计算,整个null所在行的值均为null
				此时可以用ifnull函数进行处理(将所在列中有null的值替换为0)
			~统计一个班级语文成绩平均分
				select sum(chinese)/count(*) 语文平均分 from exam;
		(3)AVG -- 用来计算符合条件记录的指定列的值的平均值
			~求一个班级数学平均分?
				select avg(math) from exam;
			~求一个班级总分平均分?
				select avg(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

		(4)MAX/MIN -- 用来获取符合条件的所有记录指定列的最大值和最小值
			~求班级最高分和最低分
				select max(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
				select min(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
	~5.分组查询
		~对订单表中商品归类后,显示每一类商品的总价
			select product,sum(price) from orders group by product;
		~询购买了几类商品,并且每类总价大于100的商品
			select product 商品名,sum(price)商品总价 from orders group by product having sum(price)>100;(where只能对分组之前进行过滤,分组之后用having进一步过滤)
			
		where子句和having子句的区别:
			where子句在分组之前进行过滤having子句在分组之后进行过滤
			having子句中可以使用聚合函数,where子句中不能使用
			很多情况下使用where子句的地方可以使用having子句进行替代

		~查询单价小于100而总价大于150的商品的名称
			select product from orders where price<100 group by product having sum(price)>150;

		

	~~sql语句书写顺序: 
		select from where groupby having orderby
	~~sql语句执行顺序:
		from where select group by having order by    


	
	~~备份恢复数据库
		备份:	在cmd窗口下 mysqldump -u root -p dbName>c:/1.sql
		恢复:	方式1:在cmd窗口下 mysql -u root -p dbName<c:/1.sql
			方式2:在mysql命令下, source c:/1.sql
			要注意恢复数据只能恢复数据本身,数据库没法恢复,需要先自己创建出数据后才能进行恢复.

二、多表设计多表查询
1.外键约束
表是用来保存显示生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,向这种约束就叫做外键约束

	create table dept(
		id int primary key auto_increment,
		name varchar(20)
	);
	insert into dept values(null,'财务部'),(null,'人事部'),(null,'销售部'),(null,'行政部');

	create table emp(
		id int primary key auto_increment,
		name varchar(20),
		dept_id int,
		foreign key(dept_id) references dept(id)
	);
	insert into emp values(null,'奥巴马',1),(null,'哈利波特',2),(null,'本拉登',3),(null,'朴乾',3);

2.多表设计
	一对多:在多的一方保存一的一方的主键做为外键
	一对一:在任意一方保存另一方的主键作为外键
	多对多:创建第三方关系表保存两张表的主键作为外键,保存他们对应关系

3.多表查询
	笛卡尔积查询:
		将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用
		select * from dept,emp;
		
	内连接查询:查询的是左边表和右边表都能找到对应记录的记录
		select * from dept,emp where dept.id = emp.dept_id;
		select * from dept inner join emp on dept.id=emp.dept_id;
	
	外连接查询:
		左外连接查询:在内连接的基础上增加左边表有而右边表没有的记录
			select * from dept left join emp on dept.id=emp.dept_id;
		
		右外连接查询:在内连接的基础上增加右边表有而左边表没有的记录
			select * from dept right join emp on dept.id=emp.dept_id;
		全外连接查询:在内连接的基础上增加左边表有而右边表没有的记录和右边表有而左表表没有的记录
			select * from dept full join emp on dept.id=emp.dept_id; -- mysql不支持全外连接
			可以使用union关键字模拟全外连接:
			select * from dept left join emp on dept.id = emp.dept_id
			union
			select * from dept right join emp on dept.id = emp.dept_id;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值