赞
踩
数据库通常分为两种:
关系型数据库
和非关系型数据库
,关系型数据库通常会建立很多二维数据表
,形成一对一、一对多、多对多等关系;之后利用SQL
语句查询我们所需要的数据;非关系型数据库基于Key-Value
的对应关系,并且查询的过程中不需要经过SQL解析
。
在公司中,使用关系型数据库较多,其中非关系型数据库更多的是用在爬取数据中。
学习mysql更多的是学习SQL语句,SQL语句是我们与数据库沟通的语言
数据定义语言,可以通过DDL语句对数据库或者表进行创建、删除、修改等操作
数据操作语言,可以通过DML语句对表进行添加、删除、修改等操作
数据查询语言,可以通过DQL从数据库中查询记录
数据控制语言,对数据库、表格的权限进行相关访问操作
在SQL的学习中DQL语句是重点内容,需要特别学习,同时也需要知道基本的数据库、表的增删改查操作
-- 查看当前数据库中有那些表 SHOW TABLES; -- 查看某一张表的表结构 DESC t_singer; -- 创建一张新的表(如果不存在) CREATE TABLE IF NOT EXISTS `users`( name VARCHAR(10), age INT, height DOUBLE ); -- 删除一个表(如果表存在) DROP TABLE IF EXISTS `users`; -- 创建一个完整的表结构 -- 默认值为0 DEFAULT(0) -- 唯一且不为空 UNIQUE NOT NULL CREATE TABLE IF NOT EXISTS `users`( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) UNIQUE NOT NULL, level INT DEFAULT(0), telPhone VARCHAR(20) UNIQUE ); -- 修改表结构 -- 修改表名字 ALTER TABLE `users` RENAME `t_users`; -- 添加新字段(createTime TIMESTAMP类型) ALTER TABLE `t_users` ADD createTime TIMESTAMP; ALTER TABLE `t_users` ADD updateTime TIMESTAMP; -- 修改字段名称(修改createTime为createAt DATETIME类型) ALTER TABLE `t_users` CHANGE createTime createAt DATETIME; -- 删除某一个字段 ALTER TABLE `t_users` DROP updateTime; -- 修改某一字段的类型(将id改为bigint类型) ALTER TABLE `t_users` MODIFY id BIGINT;
CREATE TABLE IF NOT EXISTS `products`( `id` INT PRIMARY KEY AUTO_INCREMENT, `title` VARCHAR(20), `description` VARCHAR(200), `price` DOUBLE, `publishTime` DATETIME ); -- 插入数据 INSERT INTO `products` (title,description,price,publishTime) VALUES ('苹果','苹果只要998',998,'2122-09-10'); INSERT INTO `products` (title,description,price,publishTime) VALUES ('香蕉','香蕉只要888',888,'2123-09-10'); INSERT INTO `products` (title,description,price,publishTime) VALUES ('栗子','栗子只要666',666,'2127-06-06'); -- 删除数据(全部删除) -- DELETE FROM `products` -- 删除某条数据 DELETE FROM `products` WHERE id=5; -- 修改数据(表中全部数据) UPDATE `products` SET price=8888; -- 修改数据(根据条件修改某一条数据) UPDATE `products` SET price=8888 WHERE id=6; UPDATE `products` SET price=8888,title='栗子好吃' WHERE id=6; -- 当修改某一条数据时,使用最新的时间记录 ALTER TABLE `products` ADD `updateTime` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
CREATE TABLE IF NOT EXISTS `t_products` ( id INT PRIMARY KEY AUTO_INCREMENT, brand VARCHAR(20), title VARCHAR(100) NOT NULL, price DOUBLE NOT NULL, score DECIMAL (2,1), voteCnt INT, URL VARCHAR(100), pid INT ); -- 基本查询 -- 查询所有数据的所有字段 SELECT * FROM `t_products`; -- 查询所有字段,并且指定对应的字段 SELECT id,brand,title,price FROM `t_products`; -- 查询字段后给字段重命名(起一个别名 AS可以省略) SELECT id AS phoneId,brand AS phoneBrand,title AS phoneTitle,price AS phonePrice FROM `t_products`; -- WHERE的比较运算符 SELECT * FROM `t_products` WHERE price <1000; -- 大于等于 SELECT * FROM `t_products` WHERE price >=3000; -- 等于 SELECT * FROM `t_products` WHERE price =2699; -- 查询所有品牌 SELECT * FROM `t_products` WHERE brand='栗子'; -- 查询不是苹果品牌 SELECT * FROM `t_products` WHERE brand!='苹果'; -- 查询brand为华为,并且价格小于2000的手机 SELECT * FROM `t_products` WHERE brand='栗子' && price<3000; SELECT * FROM `t_products` WHERE brand='栗子' AND price<3000; -- 查询华为手机或价格大于5000的手机 SELECT * FROM `t_products` WHERE brand='栗子' || price>5000; SELECT * FROM `t_products` WHERE brand='栗子' OR price>5000; -- 查询区间范围 SELECT * FROM `t_products` WHERE price>=1000 && price<=2000; SELECT * FROM `t_products` WHERE price BETWEEN 1000 AND 2000; -- 枚举多个结果,其中之一 小米或华为 SELECT * FROM `t_products` WHERE brand ='香蕉' OR brand ='栗子'; SELECT * FROM `t_products` WHERE brand IN ('香蕉','栗子'); -- 模糊查询 -- 查询所有title以v开头的商品 SELECT * FROM `t_products` WHERE title LIKE 'v%'; -- 查询所有title中带v的商品 SELECT * FROM `t_products` WHERE title LIKE '%v%'; -- 查询所有title带M,并且M必须是第三个字符 SELECT * FROM `t_products` WHERE title LIKE '__M%'; -- 对结果进行排序 -- 查询所有价格大于1000的产品,并且按照评分的降序获取结果 SELECT * FROM `t_products` WHERE price>1000 ORDER BY score DESC; SELECT * FROM `t_products` WHERE price>1000 ORDER BY score ASC; -- 分页查询(查询20条数据从41条开始查找) SELECT * FROM `t_products` LIMIT 20 OFFSET 40;
-- 计算华为手机的平均价格 SELECT AVG(price) FROM `t_products` WHERE brand='栗子'; -- 计算华为手机的平均分数 SELECT AVG(score) AS miAvgScore FROM `t_products` WHERE brand='香蕉'; -- 选择手机中评分最高/最低的分数 SELECT MAX(score) FROM `t_products`; SELECT MIN(score) FROM `t_products`; -- 计算所有手机一共有多少投票 SELECT SUM(voteCnt) from `t_products`; -- 计算一共有多少商品(填*的原因是因为填写其他字段可能为空) SELECT COUNT(*) FROM `t_products`; -- 计算华为 SELECT COUNT(*) FROM `t_products` WHERE brand='栗子'; -- 计算华为手机的平均价格 SELECT AVG(price) FROM `t_products` WHERE brand='香蕉'; -- 计算华为手机的平均分数 SELECT AVG(score) AS miAvgScore FROM `t_products` WHERE brand='香蕉'; -- 选择手机中评分最高/最低的分数 SELECT MAX(score) FROM `t_products`; SELECT MIN(score) FROM `t_products`; -- 计算所有手机一共有多少投票 SELECT SUM(voteCnt) from `t_products`; -- 计算一共有多少商品(填*的原因是因为填写其他字段可能为空) SELECT COUNT(*) FROM `t_products`; -- 计算华为 SELECT COUNT(*) FROM `t_products` WHERE brand='栗子'; -- GROUP BY 对数据根据品牌进行分组ROUND(AVG(score),2)保留两位小数 SELECT brand, MAX( price ) maxPrice, MIN( price ) minPrice, ROUND( AVG( price ), 2 ) avgPrice, ROUND( AVG( score ), 2 ) avgScore FROM `t_products` GROUP BY brand HAVING avgScore>7 AND avgPrice>4000; -- 对分组查询结果进行约束(平均分大于7的并且平均价格大于4000的)
基本的查询语句就这么多,查询语句也包含左连接、右连接等操作,篇幅有限,下次分享,剩下的就来分享我遇到的一些问题。
在刚学mysql的时候,需要连接数据库,之前我在navicat连接过我本地的数据库,但是由于时间比较长,我把密码忘了,那样就没法使用代码连接到数据库了,经过百度,我找到了使用navicat查看数据库密码的一个操作。
<?php class NavicatPassword { protected $version = 0; protected $aesKey = 'libcckeylibcckey'; protected $aesIv = 'libcciv libcciv '; protected $blowString = '3DC5CA39'; protected $blowKey = null; protected $blowIv = null; public function __construct($version = 12) { $this->version = $version; $this->blowKey = sha1('3DC5CA39', true); $this->blowIv = hex2bin('d9c7c3c8870d64bd'); } public function encrypt($string) { $result = FALSE; switch ($this->version) { case 11: $result = $this->encryptEleven($string); break; case 12: $result = $this->encryptTwelve($string); break; default: break; } return $result; } protected function encryptEleven($string) { $round = intval(floor(strlen($string) / 8)); $leftLength = strlen($string) % 8; $result = ''; $currentVector = $this->blowIv; for ($i = 0; $i < $round; $i++) { $temp = $this->encryptBlock($this->xorBytes(substr($string, 8 * $i, 8), $currentVector)); $currentVector = $this->xorBytes($currentVector, $temp); $result .= $temp; } if ($leftLength) { $currentVector = $this->encryptBlock($currentVector); $result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector); } return strtoupper(bin2hex($result)); } protected function encryptBlock($block) { return openssl_encrypt($block, 'BF-ECB', $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING); } protected function decryptBlock($block) { return openssl_decrypt($block, 'BF-ECB', $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING); } protected function xorBytes($str1, $str2) { $result = ''; for ($i = 0; $i < strlen($str1); $i++) { $result .= chr(ord($str1[$i]) ^ ord($str2[$i])); } return $result; } protected function encryptTwelve($string) { $result = openssl_encrypt($string, 'AES-128-CBC', $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv); return strtoupper(bin2hex($result)); } public function decrypt($string) { $result = FALSE; switch ($this->version) { case 11: $result = $this->decryptEleven($string); break; case 12: $result = $this->decryptTwelve($string); break; default: break; } return $result; } protected function decryptEleven($upperString) { $string = hex2bin(strtolower($upperString)); $round = intval(floor(strlen($string) / 8)); $leftLength = strlen($string) % 8; $result = ''; $currentVector = $this->blowIv; for ($i = 0; $i < $round; $i++) { $encryptedBlock = substr($string, 8 * $i, 8); $temp = $this->xorBytes($this->decryptBlock($encryptedBlock), $currentVector); $currentVector = $this->xorBytes($currentVector, $encryptedBlock); $result .= $temp; } if ($leftLength) { $currentVector = $this->encryptBlock($currentVector); $result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector); } return $result; } protected function decryptTwelve($upperString) { $string = hex2bin(strtolower($upperString)); return openssl_decrypt($string, 'AES-128-CBC', $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv); } }; $navicatPassword = new NavicatPassword(12); $decode = $navicatPassword->decrypt('复制出来的密码'); echo $decode."\n"; ?>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。